From: Matt Corallo Date: Mon, 3 Oct 2022 20:07:28 +0000 (+0000) Subject: [TS] Fix generation for traits that have supertraits X-Git-Tag: v0.0.111.0^2~6 X-Git-Url: http://git.bitcoin.ninja/index.cgi?p=ldk-java;a=commitdiff_plain;h=d49139b59dab2df2b92ceed54386be652c9b1cb2 [TS] Fix generation for traits that have supertraits When we have a trait with a supertrait, we have to pass both the main- and super-trait instance indxes through to C so that it can call both. We failed to do this, missing an argument entirely when calling the C code. Instead of trying to allocate a new instance index, we opt to store instance indexes in trait structs (assuming there is one) and then reuse the one in the constructed object. --- diff --git a/typescript_strings.py b/typescript_strings.py index 52dd12ce..84dd9a15 100644 --- a/typescript_strings.py +++ b/typescript_strings.py @@ -871,7 +871,7 @@ export enum {struct_name} {{ else: bindings_instantiator += ", " + first_to_lower(var.arg_name) else: - bindings_instantiator += ", " + first_to_lower(var[1]) + ".bindings_instance" + bindings_instantiator += ", " + first_to_lower(var[1]) + ".instance_idx" super_instantiator += first_to_lower(var[1]) + "_impl, " pointer_to_adder += "\t\timpl_holder.held.ptrs_to.push(" + first_to_lower(var[1]) + ");\n" impl_constructor_arguments += f", {first_to_lower(var[1])}_impl: {var[0].replace('LDK', '')}Interface" @@ -883,7 +883,7 @@ export enum {struct_name} {{ trait_constructor_arguments += ", " + var.arg_name else: super_constructor_statements += "\t\tconst " + first_to_lower(var[1]) + " = " + var[1] + ".new_impl(" + super_instantiator + ");\n" - trait_constructor_arguments += ", " + first_to_lower(var[1]) + ".bindings_instance" + trait_constructor_arguments += ", " + first_to_lower(var[1]) + ".instance_idx" for suparg in var[2]: if isinstance(suparg, ConvInfo): trait_constructor_arguments += ", " + suparg.arg_name @@ -965,6 +965,9 @@ export class {struct_name.replace("LDK","")} extends CommonBase {{ /* @internal */ public bindings_instance?: bindings.{struct_name}; + /* @internal */ + public instance_idx?: number; + /* @internal */ constructor(_dummy: object, ptr: bigint) {{ super(ptr, bindings.{struct_name.replace("LDK","")}_free); @@ -976,9 +979,10 @@ export class {struct_name.replace("LDK","")} extends CommonBase {{ const impl_holder: {struct_name}Holder = new {struct_name}Holder(); let structImplementation = {{ {out_interface_implementation_overrides} }} as bindings.{struct_name}; -{super_constructor_statements} const ptr: bigint = bindings.{struct_name}_new(structImplementation{bindings_instantiator}); +{super_constructor_statements} const ptr_idx: [bigint, number] = bindings.{struct_name}_new(structImplementation{bindings_instantiator}); - impl_holder.held = new {struct_name.replace("LDK", "")}(null, ptr); + impl_holder.held = new {struct_name.replace("LDK", "")}(null, ptr_idx[0]); + impl_holder.held.instance_idx = ptr_idx[1]; impl_holder.held.bindings_instance = structImplementation; {pointer_to_adder} return impl_holder.held; }} @@ -1001,14 +1005,18 @@ export class {struct_name.replace("LDK","")} extends CommonBase {{ out_typescript_bindings += "}\n\n" + c_call_extra_args = "" out_typescript_bindings += f"/* @internal */\nexport function {struct_name}_new(impl: {struct_name}" for var in flattened_field_var_conversions: if isinstance(var, ConvInfo): out_typescript_bindings += f", {var.arg_name}: {var.java_ty}" + c_call_extra_args += f", {var.arg_name}" else: - out_typescript_bindings += f", {var[1]}: {var[0]}" + out_typescript_bindings += f", {var[1]}: number" + c_call_extra_args += f", {var[1]}" + - out_typescript_bindings += f"""): bigint {{ + out_typescript_bindings += f"""): [bigint, number] {{ if(!isWasmInitialized) {{ throw new Error("initializeWasm() must be awaited first!"); }} @@ -1017,7 +1025,7 @@ export class {struct_name.replace("LDK","")} extends CommonBase {{ if (js_objs[i] == null || js_objs[i] == undefined) {{ new_obj_idx = i; break; }} }} js_objs[i] = new WeakRef(impl); - return wasm.TS_{struct_name}_new(i); + return [wasm.TS_{struct_name}_new(i{c_call_extra_args}), i]; }} """