Handle `uintptr_t`s better in JNI bindings
authorMatt Corallo <git@bluematt.me>
Wed, 3 Feb 2021 01:28:01 +0000 (20:28 -0500)
committerMatt Corallo <git@bluematt.me>
Wed, 3 Feb 2021 01:50:44 +0000 (20:50 -0500)
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.

gen_type_mapping.py
genbindings.py

index da23440f413115471842b3098ecbbed8eb1cd790..3868daebda47112766907d7053c6ac579c1fdd1b 100644 (file)
@@ -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)
index be4bc64ef4c29221f2aac10a5b50413768c722b5..ca88a3aa989fe43792e5521cf7e6d2d264902cd6 100755 (executable)
@@ -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)