From: Matt Corallo Date: Wed, 3 Feb 2021 01:28:01 +0000 (-0500) Subject: Handle `uintptr_t`s better in JNI bindings X-Git-Tag: v0.0.1~1 X-Git-Url: http://git.bitcoin.ninja/index.cgi?p=ldk-java;a=commitdiff_plain;h=e89532158935ae8f50afa790feea9d525d976ded Handle `uintptr_t`s better in JNI bindings This fixes bugs building for 32-bit platforms as the JNI functions would expect `uintptr_t`s (32-bit) but Java expects a long (64-bit). We can't just replace them all with int64_ts as we need to have `uintptr_t`s still in _jcalls functions which we pass function pointers to C. --- diff --git a/gen_type_mapping.py b/gen_type_mapping.py index da23440f..3868daeb 100644 --- a/gen_type_mapping.py +++ b/gen_type_mapping.py @@ -77,7 +77,7 @@ class TypeMappingGenerator: #if ty_info.is_ptr or holds_ref: # ty_info.subty.requires_clone = False ty_info.subty.requires_clone = not ty_info.is_ptr or not holds_ref - if ty_info.subty.rust_obj is not None and ty_info.subty.rust_obj == "LDKChannelMonitor": + if not ty_info.subty.is_native_primitive and ty_info.subty.rust_obj == "LDKChannelMonitor": # We take a Vec of references to ChannelMonitors as input to ChannelManagerReadArgs, if we clone them, # we end up freeing the clones after creating the ChannelManagerReadArgs before calling the read # function itself, resulting in a segfault. Thus, we manually check and ensure we don't clone for @@ -89,7 +89,7 @@ class TypeMappingGenerator: arg_conv = ty_info.rust_obj + " " + arr_name + "_constr;\n" 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" arg_conv = arg_conv + "if (" + arr_name + "_constr." + arr_len + " > 0)\n" - if subty.rust_obj is None: + if subty.is_native_primitive: szof = subty.c_ty else: szof = subty.rust_obj @@ -186,7 +186,7 @@ class TypeMappingGenerator: ret_conv_name = ty_info.var_name + "_conv", to_hu_conv = None, to_hu_conv_name = None, from_hu_conv = None) elif ty_info.var_name == "" and not print_void: # We don't have a parameter name, and want one, just call it arg - if ty_info.rust_obj is not None: + if not ty_info.is_native_primitive: assert(not is_free or ty_info.rust_obj not in self.opaque_structs) return ConvInfo(ty_info = ty_info, arg_name = ty_info.var_name, arg_conv = ty_info.rust_obj + " arg_conv = *(" + ty_info.rust_obj + "*)arg;\nFREE((void*)arg);", @@ -197,7 +197,7 @@ class TypeMappingGenerator: return ConvInfo(ty_info = ty_info, arg_name = ty_info.var_name, arg_conv = None, arg_conv_name = "arg", arg_conv_cleanup = None, ret_conv = None, ret_conv_name = None, to_hu_conv = "TODO 8", to_hu_conv_name = None, from_hu_conv = None) - elif ty_info.rust_obj is None: + elif ty_info.is_native_primitive: return ConvInfo(ty_info = ty_info, arg_name = ty_info.var_name, arg_conv = None, arg_conv_name = ty_info.var_name, arg_conv_cleanup = None, ret_conv = None, ret_conv_name = None, to_hu_conv = None, to_hu_conv_name = None, from_hu_conv = None) diff --git a/genbindings.py b/genbindings.py index be4bc64e..ca88a3aa 100755 --- a/genbindings.py +++ b/genbindings.py @@ -225,7 +225,8 @@ def java_c_types(fn_arg, ret_arr_len): c_ty = "int64_t" fn_arg = fn_arg[8:].strip() else: - c_ty = "intptr_t" + c_ty = "int64_t" + rust_obj = "uintptr_t" fn_arg = fn_arg[9:].strip() is_primitive = True elif is_const and fn_arg.startswith("char *"): @@ -307,7 +308,6 @@ def java_c_types(fn_arg, ret_arr_len): c_ty = consts.ptr_c_ty java_ty = consts.ptr_native_ty fn_ty_arg = "J" - is_primitive = False var_is_arr = var_is_arr_regex.match(fn_arg) if var_is_arr is not None or ret_arr_len is not None: @@ -348,7 +348,7 @@ with open(sys.argv[1]) as in_h: clone_fns.add(reg_fn.group(2)) else: rty = java_c_types(reg_fn.group(1), None) - if rty is not None and rty.rust_obj is not None and reg_fn.group(2) == rty.java_hu_ty + "_new": + if rty is not None and not rty.is_native_primitive and reg_fn.group(2) == rty.java_hu_ty + "_new": constructor_fns[rty.rust_obj] = reg_fn.group(3) continue arr_fn = fn_ret_arr_regex.match(line)