- if len(trait_fn_lines) > 0:
- out_java.write("\tpublic interface " + struct_name + " {\n")
- for fn_line in trait_fn_lines:
- if fn_line.group(2) != "free" and fn_line.group(2) != "clone":
- out_java.write("\t\t void " + fn_line.group(2) + "(/* TODO + rtype */);\n")
- out_java.write("\t}\n")
- out_java.write("\tpublic static native long " + struct_name + "_new(" + struct_name + " impl);\n")
-
- out_c.write("typedef struct " + struct_name + "_JCalls {\n")
- out_c.write("\tJNIEnv *env;\n")
- out_c.write("\tjobject o;\n")
- for fn_line in trait_fn_lines:
- if fn_line.group(2) != "free" and fn_line.group(2) != "clone":
- out_c.write("\tjmethodID " + fn_line.group(2) + "_meth;\n")
- out_c.write("} " + struct_name + "_JCalls;\n")
-
- for fn_line in trait_fn_lines:
- if fn_line.group(2) != "free" and fn_line.group(2) != "clone":
- out_c.write("void " + fn_line.group(2) + "_jcall(void* this_arg/* TODO + rtype */) {\n")
- out_c.write("\t" + struct_name + "_JCalls *arg = (" + struct_name + "_JCalls*) this_arg;\n")
- out_c.write("\t(*arg->env)->CallObjectMethod(arg->env, arg->o, arg->" + fn_line.group(2) + "_meth);\n");
- out_c.write("}\n")
- elif fn_line.group(2) == "free":
- out_c.write("void " + struct_name + "_JCalls_free(void* this_arg) {\n")
- out_c.write("\t" + struct_name + "_JCalls *arg = (" + struct_name + "_JCalls*) this_arg;\n")
- out_c.write("\t(*arg->env)->DeleteGlobalRef(arg->env, arg->o);\n")
- out_c.write("\tfree(arg);\n")
- out_c.write("}\n")
- elif fn_line.group(2) == "clone":
- out_c.write("void* " + struct_name + "_JCalls_clone(void* this_arg) {\n")
- out_c.write("\t" + struct_name + "_JCalls *ret = malloc(sizeof(" + struct_name + "_JCalls));\n")
- out_c.write("\tmemcpy(ret, this_arg, sizeof(" + struct_name + "_JCalls));\n")
- out_c.write("\treturn ret;\n")
- out_c.write("}\n")
-
- out_c.write("JNIEXPORT long JNICALL Java_org_ldk_impl_bindings_" + struct_name.replace("_", "_1") + "_1new (JNIEnv * env, jclass _a, jobject o) {\n")
- out_c.write("\tjclass c = (*env)->GetObjectClass(env, o);\n")
- out_c.write("\tassert(c != NULL);\n")
- out_c.write("\t" + struct_name + "_JCalls *calls = malloc(sizeof(" + struct_name + "_JCalls));\n")
- out_c.write("\tcalls->env = env;\n")
- out_c.write("\tcalls->o = (*env)->NewGlobalRef(env, o);\n")
- for fn_line in trait_fn_lines:
- if fn_line.group(2) != "free" and fn_line.group(2) != "clone":
- out_c.write("\tcalls->" + fn_line.group(2) + "_meth = (*env)->GetMethodID(env, c, \"" + fn_line.group(2) + "\", \"" + "TODO" + "\");\n")
- out_c.write("\tassert(calls->" + fn_line.group(2) + "_meth != NULL);\n")
- out_c.write("\n\t" + struct_name + " *ret = malloc(sizeof(" + struct_name + "));\n")
- out_c.write("\tret->this_arg = (void*) calls;\n")
- for fn_line in trait_fn_lines:
- if fn_line.group(2) != "free" and fn_line.group(2) != "clone":
- out_c.write("\tret->" + fn_line.group(2) + " = " + fn_line.group(2) + "_jcall;\n")
- elif fn_line.group(2) == "free":
- out_c.write("\tret->free = " + struct_name + "_JCalls_free;\n")
- else:
- out_c.write("\tret->clone = " + struct_name + "_JCalls_clone;\n")
- out_c.write("\treturn (long)ret;\n")
- out_c.write("}\n\n")
-
- #out_java.write("/* " + "\n".join(field_lines) + "*/\n")
- cur_block_struct = None
- elif in_block_union:
- if line.startswith("} "):
- in_block_union = False
- elif in_block_enum:
- if line.startswith("} "):
- in_block_enum = False
+ with open(f"{sys.argv[3]}/structs/{struct_name.replace('LDK', '')}{consts.file_ext}", "w") as out_java_struct:
+ out_opaque_struct_human = consts.map_opaque_struct(struct_name, last_block_comment)
+ last_block_comment = None
+ out_java_struct.write(out_opaque_struct_human)
+ elif result_contents is not None:
+ assert result_contents in result_ptr_struct_items
+ res_ty, err_ty = result_ptr_struct_items[result_contents]
+ map_result(struct_name, res_ty, err_ty)
+ elif struct_name.startswith("LDKCResult_") and struct_name.endswith("ZPtr"):
+ for line, _ in field_lines:
+ if line.endswith("*result;"):
+ res_ty = line[:-8].strip()
+ elif line.endswith("*err;"):
+ err_ty = line[:-5].strip()
+ result_ptr_struct_items[struct_name] = (res_ty, err_ty)
+ result_types.add(struct_name[:-3])
+ elif is_tuple:
+ map_tuple(struct_name, field_lines)
+ elif vec_ty is not None:
+ ty_info = type_mapping_generator.map_type(vec_ty + " arr_elem", False, None, False, False)
+ if ty_info.is_native_primitive:
+ clone_fns.add(struct_name.replace("LDK", "") + "_clone")
+ write_c("static inline " + struct_name + " " + struct_name.replace("LDK", "") + "_clone(const " + struct_name + " *orig) {\n")
+ write_c("\t" + struct_name + " ret = { .data = MALLOC(sizeof(" + ty_info.c_ty + ") * orig->datalen, \"" + struct_name + " clone bytes\"), .datalen = orig->datalen };\n")
+ write_c("\tmemcpy(ret.data, orig->data, sizeof(" + ty_info.c_ty + ") * ret.datalen);\n")
+ write_c("\treturn ret;\n}\n")
+ elif (ty_info.rust_obj.replace("LDK", "") + "_clone") in clone_fns:
+ ty_name = "CVec_" + ty_info.rust_obj.replace("LDK", "") + "Z";
+ clone_fns.add(ty_name + "_clone")
+ write_c("static inline " + struct_name + " " + ty_name + "_clone(const " + struct_name + " *orig) {\n")
+ write_c("\t" + struct_name + " ret = { .data = MALLOC(sizeof(" + ty_info.rust_obj + ") * orig->datalen, \"" + struct_name + " clone bytes\"), .datalen = orig->datalen };\n")
+ write_c("\tfor (size_t i = 0; i < ret.datalen; i++) {\n")
+ write_c("\t\tret.data[i] = " + ty_info.rust_obj.replace("LDK", "") + "_clone(&orig->data[i]);\n")
+ write_c("\t}\n\treturn ret;\n}\n")
+ elif is_union_enum:
+ assert(struct_name.endswith("_Tag"))
+ struct_name = struct_name[:-4]
+ union_enum_items[struct_name] = {"field_lines": field_lines}
+ elif struct_name.endswith("_Body") and struct_name.split("_")[0] in union_enum_items:
+ enum_var_name = struct_name.split("_")
+ union_enum_items[enum_var_name[0]][enum_var_name[1]] = field_lines
+ elif struct_name in union_enum_items:
+ tuple_variants = {}
+ elem_items = -1
+ for line, _ in field_lines:
+ if line == " struct {":
+ elem_items = 0
+ elif line == " };":
+ elem_items = -1
+ elif elem_items > -1:
+ line = line.strip()
+ if line.startswith("struct "):
+ line = line[7:]
+ elif line.startswith("enum "):
+ line = line[5:]
+ split = line.split(" ")
+ assert len(split) == 2
+ tuple_variants[split[1].strip(";")] = split[0]
+ elem_items += 1
+ if elem_items > 1:
+ # We don't currently support tuple variant with more than one element
+ assert False
+ map_complex_enum(struct_name, union_enum_items[struct_name], tuple_variants, last_block_comment)
+ last_block_comment = None
+ elif is_unitary_enum:
+ map_unitary_enum(struct_name, field_lines, last_block_comment)
+ last_block_comment = None
+ elif len(trait_fn_lines) > 0:
+ map_trait(struct_name, field_var_lines, trait_fn_lines, last_block_comment)
+ elif struct_name == "LDKTxOut":
+ with open(f"{sys.argv[3]}/structs/TxOut{consts.file_ext}", "w") as out_java_struct:
+ out_java_struct.write(consts.hu_struct_file_prefix)
+ out_java_struct.write("public class TxOut extends CommonBase{\n")
+ out_java_struct.write("\t/** The script_pubkey in this output */\n")
+ out_java_struct.write("\tpublic final byte[] script_pubkey;\n")
+ out_java_struct.write("\t/** The value, in satoshis, of this output */\n")
+ out_java_struct.write("\tpublic final long value;\n")
+ out_java_struct.write("\n")
+ out_java_struct.write("\tTxOut(java.lang.Object _dummy, long ptr) {\n")
+ out_java_struct.write("\t\tsuper(ptr);\n")
+ out_java_struct.write("\t\tthis.script_pubkey = bindings.TxOut_get_script_pubkey(ptr);\n")
+ out_java_struct.write("\t\tthis.value = bindings.TxOut_get_value(ptr);\n")
+ out_java_struct.write("\t}\n")
+ out_java_struct.write("\tpublic TxOut(long value, byte[] script_pubkey) {\n")
+ out_java_struct.write("\t\tsuper(bindings.TxOut_new(script_pubkey, value));\n")
+ out_java_struct.write("\t\tthis.script_pubkey = bindings.TxOut_get_script_pubkey(ptr);\n")
+ out_java_struct.write("\t\tthis.value = bindings.TxOut_get_value(ptr);\n")
+ out_java_struct.write("\t}\n")
+ out_java_struct.write("\n")
+ out_java_struct.write("\t@Override @SuppressWarnings(\"deprecation\")\n")
+ out_java_struct.write("\tprotected void finalize() throws Throwable {\n")
+ out_java_struct.write("\t\tsuper.finalize();\n")
+ out_java_struct.write("\t\tif (ptr != 0) { bindings.TxOut_free(ptr); }\n")
+ out_java_struct.write("\t}\n")
+ out_java_struct.write("\n")
+ out_java_struct.write("}")
+ fn_line = "struct LDKCVec_u8Z TxOut_get_script_pubkey (struct LDKTxOut* thing)"
+ write_c(fn_line + " {")
+ write_c("\treturn CVec_u8Z_clone(&thing->script_pubkey);")
+ write_c("}")
+ map_fn(fn_line + "\n", re.compile("(.*) (TxOut_get_script_pubkey) \((.*)\)").match(fn_line), None, None, None)
+ fn_line = "uint64_t TxOut_get_value (struct LDKTxOut* thing)"
+ write_c(fn_line + " {")
+ write_c("\treturn thing->value;")
+ write_c("}")
+ map_fn(fn_line + "\n", re.compile("(.*) (TxOut_get_value) \((.*)\)").match(fn_line), None, None, None)
+ else:
+ pass # Everything remaining is a byte[] or some form
+ cur_block_obj = None