Skip to content

Commit 53b03e8

Browse files
committed
Correct handling of Option<Trait>
1 parent 3b7cb61 commit 53b03e8

File tree

3 files changed

+31
-12
lines changed

3 files changed

+31
-12
lines changed

bindingstypes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
class TypeInfo:
2-
def __init__(self, is_native_primitive, rust_obj, java_ty, java_fn_ty_arg, java_hu_ty, c_ty, is_const, passed_as_ptr, is_ptr, var_name, arr_len, arr_access, subty=None):
2+
def __init__(self, is_native_primitive, rust_obj, java_ty, java_fn_ty_arg, java_hu_ty, c_ty, is_const, passed_as_ptr, is_ptr, nonnull_ptr, var_name, arr_len, arr_access, subty=None):
33
self.is_native_primitive = is_native_primitive
44
self.rust_obj = rust_obj
55
self.java_ty = java_ty
@@ -9,6 +9,7 @@ def __init__(self, is_native_primitive, rust_obj, java_ty, java_fn_ty_arg, java_
99
self.is_const = is_const
1010
self.passed_as_ptr = passed_as_ptr
1111
self.is_ptr = is_ptr
12+
self.nonnull_ptr = nonnull_ptr
1213
self.var_name = var_name
1314
self.arr_len = arr_len
1415
self.arr_access = arr_access

gen_type_mapping.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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 + ");\nret_hu_conv.ptrs_to.add(this);",
433446
to_hu_conv_name = "ret_hu_conv",

genbindings.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ def java_c_types(fn_arg, ret_arr_len):
8888
fn_arg = fn_arg[7:]
8989
if fn_arg.startswith("enum "):
9090
fn_arg = fn_arg[5:]
91+
nonnull_ptr = "NONNULL_PTR" in fn_arg
9192
fn_arg = fn_arg.replace("NONNULL_PTR", "")
9293

9394
is_ptr = False
@@ -172,11 +173,13 @@ def java_c_types(fn_arg, ret_arr_len):
172173
res.pass_by_ref = True
173174
if res.is_native_primitive or res.passed_as_ptr:
174175
return TypeInfo(rust_obj=fn_arg.split(" ")[0], java_ty=res.java_ty + "[]", java_hu_ty=res.java_hu_ty + "[]",
175-
java_fn_ty_arg="[" + res.java_fn_ty_arg, c_ty=res.c_ty + "Array", passed_as_ptr=False, is_ptr=is_ptr, is_const=is_const,
176+
java_fn_ty_arg="[" + res.java_fn_ty_arg, c_ty=res.c_ty + "Array", passed_as_ptr=False, is_ptr=is_ptr,
177+
nonnull_ptr=nonnull_ptr, is_const=is_const,
176178
var_name=res.var_name, arr_len="datalen", arr_access="data", subty=res, is_native_primitive=False)
177179
else:
178180
return TypeInfo(rust_obj=fn_arg.split(" ")[0], java_ty=res.java_ty + "[]", java_hu_ty=res.java_hu_ty + "[]",
179-
java_fn_ty_arg="[" + res.java_fn_ty_arg, c_ty=consts.ptr_arr, passed_as_ptr=False, is_ptr=is_ptr, is_const=is_const,
181+
java_fn_ty_arg="[" + res.java_fn_ty_arg, c_ty=consts.ptr_arr, passed_as_ptr=False, is_ptr=is_ptr,
182+
nonnull_ptr=nonnull_ptr, is_const=is_const,
180183
var_name=res.var_name, arr_len="datalen", arr_access="data", subty=res, is_native_primitive=False)
181184

182185
is_primitive = False
@@ -322,14 +325,16 @@ def java_c_types(fn_arg, ret_arr_len):
322325
if var_is_arr is not None:
323326
if var_is_arr.group(1) == "":
324327
return TypeInfo(rust_obj=rust_obj, java_ty=java_ty, java_hu_ty=java_ty, java_fn_ty_arg="[" + fn_ty_arg, c_ty=c_ty, is_const=is_const,
325-
passed_as_ptr=False, is_ptr=False, var_name="arg", arr_len=var_is_arr.group(2), arr_access=arr_access, is_native_primitive=False)
328+
passed_as_ptr=False, is_ptr=False, nonnull_ptr=nonnull_ptr, var_name="arg",
329+
arr_len=var_is_arr.group(2), arr_access=arr_access, is_native_primitive=False)
326330
return TypeInfo(rust_obj=rust_obj, java_ty=java_ty, java_hu_ty=java_ty, java_fn_ty_arg="[" + fn_ty_arg, c_ty=c_ty, is_const=is_const,
327-
passed_as_ptr=False, is_ptr=False, var_name=var_is_arr.group(1), arr_len=var_is_arr.group(2), arr_access=arr_access, is_native_primitive=False)
331+
passed_as_ptr=False, is_ptr=False, nonnull_ptr=nonnull_ptr, var_name=var_is_arr.group(1),
332+
arr_len=var_is_arr.group(2), arr_access=arr_access, is_native_primitive=False)
328333

329334
if java_hu_ty is None:
330335
java_hu_ty = java_ty
331336
return TypeInfo(rust_obj=rust_obj, java_ty=java_ty, java_hu_ty=java_hu_ty, java_fn_ty_arg=fn_ty_arg, c_ty=c_ty, passed_as_ptr=is_ptr or take_by_ptr,
332-
is_const=is_const, is_ptr=is_ptr, var_name=fn_arg, arr_len=arr_len, arr_access=arr_access, is_native_primitive=is_primitive)
337+
is_const=is_const, is_ptr=is_ptr, nonnull_ptr=nonnull_ptr, var_name=fn_arg, arr_len=arr_len, arr_access=arr_access, is_native_primitive=is_primitive)
333338

334339
fn_ptr_regex = re.compile("^extern const ([A-Za-z_0-9\* ]*) \(\*(.*)\)\((.*)\);$")
335340
fn_ret_arr_regex = re.compile("(.*) \(\*(.*)\((.*)\)\)\[([0-9]*)\];$")
@@ -527,7 +532,7 @@ def map_trait(struct_name, field_var_lines, trait_fn_lines, trait_doc_comment):
527532
# For now, just disable enabling the _call_log - we don't know how to inverse-map String
528533
is_log = fn_line.group(3) == "log" and struct_name == "LDKLogger"
529534
if fn_line.group(3) != "free" and fn_line.group(3) != "clone" and fn_line.group(3) != "eq" and not is_log:
530-
dummy_line = fn_line.group(2) + struct_name.replace("LDK", "") + "_" + fn_line.group(3) + " " + struct_name + "* this_arg" + fn_line.group(5) + "\n"
535+
dummy_line = fn_line.group(2) + struct_name.replace("LDK", "") + "_" + fn_line.group(3) + " " + struct_name + " *NONNULL_PTR this_arg" + fn_line.group(5) + "\n"
531536
map_fn(dummy_line, re.compile("([A-Za-z_0-9]*) *([A-Za-z_0-9]*) *(.*)").match(dummy_line), None, "(this_arg_conv->" + fn_line.group(3) + ")(this_arg_conv->this_arg", fn_docs)
532537
for idx, var_line in enumerate(field_var_lines):
533538
if var_line.group(1) not in trait_structs:
@@ -536,7 +541,7 @@ def map_trait(struct_name, field_var_lines, trait_fn_lines, trait_doc_comment):
536541
write_c("\t\tthis_arg->set_" + var_line.group(2) + "(this_arg);\n")
537542
write_c("\treturn this_arg->" + var_line.group(2) + ";\n")
538543
write_c("}\n")
539-
dummy_line = var_line.group(1) + " " + struct_name.replace("LDK", "") + "_get_" + var_line.group(2) + " " + struct_name + "* this_arg" + fn_line.group(5) + "\n"
544+
dummy_line = var_line.group(1) + " " + struct_name.replace("LDK", "") + "_get_" + var_line.group(2) + " " + struct_name + " *NONNULL_PTR this_arg" + fn_line.group(5) + "\n"
540545
map_fn(dummy_line, re.compile("([A-Za-z_0-9]*) *([A-Za-z_0-9]*) *(.*)").match(dummy_line), None, struct_name + "_set_get_" + var_line.group(2) + "(this_arg_conv", fn_docs)
541546

542547
def map_result(struct_name, res_ty, err_ty):

0 commit comments

Comments
 (0)