@@ -47,7 +47,6 @@ def _do_map_type_with_info(self, ty_info, print_void, ret_arr_len, is_free, hold
4747 (set_pfx , set_sfx ) = self .consts .set_native_arr_contents (arr_name + "_arr" , arr_len , ty_info )
4848 ret_conv = ("int8_tArray " + arr_name + "_arr = " + self .consts .create_native_arr_call (arr_len , ty_info ) + ";\n " + set_pfx , "" )
4949 arg_conv_cleanup = None
50- from_hu_conv = None
5150 if not arr_len .isdigit ():
5251 arg_conv = ty_info .rust_obj + " " + arr_name + "_ref;\n "
5352 arg_conv = arg_conv + arr_name + "_ref." + arr_len + " = " + self .consts .get_native_arr_len_call [0 ] + arr_name + self .consts .get_native_arr_len_call [1 ] + ";\n "
@@ -65,26 +64,34 @@ def _do_map_type_with_info(self, ty_info, print_void, ret_arr_len, is_free, hold
6564 ret_conv = (ret_conv [0 ], ret_conv [1 ] + pfx + arr_name + "_var." + ty_info .arr_access + sfx + ";" )
6665 if not holds_ref and ty_info .rust_obj != "LDKu8slice" :
6766 ret_conv = (ret_conv [0 ], ret_conv [1 ] + "\n " + ty_info .rust_obj .replace ("LDK" , "" ) + "_free(" + arr_name + "_var);" )
67+ from_hu_conv = self .consts .primitive_arr_from_hu (ty_info .subty , None , arr_name )
68+ to_hu_conv = self .consts .primitive_arr_to_hu (ty_info .subty , None , arr_name , arr_name + "_conv" )
6869 elif ty_info .rust_obj is not None :
6970 arg_conv = ty_info .rust_obj + " " + arr_name + "_ref;\n "
7071 arg_conv = arg_conv + "CHECK(" + self .consts .get_native_arr_len_call [0 ] + arr_name + self .consts .get_native_arr_len_call [1 ] + " == " + arr_len + ");\n "
7172 arg_conv = arg_conv + self .consts .get_native_arr_contents (arr_name , arr_name + "_ref." + ty_info .arr_access , arr_len , ty_info , True ) + ";"
7273 ret_conv = (ret_conv [0 ], "." + ty_info .arr_access + set_sfx + ";" )
73- from_hu_conv = ("InternalUtils.check_arr_len(" + arr_name + ", " + arr_len + ")" , "" )
74+ from_hu_conv = self .consts .primitive_arr_from_hu (ty_info .subty , arr_len , arr_name )
75+ to_hu_conv = self .consts .primitive_arr_to_hu (ty_info .subty , None , arr_name , arr_name + "_conv" )
7476 else :
7577 arg_conv = "unsigned char " + arr_name + "_arr[" + arr_len + "];\n "
7678 arg_conv = arg_conv + "CHECK(" + self .consts .get_native_arr_len_call [0 ] + arr_name + self .consts .get_native_arr_len_call [1 ] + " == " + arr_len + ");\n "
7779 arg_conv = arg_conv + self .consts .get_native_arr_contents (arr_name , arr_name + "_arr" , arr_len , ty_info , True ) + ";\n "
7880 arg_conv = arg_conv + "unsigned char (*" + arr_name + "_ref)[" + arr_len + "] = &" + arr_name + "_arr;"
7981 ret_conv = (ret_conv [0 ] + "*" , set_sfx + ";" )
80- from_hu_conv = ("InternalUtils.check_arr_len(" + arr_name + ", " + arr_len + ")" , "" )
82+ from_hu_conv = self .consts .primitive_arr_from_hu (ty_info .subty , arr_len , arr_name )
83+ to_hu_conv = self .consts .primitive_arr_to_hu (ty_info .subty , None , arr_name , arr_name + "_conv" )
84+ to_hu_conv_name = None
85+ if to_hu_conv is not None :
86+ to_hu_conv_name = arr_name + "_conv"
8187 return ConvInfo (ty_info = ty_info , arg_name = ty_info .var_name ,
8288 arg_conv = arg_conv , arg_conv_name = arr_name + "_ref" , arg_conv_cleanup = arg_conv_cleanup ,
83- ret_conv = ret_conv , ret_conv_name = arr_name + "_arr" , to_hu_conv = None , to_hu_conv_name = None ,
89+ ret_conv = ret_conv , ret_conv_name = arr_name + "_arr" ,
90+ to_hu_conv = to_hu_conv , to_hu_conv_name = to_hu_conv_name ,
8491 from_hu_conv = from_hu_conv )
8592 else :
8693 assert not arr_len .isdigit () # fixed length arrays not implemented
87- assert ty_info .java_ty [len (ty_info .java_ty ) - 2 :] == "[]"
94+ assert ty_info .java_hu_ty [len (ty_info .java_hu_ty ) - 2 :] == "[]"
8895 if arr_name == "" :
8996 arr_name = "ret"
9097 conv_name = arr_name + "_conv_" + str (len (ty_info .java_hu_ty ))
@@ -183,24 +190,30 @@ def _do_map_type_with_info(self, ty_info, print_void, ret_arr_len, is_free, hold
183190 to_hu_conv = None
184191 to_hu_conv_name = None
185192 if subty .to_hu_conv is not None :
186- to_hu_conv = self .consts .var_decl_statement (ty_info .java_hu_ty , conv_name + "_arr" , self .consts .constr_hu_array (ty_info , arr_name + ".length" ))
187- to_hu_conv += ";\n " + self .consts .for_n_in_range (idxc , "0" , arr_name + ".length" ) + "\n "
188- to_hu_conv += "\t " + self .consts .var_decl_statement (subty .java_ty , conv_name , arr_name + "[" + idxc + "]" ) + ";\n "
193+ to_hu_conv = self .consts .var_decl_statement (self .consts .c_type_map ["uint32_t" ][0 ], conv_name + "_len" , self .consts .get_java_arr_len (arr_name )) + ";\n "
194+ to_hu_conv += self .consts .var_decl_statement (ty_info .java_hu_ty , conv_name + "_arr" , self .consts .constr_hu_array (ty_info , conv_name + "_len" ))
195+ to_hu_conv += ";\n " + self .consts .for_n_in_range (idxc , "0" , conv_name + "_len" ) + "\n "
196+ to_hu_conv += "\t " + self .consts .var_decl_statement (subty .java_ty , conv_name , self .consts .get_java_arr_elem (subty , arr_name , idxc )) + ";\n "
189197 to_hu_conv += "\t " + subty .to_hu_conv .replace ("\n " , "\n \t " ) + "\n "
190198 to_hu_conv += "\t " + conv_name + "_arr[" + idxc + "] = " + subty .to_hu_conv_name + ";\n }"
191199 to_hu_conv_name = conv_name + "_arr"
192- from_hu_conv = None
200+ from_hu_conv = self . consts . primitive_arr_from_hu ( ty_info . subty , None , arr_name )
193201 if subty .from_hu_conv is not None :
194202 hu_conv_b = ""
195203 if subty .from_hu_conv [1 ] != "" :
196204 iterator = self .consts .for_n_in_arr (conv_name , arr_name , subty )
197205 hu_conv_b = iterator [0 ] + subty .from_hu_conv [1 ] + ";" + iterator [1 ]
198- from_hu_conv = (self .consts .map_hu_array_elems (arr_name , conv_name , ty_info , subty ), hu_conv_b )
206+ if from_hu_conv is not None :
207+ arr_conv = self .consts .primitive_arr_from_hu (ty_info .subty , None , self .consts .map_hu_array_elems (arr_name , conv_name , ty_info , subty ))
208+ assert arr_conv [1 ] == ""
209+ from_hu_conv = (arr_conv [0 ], hu_conv_b )
210+ else :
211+ from_hu_conv = (self .consts .map_hu_array_elems (arr_name , conv_name , ty_info , subty ), hu_conv_b )
199212
200213 return ConvInfo (ty_info = ty_info , arg_name = ty_info .var_name ,
201214 arg_conv = arg_conv , arg_conv_name = arg_conv_name , arg_conv_cleanup = arg_conv_cleanup ,
202215 ret_conv = ret_conv , ret_conv_name = arr_name + "_arr" , to_hu_conv = to_hu_conv , to_hu_conv_name = to_hu_conv_name , from_hu_conv = from_hu_conv )
203- elif ty_info .java_ty == "String" :
216+ elif ty_info .java_fn_ty_arg == "Ljava/lang/ String; " :
204217 assert not is_nullable
205218 if not is_free :
206219 arg_conv = "LDKStr " + ty_info .var_name + "_conv = " + self .consts .str_ref_to_c_call (ty_info .var_name ) + ";"
@@ -209,6 +222,7 @@ def _do_map_type_with_info(self, ty_info, print_void, ret_arr_len, is_free, hold
209222 arg_conv = "LDKStr dummy = { .chars = NULL, .len = 0, .chars_is_owned = false };"
210223 arg_conv_name = "dummy"
211224 if ty_info .arr_access is None :
225+ assert False
212226 return ConvInfo (ty_info = ty_info , arg_name = ty_info .var_name ,
213227 arg_conv = arg_conv , arg_conv_name = arg_conv_name , arg_conv_cleanup = None ,
214228 ret_conv = ("const char* " + ty_info .var_name + "_str = " ,
@@ -219,11 +233,17 @@ def _do_map_type_with_info(self, ty_info, print_void, ret_arr_len, is_free, hold
219233 free_str = ""
220234 if not holds_ref :
221235 free_str = "\n Str_free(" + ty_info .var_name + "_str);"
236+ to_hu_conv = self .consts .str_to_hu_conv (ty_info .var_name )
237+ to_hu_conv_name = None
238+ if to_hu_conv is not None :
239+ to_hu_conv_name = ty_info .var_name + "_conv"
222240 return ConvInfo (ty_info = ty_info , arg_name = ty_info .var_name ,
223241 arg_conv = arg_conv , arg_conv_name = arg_conv_name , arg_conv_cleanup = None ,
224242 ret_conv = ("LDKStr " + ty_info .var_name + "_str = " ,
225243 ";\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 ),
226- ret_conv_name = ty_info .var_name + "_conv" , to_hu_conv = None , to_hu_conv_name = None , from_hu_conv = None )
244+ ret_conv_name = ty_info .var_name + "_conv" ,
245+ to_hu_conv = to_hu_conv , to_hu_conv_name = to_hu_conv_name ,
246+ from_hu_conv = self .consts .str_from_hu_conv (ty_info .var_name ))
227247 elif ty_info .var_name == "" and not print_void :
228248 # We don't have a parameter name, and want one, just call it arg
229249 if not ty_info .is_native_primitive :
@@ -534,9 +554,12 @@ def _do_map_type_with_info(self, ty_info, print_void, ret_arr_len, is_free, hold
534554 to_hu_conv = self .consts .var_decl_statement (ty_info .java_hu_ty , "ret_hu_conv" , "new " + ty_info .java_hu_ty + "(null, " + ty_info .var_name + ")" ) + ";\n " + self .consts .add_ref ("ret_hu_conv" , "this" ) + ";" ,
535555 to_hu_conv_name = "ret_hu_conv" ,
536556 from_hu_conv = (ty_info .var_name + " == null ? 0 : " + self .consts .get_ptr (ty_info .var_name ), self .consts .add_ref ("this" , ty_info .var_name )))
557+ ret_conv = ("uint64_t ret_" + ty_info .var_name + " = (uint64_t)" , ";" )
558+ if holds_ref :
559+ ret_conv = (ret_conv [0 ], " | 1;" )
537560 return ConvInfo (ty_info = ty_info , arg_name = ty_info .var_name ,
538561 arg_conv = ty_info .rust_obj + "* " + ty_info .var_name + "_conv = (" + ty_info .rust_obj + "*)(" + ty_info .var_name + " & ~1);" ,
539562 arg_conv_name = ty_info .var_name + "_conv" , arg_conv_cleanup = None ,
540- ret_conv = ( "uint64_t ret_" + ty_info . var_name + " = (uint64_t)" , ";" ) , ret_conv_name = "ret_" + ty_info .var_name ,
563+ ret_conv = ret_conv , ret_conv_name = "ret_" + ty_info .var_name ,
541564 to_hu_conv = "TODO 3" , to_hu_conv_name = None , from_hu_conv = None ) # its a pointer, no conv needed
542565 assert False # We should have handled every case by now.
0 commit comments