)
self.to_hu_conv_templates = dict(
- ptr = '{human_type} {var_name}_hu_conv = new {human_type}(null, {var_name});',
- default = '{human_type} {var_name}_hu_conv = new {human_type}(null, {var_name});'
+ ptr = '{human_type} {var_name}_hu_conv = null; if ({var_name} < 0 || {var_name} > 4096) { {var_name}_hu_conv = new {human_type}(null, {var_name}); }',
+ default = '{human_type} {var_name}_hu_conv = null; if ({var_name} < 0 || {var_name} > 4096) { {var_name}_hu_conv = new {human_type}(null, {var_name}); }'
)
self.bindings_header = """package org.ldk.impl;
self.util_fn_pfx = """package org.ldk.structs;
import org.ldk.impl.bindings;
+import org.ldk.enums.*;
+import org.ldk.util.*;
import java.util.Arrays;
import javax.annotation.Nullable;
-import org.ldk.enums.*;
public class UtilMethods {
"""
self.c_file_pfx = self.c_file_pfx + """#define MALLOC(a, _) malloc(a)
#define FREE(p) if ((uint64_t)(p) > 4096) { free(p); }
#define CHECK_ACCESS(p)
+#define CHECK_INNER_FIELD_ACCESS_OR_NULL(v)
"""
if not DEBUG:
self.c_file_pfx += """#define DO_ASSERT(a) (void)(a)
__real_free(ptr);
}
-static void CHECK_ACCESS(void* ptr) {
+static void CHECK_ACCESS(const void* ptr) {
DO_ASSERT(!pthread_mutex_lock(&allocation_mtx));
allocation* it = allocation_ll;
while (it->ptr != ptr) {
}
DO_ASSERT(!pthread_mutex_unlock(&allocation_mtx));
}
+#define CHECK_INNER_FIELD_ACCESS_OR_NULL(v) \\
+ if (v.is_owned && v.inner != NULL) { \\
+ const void *p = __unmangle_inner_ptr(v.inner); \\
+ if (p != NULL) { \\
+ CHECK_ACCESS(p); \\
+ } \\
+ }
void* __real_realloc(void* ptr, size_t newlen);
void* __wrap_realloc(void* ptr, size_t len) {
out_java_enum += "/**\n * " + enum_doc_comment.replace("\n", "\n * ") + "\n */\n"
out_java_enum += "public enum " + struct_name + " {\n"
ord_v = 0
- for var in variants:
- out_java_enum = out_java_enum + "\t" + var + ",\n"
+ for var, var_docs in variants:
+ if var_docs is not None:
+ out_java_enum += "\t/**\n\t * " + var_docs.replace("\n", "\n\t * ") + "\n\t */\n"
+ out_java_enum += "\t" + var + ",\n"
out_c = out_c + "\t\tcase %d: return %s;\n" % (ord_v, var)
ord_v = ord_v + 1
out_java_enum = out_java_enum + "\t; static native void init();\n"
out_c = out_c + "}\n"
out_c = out_c + "static jclass " + struct_name + "_class = NULL;\n"
- for var in variants:
+ for var, _ in variants:
out_c = out_c + "static jfieldID " + struct_name + "_" + var + " = NULL;\n"
out_c = out_c + self.c_fn_ty_pfx + "void JNICALL Java_org_ldk_enums_" + struct_name.replace("_", "_1") + "_init (" + self.c_fn_args_pfx + ") {\n"
out_c = out_c + "\t" + struct_name + "_class = (*env)->NewGlobalRef(env, clz);\n"
out_c = out_c + "\tCHECK(" + struct_name + "_class != NULL);\n"
- for var in variants:
+ for var, _ in variants:
out_c = out_c + "\t" + struct_name + "_" + var + " = (*env)->GetStaticFieldID(env, " + struct_name + "_class, \"" + var + "\", \"Lorg/ldk/enums/" + struct_name + ";\");\n"
out_c = out_c + "\tCHECK(" + struct_name + "_" + var + " != NULL);\n"
out_c = out_c + "}\n"
out_c = out_c + "static inline jclass LDK" + struct_name + "_to_java(JNIEnv *env, LDK" + struct_name + " val) {\n"
out_c = out_c + "\tswitch (val) {\n"
ord_v = 0
- for var in variants:
+ for var, _ in variants:
out_c = out_c + "\t\tcase " + var + ":\n"
out_c = out_c + "\t\t\treturn (*env)->GetStaticObjectField(env, " + struct_name + "_class, " + struct_name + "_" + var + ");\n"
ord_v = ord_v + 1
out_java += ("\t\tprivate " + struct_name + "() {}\n")
for var in variant_list:
out_java += ("\t\tpublic final static class " + var.var_name + " extends " + struct_name + " {\n")
- java_hu_subclasses = java_hu_subclasses + "\tpublic final static class " + var.var_name + " extends " + java_hu_type + " {\n"
+ if var.var_docs is not None:
+ java_hu_subclasses += "\t/**\n\t * " + var.var_docs.replace("\n", "\n\t * ") + "\n\t */\n"
+ java_hu_subclasses += "\tpublic final static class " + var.var_name + " extends " + java_hu_type + " {\n"
out_java_enum += ("\t\tif (raw_val.getClass() == bindings." + struct_name + "." + var.var_name + ".class) {\n")
out_java_enum += ("\t\t\treturn new " + var.var_name + "(ptr, (bindings." + struct_name + "." + var.var_name + ")raw_val);\n")
init_meth_jty_str = ""
out_java += (arg_conv_info.java_ty + " " + arg_conv_info.arg_name)
out_java_struct = ""
+ extra_java_struct_out = ""
if not args_known:
out_java_struct += ("\t// Skipped " + method_name + "\n")
else:
out_java_struct += "\tpublic static " + return_type_info.java_hu_ty + " with_default("
else:
out_java_struct += "\tpublic static " + return_type_info.java_hu_ty + " " + meth_n + "("
+ elif meth_n == "clone_ptr":
+ out_java_struct += ("\t" + return_type_info.java_hu_ty + " " + meth_n + "(")
else:
+ if meth_n == "hash" and return_type_info.java_hu_ty == "long":
+ extra_java_struct_out = "\t@Override public int hashCode() {\n"
+ extra_java_struct_out += "\t\treturn (int)this.hash();\n"
+ extra_java_struct_out += "\t}\n"
+ elif meth_n == "eq" and return_type_info.java_hu_ty == "boolean":
+ extra_java_struct_out = "\t@Override public boolean equals(Object o) {\n"
+ extra_java_struct_out += "\t\tif (!(o instanceof " + struct_meth + ")) return false;\n"
+ extra_java_struct_out += "\t\treturn this.eq((" + struct_meth + ")o);\n"
+ extra_java_struct_out += "\t}\n"
out_java_struct += ("\tpublic " + return_type_info.java_hu_ty + " " + meth_n + "(")
for idx, arg in enumerate(argument_types):
if idx != 0:
out_java_struct += ("\t\treturn ret;\n")
out_java_struct += ("\t}\n\n")
- return (out_java, out_c, out_java_struct)
+ return (out_java, out_c, out_java_struct + extra_java_struct_out)