@@ -87,38 +87,45 @@ def map_type_with_info(self, ty_info, print_void, ret_arr_len, is_free, holds_re
8787 ty_info .subty .requires_clone = False
8888 subty = self .map_type_with_info (ty_info .subty , False , None , is_free , holds_ref )
8989 arg_conv = ty_info .rust_obj + " " + arr_name + "_constr;\n "
90- arg_conv = arg_conv + arr_name + "_constr." + arr_len + " = " + self .consts .get_native_arr_len_call [0 ] + arr_name + self .consts .get_native_arr_len_call [1 ] + ";\n "
91- arg_conv = arg_conv + "if (" + arr_name + "_constr." + arr_len + " > 0)\n "
90+ pf = ""
91+ if ty_info .is_ptr :
92+ pf = "\t "
93+ arg_conv += ty_info .rust_obj + " *" + arr_name + "_ptr = NULL;\n "
94+ arg_conv += "if (" + self .consts .is_arr_some_check [0 ] + arr_name + self .consts .is_arr_some_check [1 ] + ") {\n "
95+ arg_conv += pf + arr_name + "_constr." + arr_len + " = " + self .consts .get_native_arr_len_call [0 ] + arr_name + self .consts .get_native_arr_len_call [1 ] + ";\n "
96+ arg_conv += pf + "if (" + arr_name + "_constr." + arr_len + " > 0)\n "
9297 if subty .is_native_primitive :
9398 szof = subty .c_ty
9499 else :
95100 szof = subty .rust_obj
96- arg_conv = arg_conv + "\t " + arr_name + "_constr." + ty_info .arr_access + " = MALLOC(" + arr_name + "_constr." + arr_len + " * sizeof(" + szof + "), \" " + ty_info .rust_obj + " Elements\" );\n "
97- arg_conv = arg_conv + "else\n "
98- arg_conv = arg_conv + "\t " + arr_name + "_constr." + ty_info .arr_access + " = NULL;\n "
101+ arg_conv += pf + "\t " + arr_name + "_constr." + ty_info .arr_access + " = MALLOC(" + arr_name + "_constr." + arr_len + " * sizeof(" + szof + "), \" " + ty_info .rust_obj + " Elements\" );\n "
102+ arg_conv += pf + "else\n "
103+ arg_conv += pf + "\t " + arr_name + "_constr." + ty_info .arr_access + " = NULL;\n "
99104 get_arr = self .consts .get_native_arr_contents (arr_name , "NO_DEST" , arr_name + "_constr." + arr_len , ty_info , False )
100105 if get_arr != None :
101- arg_conv = arg_conv + subty .c_ty + "* " + arr_name + "_vals = " + get_arr + ";\n "
102- arg_conv = arg_conv + "for (size_t " + idxc + " = 0; " + idxc + " < " + arr_name + "_constr." + arr_len + "; " + idxc + "++) {\n "
106+ arg_conv += pf + subty .c_ty + "* " + arr_name + "_vals = " + get_arr + ";\n "
107+ arg_conv += pf + "for (size_t " + idxc + " = 0; " + idxc + " < " + arr_name + "_constr." + arr_len + "; " + idxc + "++) {\n "
103108 if get_arr != None :
104- arg_conv = arg_conv + "\t " + subty .c_ty + " " + conv_name + " = " + arr_name + "_vals[" + idxc + "];"
109+ arg_conv += pf + "\t " + subty .c_ty + " " + conv_name + " = " + arr_name + "_vals[" + idxc + "];"
105110 if subty .arg_conv is not None :
106- arg_conv = arg_conv + "\n \t " + subty .arg_conv .replace ("\n " , "\n \t " )
111+ arg_conv += "\n \t " + pf + subty .arg_conv .replace ("\n " , "\n \t " + pf )
107112 else :
108- arg_conv = arg_conv + "\t " + subty .c_ty + " " + conv_name + " = " + self .consts .get_native_arr_elem (arr_name , idxc , ty_info ) + ";\n "
109- arg_conv = arg_conv + "\t " + subty .arg_conv .replace ("\n " , "\n \t " )
110- arg_conv = arg_conv + "\n \t " + arr_name + "_constr." + ty_info .arr_access + "[" + idxc + "] = " + subty .arg_conv_name + ";\n }"
113+ arg_conv += pf + "\t " + subty .c_ty + " " + conv_name + " = " + self .consts .get_native_arr_elem (arr_name , idxc , ty_info ) + ";\n "
114+ arg_conv += pf + "\t " + subty .arg_conv .replace ("\n " , "\n \t " + pf )
115+ arg_conv += "\n \t " + pf + arr_name + "_constr." + ty_info .arr_access + "[" + idxc + "] = " + subty .arg_conv_name + ";\n " + pf + " }"
111116 if get_arr != None :
112117 cleanup = self .consts .cleanup_native_arr_ref_contents (arr_name , arr_name + "_vals" , arr_name + "_constr." + arr_len , ty_info )
113118 if cleanup is not None :
114- arg_conv = arg_conv + "\n " + cleanup + ";"
119+ arg_conv += "\n " + pf + cleanup + ";"
115120 if ty_info .is_ptr :
116- arg_conv_name = "&" + arr_name + "_constr "
121+ arg_conv_name = arr_name + "_ptr "
117122 else :
118123 arg_conv_name = arr_name + "_constr"
119124 arg_conv_cleanup = None
120125 if ty_info .is_ptr :
121- arg_conv_cleanup = "FREE(" + arr_name + "_constr." + ty_info .arr_access + ");"
126+ arg_conv_cleanup = "if (" + arr_name + "_ptr != NULL) { FREE(" + arr_name + "_constr." + ty_info .arr_access + "); }"
127+ if ty_info .is_ptr :
128+ arg_conv += "\n \t " + arr_name + "_ptr = &" + arr_name + "_constr;\n }"
122129
123130 ret_conv = (ty_info .rust_obj + " " + arr_name + "_var = " , "" )
124131 if subty .ret_conv is None :
@@ -159,11 +166,11 @@ def map_type_with_info(self, ty_info, print_void, ret_arr_len, is_free, holds_re
159166 from_hu_conv = None
160167 if subty .from_hu_conv is not None :
161168 if subty .java_ty == "long" and subty .java_hu_ty != "long" :
162- from_hu_conv = (" Arrays.stream(" + arr_name + ").mapToLong(" + conv_name + " -> " + subty .from_hu_conv [0 ] + ").toArray()" , "/* TODO 2 " + subty .java_hu_ty + " */" )
169+ from_hu_conv = (arr_name + " != null ? Arrays.stream(" + arr_name + ").mapToLong(" + conv_name + " -> " + subty .from_hu_conv [0 ] + ").toArray() : null " , "/* TODO 2 " + subty .java_hu_ty + " */" )
163170 elif subty .java_ty == "long" :
164- from_hu_conv = (" Arrays.stream(" + arr_name + ").map(" + conv_name + " -> " + subty .from_hu_conv [0 ] + ").toArray()" , "/* TODO 2 " + subty .java_hu_ty + " */" )
171+ from_hu_conv = (arr_name + " != null ? Arrays.stream(" + arr_name + ").map(" + conv_name + " -> " + subty .from_hu_conv [0 ] + ").toArray() : null " , "/* TODO 2 " + subty .java_hu_ty + " */" )
165172 else :
166- from_hu_conv = (" Arrays.stream(" + arr_name + ").map(" + conv_name + " -> " + subty .from_hu_conv [0 ] + ").toArray(" + ty_info .java_ty + "::new)" , "/* TODO 2 " + subty .java_hu_ty + " */" )
173+ from_hu_conv = (arr_name + " != null ? Arrays.stream(" + arr_name + ").map(" + conv_name + " -> " + subty .from_hu_conv [0 ] + ").toArray(" + ty_info .java_ty + "::new) : null " , "/* TODO 2 " + subty .java_hu_ty + " */" )
167174
168175 return ConvInfo (ty_info = ty_info , arg_name = ty_info .var_name ,
169176 arg_conv = arg_conv , arg_conv_name = arg_conv_name , arg_conv_cleanup = arg_conv_cleanup ,
@@ -183,10 +190,13 @@ def map_type_with_info(self, ty_info, print_void, ret_arr_len, is_free, holds_re
183190 ret_conv_name = ty_info .var_name + "_conv" ,
184191 to_hu_conv = None , to_hu_conv_name = None , from_hu_conv = None )
185192 else :
193+ free_str = ""
194+ if not holds_ref :
195+ free_str = "\n Str_free(" + ty_info .var_name + "_str);"
186196 return ConvInfo (ty_info = ty_info , arg_name = ty_info .var_name ,
187197 arg_conv = arg_conv , arg_conv_name = arg_conv_name , arg_conv_cleanup = None ,
188198 ret_conv = ("LDKStr " + ty_info .var_name + "_str = " ,
189- ";\n jstring " + ty_info .var_name + "_conv = " + self .consts .str_ref_to_native_call (ty_info .var_name + "_str." + ty_info .arr_access , ty_info .var_name + "_str." + ty_info .arr_len ) + ";" ),
199+ ";\n jstring " + ty_info .var_name + "_conv = " + self .consts .str_ref_to_native_call (ty_info .var_name + "_str." + ty_info .arr_access , ty_info .var_name + "_str." + ty_info .arr_len ) + ";" + free_str ),
190200 ret_conv_name = ty_info .var_name + "_conv" , to_hu_conv = None , to_hu_conv_name = None , from_hu_conv = None )
191201 elif ty_info .var_name == "" and not print_void :
192202 # We don't have a parameter name, and want one, just call it arg
@@ -402,7 +412,7 @@ def map_type_with_info(self, ty_info, print_void, ret_arr_len, is_free, holds_re
402412 arg_conv = "" , arg_conv_name = "(LDKu5){ ._0 = " + ty_info .var_name + " }" , arg_conv_cleanup = None ,
403413 ret_conv = ("uint8_t " + ty_info .var_name + "_val = " , "._0;" ), ret_conv_name = ty_info .var_name + "_val" ,
404414 to_hu_conv = ty_info .java_hu_ty + " " + ty_info .var_name + "_conv = new " + ty_info .java_hu_ty + "(" + ty_info .var_name + ");" ,
405- to_hu_conv_name = ty_info .var_name + "_conv" , from_hu_conv = (ty_info .var_name + ".ptr " , "" ))
415+ to_hu_conv_name = ty_info .var_name + "_conv" , from_hu_conv = (ty_info .var_name + ".getVal() " , "" ))
406416
407417 assert ty_info .rust_obj == "LDKTxOut"
408418 if not ty_info .is_ptr and not holds_ref :
0 commit comments