Skip to content

Commit e3b8d99

Browse files
committed
Handle supertraits with constructor arguments
1 parent aa1fab7 commit e3b8d99

File tree

3 files changed

+69
-31
lines changed

3 files changed

+69
-31
lines changed

genbindings.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def camel_to_snake(s):
6969
unitary_enums = set()
7070
complex_enums = set()
7171
opaque_structs = set()
72-
trait_structs = set()
72+
trait_structs = {}
7373
result_types = set()
7474
tuple_types = {}
7575

@@ -514,12 +514,17 @@ def map_complex_enum(struct_name, union_enum_items, inline_enum_variants, enum_d
514514
def map_trait(struct_name, field_var_lines, trait_fn_lines, trait_doc_comment):
515515
with open(f"{sys.argv[3]}/structs/{struct_name.replace('LDK', '')}{consts.file_ext}", "w") as out_java_trait:
516516
field_var_convs = []
517+
flattened_field_var_convs = []
517518
for var_line in field_var_lines:
518519
if var_line.group(1) in trait_structs:
519-
field_var_convs.append((var_line.group(1), var_line.group(2)))
520+
field_var_convs.append((var_line.group(1), var_line.group(2), trait_structs[var_line.group(1)]))
521+
flattened_field_var_convs.append((var_line.group(1), var_line.group(2), ))
522+
flattened_field_var_convs.extend(trait_structs[var_line.group(1)])
520523
else:
521-
field_var_convs.append(
522-
type_mapping_generator.map_type(var_line.group(1) + " " + var_line.group(2), False, None, False, False))
524+
mapped = type_mapping_generator.map_type(var_line.group(1) + " " + var_line.group(2), False, None, False, False)
525+
field_var_convs.append(mapped)
526+
flattened_field_var_convs.append(mapped)
527+
trait_structs[struct_name] = field_var_convs
523528

524529
field_fns = []
525530
for fn_docs, fn_line in trait_fn_lines:
@@ -534,7 +539,7 @@ def map_trait(struct_name, field_var_lines, trait_fn_lines, trait_doc_comment):
534539
arg_tys.append(arg_conv_info)
535540
field_fns.append(TraitMethInfo(fn_line.group(3), is_const, ret_ty_info, arg_tys, fn_docs))
536541

537-
(out_java_addendum, out_java_trait_addendum, out_c_addendum) = consts.native_c_map_trait(struct_name, field_var_convs, field_fns, trait_doc_comment)
542+
(out_java_addendum, out_java_trait_addendum, out_c_addendum) = consts.native_c_map_trait(struct_name, field_var_convs, flattened_field_var_convs, field_fns, trait_doc_comment)
538543
write_c(out_c_addendum)
539544
out_java_trait.write(out_java_trait_addendum)
540545
out_java.write(out_java_addendum)
@@ -879,7 +884,6 @@ def map_tuple(struct_name, field_lines):
879884
map_unitary_enum(struct_name, field_lines, last_block_comment)
880885
last_block_comment = None
881886
elif len(trait_fn_lines) > 0:
882-
trait_structs.add(struct_name)
883887
map_trait(struct_name, field_var_lines, trait_fn_lines, last_block_comment)
884888
elif struct_name == "LDKTxOut":
885889
with open(f"{sys.argv[3]}/structs/TxOut{consts.file_ext}", "w") as out_java_struct:

java_strings.py

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ def c_constr_native_complex_enum(self, struct_name, variant, c_params):
479479
ret = ret + ", " + param
480480
return ret + ")"
481481

482-
def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comment):
482+
def native_c_map_trait(self, struct_name, field_vars, flattened_field_vars, field_fns, trait_doc_comment):
483483
out_java_trait = ""
484484
out_java = ""
485485

@@ -492,14 +492,14 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
492492
out_java_trait = out_java_trait + "\tfinal bindings." + struct_name + " bindings_instance;\n"
493493
out_java_trait = out_java_trait + "\t" + struct_name.replace("LDK", "") + "(Object _dummy, long ptr) { super(ptr); bindings_instance = null; }\n"
494494
out_java_trait = out_java_trait + "\tprivate " + struct_name.replace("LDK", "") + "(bindings." + struct_name + " arg"
495-
for var in field_vars:
495+
for var in flattened_field_vars:
496496
if isinstance(var, ConvInfo):
497497
out_java_trait = out_java_trait + ", " + var.java_hu_ty + " " + var.arg_name
498498
else:
499499
out_java_trait = out_java_trait + ", bindings." + var[0] + " " + var[1]
500500
out_java_trait = out_java_trait + ") {\n"
501501
out_java_trait = out_java_trait + "\t\tsuper(bindings." + struct_name + "_new(arg"
502-
for var in field_vars:
502+
for var in flattened_field_vars:
503503
if isinstance(var, ConvInfo):
504504
if var.from_hu_conv is not None:
505505
out_java_trait = out_java_trait + ", " + var.from_hu_conv[0]
@@ -509,7 +509,7 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
509509
out_java_trait = out_java_trait + ", " + var[1]
510510
out_java_trait = out_java_trait + "));\n"
511511
out_java_trait = out_java_trait + "\t\tthis.ptrs_to.add(arg);\n"
512-
for var in field_vars:
512+
for var in flattened_field_vars:
513513
if isinstance(var, ConvInfo):
514514
if var.from_hu_conv is not None and var.from_hu_conv[1] != "":
515515
out_java_trait = out_java_trait + "\t\t" + var.from_hu_conv[1].replace("\n", "\n\t\t") + ";\n"
@@ -524,7 +524,7 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
524524

525525
java_trait_constr = "\tprivate static class " + struct_name + "Holder { " + struct_name.replace("LDK", "") + " held; }\n"
526526
java_trait_constr = java_trait_constr + "\tpublic static " + struct_name.replace("LDK", "") + " new_impl(" + struct_name.replace("LDK", "") + "Interface arg"
527-
for var in field_vars:
527+
for var in flattened_field_vars:
528528
if isinstance(var, ConvInfo):
529529
java_trait_constr = java_trait_constr + ", " + var.java_hu_ty + " " + var.arg_name
530530
else:
@@ -593,14 +593,25 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
593593
if isinstance(var, ConvInfo):
594594
java_trait_constr = java_trait_constr + ", " + var.arg_name
595595
else:
596-
java_trait_constr = java_trait_constr + ", " + var[1] + ".new_impl(" + var[1] + "_impl).bindings_instance"
596+
java_trait_constr += ", " + var[1] + ".new_impl(" + var[1] + "_impl"
597+
for suparg in var[2]:
598+
if isinstance(suparg, ConvInfo):
599+
java_trait_constr += ", " + suparg.arg_name
600+
else:
601+
java_trait_constr += ", " + suparg[1]
602+
java_trait_constr += ").bindings_instance"
603+
for suparg in var[2]:
604+
if isinstance(suparg, ConvInfo):
605+
java_trait_constr += ", " + suparg.arg_name
606+
else:
607+
java_trait_constr += ", " + suparg[1]
597608
out_java_trait = out_java_trait + "\t}\n"
598609
out_java_trait = out_java_trait + java_trait_constr + ");\n\t\treturn impl_holder.held;\n\t}\n"
599610

600611
out_java = out_java + "\t}\n"
601612

602613
out_java = out_java + "\tpublic static native long " + struct_name + "_new(" + struct_name + " impl"
603-
for var in field_vars:
614+
for var in flattened_field_vars:
604615
if isinstance(var, ConvInfo):
605616
out_java = out_java + ", " + var.java_ty + " " + var.arg_name
606617
else:
@@ -612,7 +623,7 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
612623
out_c = out_c + "\tatomic_size_t refcnt;\n"
613624
out_c = out_c + "\tJavaVM *vm;\n"
614625
out_c = out_c + "\tjweak o;\n"
615-
for var in field_vars:
626+
for var in flattened_field_vars:
616627
if isinstance(var, ConvInfo):
617628
# We're a regular ol' field
618629
pass
@@ -688,7 +699,7 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
688699
out_c = out_c + "}\n"
689700

690701
out_c = out_c + "static inline " + struct_name + " " + struct_name + "_init (" + self.c_fn_args_pfx + ", jobject o"
691-
for var in field_vars:
702+
for var in flattened_field_vars:
692703
if isinstance(var, ConvInfo):
693704
out_c = out_c + ", " + var.c_ty + " " + var.arg_name
694705
else:
@@ -707,7 +718,7 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
707718
out_c = out_c + "\tcalls->" + fn_name + "_meth = (*env)->GetMethodID(env, c, \"" + fn_name + "\", \"" + java_meth_descr + "\");\n"
708719
out_c = out_c + "\tCHECK(calls->" + fn_name + "_meth != NULL);\n"
709720

710-
for var in field_vars:
721+
for var in flattened_field_vars:
711722
if isinstance(var, ConvInfo) and var.arg_conv is not None:
712723
out_c = out_c + "\n\t" + var.arg_conv.replace("\n", "\n\t") +"\n"
713724
out_c = out_c + "\n\t" + struct_name + " ret = {\n"
@@ -728,24 +739,30 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
728739
out_c = out_c + "\t\t." + var.var_name + " = " + var.var_name + ",\n"
729740
out_c = out_c + "\t\t.set_" + var.var_name + " = NULL,\n"
730741
else:
731-
out_c = out_c + "\t\t." + var[1] + " = " + var[0] + "_init(env, clz, " + var[1] + "),\n"
742+
out_c += "\t\t." + var[1] + " = " + var[0] + "_init(env, clz, " + var[1]
743+
for suparg in var[2]:
744+
if isinstance(suparg, ConvInfo):
745+
out_c = out_c + ", " + suparg.arg_name
746+
else:
747+
out_c = out_c + ", " + suparg[1]
748+
out_c += "),\n"
732749
out_c = out_c + "\t};\n"
733-
for var in field_vars:
750+
for var in flattened_field_vars:
734751
if not isinstance(var, ConvInfo):
735752
out_c = out_c + "\tcalls->" + var[1] + " = ret." + var[1] + ".this_arg;\n"
736753
out_c = out_c + "\treturn ret;\n"
737754
out_c = out_c + "}\n"
738755

739756
out_c = out_c + self.c_fn_ty_pfx + "int64_t " + self.c_fn_name_define_pfx(struct_name + "_new", True) + "jobject o"
740-
for var in field_vars:
757+
for var in flattened_field_vars:
741758
if isinstance(var, ConvInfo):
742759
out_c = out_c + ", " + var.c_ty + " " + var.arg_name
743760
else:
744761
out_c = out_c + ", jobject " + var[1]
745762
out_c = out_c + ") {\n"
746763
out_c = out_c + "\t" + struct_name + " *res_ptr = MALLOC(sizeof(" + struct_name + "), \"" + struct_name + "\");\n"
747764
out_c = out_c + "\t*res_ptr = " + struct_name + "_init(env, clz, o"
748-
for var in field_vars:
765+
for var in flattened_field_vars:
749766
if isinstance(var, ConvInfo):
750767
out_c = out_c + ", " + var.arg_name
751768
else:

typescript_strings.py

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -483,14 +483,14 @@ def c_constr_native_complex_enum(self, struct_name, variant, c_params):
483483
ret = ret + "; (void) " + param
484484
return ret
485485

486-
def native_c_map_trait(self, struct_name, field_var_conversions, field_function_lines, trait_doc_comment):
486+
def native_c_map_trait(self, struct_name, field_var_conversions, flattened_field_var_conversions, field_function_lines, trait_doc_comment):
487487
out_typescript_bindings = "\n\n\n// OUT_TYPESCRIPT_BINDINGS :: MAP_TRAIT :: START\n\n"
488488

489489
constructor_arguments = ""
490490
super_instantiator = ""
491491
pointer_to_adder = ""
492492
impl_constructor_arguments = ""
493-
for var in field_var_conversions:
493+
for var in flattened_field_var_conversions:
494494
if isinstance(var, ConvInfo):
495495
constructor_arguments += f", {first_to_lower(var.arg_name)}?: {var.java_hu_ty}"
496496
impl_constructor_arguments += f", {var.arg_name}: {var.java_hu_ty}"
@@ -568,7 +568,18 @@ def native_c_map_trait(self, struct_name, field_var_conversions, field_function_
568568
if isinstance(var, ConvInfo):
569569
trait_constructor_arguments += ", " + var.arg_name
570570
else:
571-
trait_constructor_arguments += ", " + var[1] + ".new_impl(" + var[1] + "_impl).bindings_instance"
571+
trait_constructor_arguments += ", " + var[1] + ".new_impl(" + var[1] + "_impl"
572+
for suparg in var[2]:
573+
if isinstance(suparg, ConvInfo):
574+
trait_constructor_arguments += ", " + suparg.arg_name
575+
else:
576+
trait_constructor_arguments += ", " + suparg[1]
577+
trait_constructor_arguments += ").bindings_instance"
578+
for suparg in var[2]:
579+
if isinstance(suparg, ConvInfo):
580+
trait_constructor_arguments += ", " + suparg.arg_name
581+
else:
582+
trait_constructor_arguments += ", " + suparg[1]
572583

573584
out_typescript_human = f"""
574585
{self.hu_struct_file_prefix}
@@ -631,7 +642,7 @@ class {struct_name}Holder {{
631642
out_typescript_bindings = out_typescript_bindings + "\t\t}\n\n"
632643

633644
out_typescript_bindings += f"\t\texport function {struct_name}_new(impl: {struct_name}"
634-
for var in field_var_conversions:
645+
for var in flattened_field_var_conversions:
635646
if isinstance(var, ConvInfo):
636647
out_typescript_bindings += f", {var.arg_name}: {var.java_ty}"
637648
else:
@@ -647,7 +658,7 @@ class {struct_name}Holder {{
647658
# Now that we've written out our java code (and created java_meths), generate C
648659
out_c = "typedef struct " + struct_name + "_JCalls {\n"
649660
out_c = out_c + "\tatomic_size_t refcnt;\n"
650-
for var in field_var_conversions:
661+
for var in flattened_field_var_conversions:
651662
if isinstance(var, ConvInfo):
652663
# We're a regular ol' field
653664
pass
@@ -722,7 +733,7 @@ class {struct_name}Holder {{
722733
out_c = out_c + "}\n"
723734

724735
out_c = out_c + "static inline " + struct_name + " " + struct_name + "_init (/*TODO: JS Object Reference */void* o"
725-
for var in field_var_conversions:
736+
for var in flattened_field_var_conversions:
726737
if isinstance(var, ConvInfo):
727738
out_c = out_c + ", " + var.c_ty + " " + var.arg_name
728739
else:
@@ -738,7 +749,7 @@ class {struct_name}Holder {{
738749
out_c = out_c + "\tcalls->" + fn_name + "_meth = (*env)->GetMethodID(env, c, \"" + fn_name + "\", \"" + java_meth_descr + "\");\n"
739750
out_c = out_c + "\tCHECK(calls->" + fn_name + "_meth != NULL);\n"
740751

741-
for var in field_var_conversions:
752+
for var in flattened_field_var_conversions:
742753
if isinstance(var, ConvInfo) and var.arg_conv is not None:
743754
out_c = out_c + "\n\t" + var.arg_conv.replace("\n", "\n\t") +"\n"
744755
out_c = out_c + "\n\t" + struct_name + " ret = {\n"
@@ -759,24 +770,30 @@ class {struct_name}Holder {{
759770
out_c = out_c + "\t\t." + var.var_name + " = " + var.var_name + ",\n"
760771
out_c = out_c + "\t\t.set_" + var.var_name + " = NULL,\n"
761772
else:
762-
out_c = out_c + "\t\t." + var[1] + " = " + var[0] + "_init(" + var[1] + "),\n"
773+
out_c += "\t\t." + var[1] + " = " + var[0] + "_init(" + var[1]
774+
for suparg in var[2]:
775+
if isinstance(suparg, ConvInfo):
776+
out_c += ", " + suparg.arg_name
777+
else:
778+
out_c += ", " + suparg[1]
779+
out_c += "),\n"
763780
out_c = out_c + "\t};\n"
764-
for var in field_var_conversions:
781+
for var in flattened_field_var_conversions:
765782
if not isinstance(var, ConvInfo):
766783
out_c = out_c + "\tcalls->" + var[1] + " = ret." + var[1] + ".this_arg;\n"
767784
out_c = out_c + "\treturn ret;\n"
768785
out_c = out_c + "}\n"
769786

770787
out_c = out_c + self.c_fn_ty_pfx + "long " + self.c_fn_name_define_pfx(struct_name + "_new", True) + "/*TODO: JS Object Reference */void* o"
771-
for var in field_var_conversions:
788+
for var in flattened_field_var_conversions:
772789
if isinstance(var, ConvInfo):
773790
out_c = out_c + ", " + var.c_ty + " " + var.arg_name
774791
else:
775792
out_c = out_c + ", /*TODO: JS Object Reference */ void* " + var[1]
776793
out_c = out_c + ") {\n"
777794
out_c = out_c + "\t" + struct_name + " *res_ptr = MALLOC(sizeof(" + struct_name + "), \"" + struct_name + "\");\n"
778795
out_c = out_c + "\t*res_ptr = " + struct_name + "_init(o"
779-
for var in field_var_conversions:
796+
for var in flattened_field_var_conversions:
780797
if isinstance(var, ConvInfo):
781798
out_c = out_c + ", " + var.arg_name
782799
else:

0 commit comments

Comments
 (0)