@@ -414,10 +414,24 @@ def map_type_with_info(self, ty_info, print_void, ret_arr_len, is_free, holds_re
414414 to_hu_conv_name = ty_info .var_name + "_hu_conv" ,
415415 from_hu_conv = (ty_info .var_name + " == null ? 0 : " + ty_info .var_name + ".ptr & ~1" , "this.ptrs_to.add(" + ty_info .var_name + ")" ))
416416 elif ty_info .rust_obj in self .trait_structs :
417+ if ty_info .nonnull_ptr :
418+ arg_conv = ty_info .rust_obj + "* " + ty_info .var_name + "_conv = (" + ty_info .rust_obj + "*)(((uint64_t)" + ty_info .var_name + ") & ~1);"
419+ arg_conv_name = ty_info .var_name + "_conv"
420+ else :
421+ # We map Option<Trait> as *mut Trait, which we can differentiate from &Trait by the NONNULL_PTR annotation.
422+ # We handle the Option<Trait> case here.
423+ arg_conv = ty_info .rust_obj + " *" + ty_info .var_name + "_conv_ptr = NULL;\n "
424+ arg_conv += "if (" + ty_info .var_name + " != 0) {\n "
425+ arg_conv += "\t " + ty_info .rust_obj + " " + ty_info .var_name + "_conv;\n "
426+ arg_conv += "\t " + ty_info .var_name + "_conv = *(" + ty_info .rust_obj + "*)(((uint64_t)" + ty_info .var_name + ") & ~1);"
427+ arg_conv += self .consts .trait_struct_inc_refcnt (ty_info ).replace ("\n " , "\n \t " )
428+ arg_conv += "\n \t " + ty_info .var_name + "_conv_ptr = MALLOC(sizeof(" + ty_info .rust_obj + "), \" " + ty_info .rust_obj + "\" );\n "
429+ arg_conv += "\t *" + ty_info .var_name + "_conv_ptr = " + ty_info .var_name + "_conv;\n "
430+ arg_conv += "}"
431+ arg_conv_name = ty_info .var_name + "_conv_ptr"
417432 if ty_info .rust_obj .replace ("LDK" , "" ) + "_clone" in self .clone_fns :
418433 return ConvInfo (ty_info = ty_info , arg_name = ty_info .var_name ,
419- arg_conv = ty_info .rust_obj + "* " + ty_info .var_name + "_conv = (" + ty_info .rust_obj + "*)" + ty_info .var_name + ";" ,
420- arg_conv_name = ty_info .var_name + "_conv" , arg_conv_cleanup = None ,
434+ arg_conv = arg_conv , arg_conv_name = arg_conv_name , arg_conv_cleanup = None ,
421435 ret_conv = (ty_info .rust_obj + " *" + ty_info .var_name + "_clone = MALLOC(sizeof(" + ty_info .rust_obj + "), \" " + ty_info .rust_obj + "\" );\n " +
422436 "*" + ty_info .var_name + "_clone = " + ty_info .rust_obj .replace ("LDK" , "" ) + "_clone(" , ");" ),
423437 ret_conv_name = "(long)" + ty_info .var_name + "_clone" ,
@@ -426,8 +440,7 @@ def map_type_with_info(self, ty_info, print_void, ret_arr_len, is_free, holds_re
426440 from_hu_conv = (ty_info .var_name + " == null ? 0 : " + ty_info .var_name + ".ptr" , "this.ptrs_to.add(" + ty_info .var_name + ")" ))
427441 else :
428442 return ConvInfo (ty_info = ty_info , arg_name = ty_info .var_name ,
429- arg_conv = ty_info .rust_obj + "* " + ty_info .var_name + "_conv = (" + ty_info .rust_obj + "*)" + ty_info .var_name + ";" ,
430- arg_conv_name = ty_info .var_name + "_conv" , arg_conv_cleanup = None ,
443+ arg_conv = arg_conv , arg_conv_name = arg_conv_name , arg_conv_cleanup = None ,
431444 ret_conv = ("long ret_" + ty_info .var_name + " = (long)" , ";" ), ret_conv_name = "ret_" + ty_info .var_name ,
432445 to_hu_conv = ty_info .java_hu_ty + " ret_hu_conv = new " + ty_info .java_hu_ty + "(null, " + ty_info .var_name + ");\n ret_hu_conv.ptrs_to.add(this);" ,
433446 to_hu_conv_name = "ret_hu_conv" ,
0 commit comments