Fix missing-ptrs_to error by working around it in test
[ldk-java] / java_strings.py
index c83ee8269257f6a5c66e9f3bbe15cdb26cc3f98b..bc3c73cf05f2ea841bd68123264e8287c0d967fb 100644 (file)
@@ -51,10 +51,17 @@ public class bindings {
 
         self.bindings_footer = "}\n"
 
+        self.util_fn_pfx = """package org.ldk.structs;
+import org.ldk.impl.bindings;
+import java.util.Arrays;
+
+public class UtilMethods {
+"""
+        self.util_fn_sfx = "}"
         self.common_base = """package org.ldk.structs;
 import java.util.LinkedList;
 class CommonBase {
-       final long ptr;
+       long ptr;
        LinkedList<Object> ptrs_to = new LinkedList();
        protected CommonBase(long ptr) { this.ptr = ptr; }
        public long _test_only_get_ptr() { return this.ptr; }
@@ -103,16 +110,18 @@ typedef struct allocation {
        const char* struct_name;
        void* bt[BT_MAX];
        int bt_len;
+       size_t alloc_len;
 } allocation;
 static allocation* allocation_ll = NULL;
 
 void* __real_malloc(size_t len);
 void* __real_calloc(size_t nmemb, size_t len);
-static void new_allocation(void* res, const char* struct_name) {
+static void new_allocation(void* res, const char* struct_name, size_t len) {
        allocation* new_alloc = __real_malloc(sizeof(allocation));
        new_alloc->ptr = res;
        new_alloc->struct_name = struct_name;
        new_alloc->bt_len = backtrace(new_alloc->bt, BT_MAX);
+       new_alloc->alloc_len = len;
        DO_ASSERT(mtx_lock(&allocation_mtx) == thrd_success);
        new_alloc->next = allocation_ll;
        allocation_ll = new_alloc;
@@ -120,7 +129,7 @@ static void new_allocation(void* res, const char* struct_name) {
 }
 static void* MALLOC(size_t len, const char* struct_name) {
        void* res = __real_malloc(len);
-       new_allocation(res, struct_name);
+       new_allocation(res, struct_name, len);
        return res;
 }
 void __real_free(void* ptr);
@@ -153,12 +162,12 @@ static void FREE(void* ptr) {
 
 void* __wrap_malloc(size_t len) {
        void* res = __real_malloc(len);
-       new_allocation(res, "malloc call");
+       new_allocation(res, "malloc call", len);
        return res;
 }
 void* __wrap_calloc(size_t nmemb, size_t len) {
        void* res = __real_calloc(nmemb, len);
-       new_allocation(res, "calloc call");
+       new_allocation(res, "calloc call", len);
        return res;
 }
 void __wrap_free(void* ptr) {
@@ -171,7 +180,7 @@ void* __real_realloc(void* ptr, size_t newlen);
 void* __wrap_realloc(void* ptr, size_t len) {
        if (ptr != NULL) alloc_freed(ptr);
        void* res = __real_realloc(ptr, len);
-       new_allocation(res, "realloc call");
+       new_allocation(res, "realloc call", len);
        return res;
 }
 void __wrap_reallocarray(void* ptr, size_t new_sz) {
@@ -180,11 +189,16 @@ void __wrap_reallocarray(void* ptr, size_t new_sz) {
 }
 
 void __attribute__((destructor)) check_leaks() {
+       size_t alloc_count = 0;
+       size_t alloc_size = 0;
        for (allocation* a = allocation_ll; a != NULL; a = a->next) {
                fprintf(stderr, "%s %p remains:\\n", a->struct_name, a->ptr);
                backtrace_symbols_fd(a->bt, a->bt_len, STDERR_FILENO);
                fprintf(stderr, "\\n\\n");
+               alloc_count++;
+               alloc_size += a->alloc_len;
        }
+       fprintf(stderr, "%lu allocations remained for %lu bytes.\\n", alloc_count, alloc_size);
        DO_ASSERT(allocation_ll == NULL);
 }
 """
@@ -481,7 +495,7 @@ import java.util.Arrays;
         for var in field_vars:
             if isinstance(var, ConvInfo):
                 if var.from_hu_conv is not None and var.from_hu_conv[1] != "":
-                    out_java_trait = out_java_trait + "\t\t" + var.from_hu_conv[1] + ";\n"
+                    out_java_trait = out_java_trait + "\t\t" + var.from_hu_conv[1].replace("\n", "\n\t\t") + ";\n"
             else:
                 out_java_trait = out_java_trait + "\t\tthis.ptrs_to.add(" + var[1] + ");\n"
         out_java_trait = out_java_trait + "\t\tthis.bindings_instance = arg;\n"
@@ -833,7 +847,7 @@ import java.util.Arrays;
         return out_opaque_struct_human
 
 
-    def map_function(self, argument_types, c_call_string, is_free, method_name, return_type_info, struct_meth, default_constructor_args, takes_self, args_known, has_out_java_struct: bool, type_mapping_generator):
+    def map_function(self, argument_types, c_call_string, method_name, return_type_info, struct_meth, default_constructor_args, takes_self, args_known, type_mapping_generator):
         out_java = ""
         out_c = ""
         out_java_struct = None
@@ -856,33 +870,31 @@ import java.util.Arrays;
                 out_c += (arg_conv_info.c_ty + " " + arg_conv_info.arg_name)
                 out_java += (arg_conv_info.java_ty + " " + arg_conv_info.arg_name)
 
-        if has_out_java_struct:
-            out_java_struct = ""
-            if not args_known:
-                out_java_struct += ("\t// Skipped " + method_name + "\n")
-                has_out_java_struct = False
+        out_java_struct = ""
+        if not args_known:
+            out_java_struct += ("\t// Skipped " + method_name + "\n")
+        else:
+            meth_n = method_name[len(struct_meth) + 1:]
+            if not takes_self:
+                out_java_struct += (
+                    "\tpublic static " + return_type_info.java_hu_ty + " constructor_" + meth_n + "(")
             else:
-                meth_n = method_name[len(struct_meth) + 1:]
-                if not takes_self:
-                    out_java_struct += (
-                        "\tpublic static " + return_type_info.java_hu_ty + " constructor_" + meth_n + "(")
-                else:
-                    out_java_struct += ("\tpublic " + return_type_info.java_hu_ty + " " + meth_n + "(")
-                for idx, arg in enumerate(argument_types):
-                    if idx != 0:
-                        if not takes_self or idx > 1:
-                            out_java_struct += (", ")
-                    elif takes_self:
-                        continue
-                    if arg.java_ty != "void":
-                        if arg.arg_name in default_constructor_args:
-                            for explode_idx, explode_arg in enumerate(default_constructor_args[arg.arg_name]):
-                                if explode_idx != 0:
-                                    out_java_struct += (", ")
-                                out_java_struct += (
-                                    explode_arg.java_hu_ty + " " + arg.arg_name + "_" + explode_arg.arg_name)
-                        else:
-                            out_java_struct += (arg.java_hu_ty + " " + arg.arg_name)
+                out_java_struct += ("\tpublic " + return_type_info.java_hu_ty + " " + meth_n + "(")
+            for idx, arg in enumerate(argument_types):
+                if idx != 0:
+                    if not takes_self or idx > 1:
+                        out_java_struct += (", ")
+                elif takes_self:
+                    continue
+                if arg.java_ty != "void":
+                    if arg.arg_name in default_constructor_args:
+                        for explode_idx, explode_arg in enumerate(default_constructor_args[arg.arg_name]):
+                            if explode_idx != 0:
+                                out_java_struct += (", ")
+                            out_java_struct += (
+                                explode_arg.java_hu_ty + " " + arg.arg_name + "_" + explode_arg.arg_name)
+                    else:
+                        out_java_struct += (arg.java_hu_ty + " " + arg.arg_name)
         out_java += (");\n")
         out_c += (") {\n")
         if out_java_struct is not None:
@@ -921,7 +933,7 @@ import java.util.Arrays;
             out_c += ("\n\treturn ret_val;")
         out_c += ("\n}\n\n")
 
-        if has_out_java_struct:
+        if args_known:
             out_java_struct += ("\t\t")
             if return_type_info.java_ty != "void":
                 out_java_struct += (return_type_info.java_ty + " ret = ")
@@ -968,9 +980,9 @@ import java.util.Arrays;
                 elif info.from_hu_conv is not None and info.from_hu_conv[1] != "":
                     if not takes_self and return_type_info.to_hu_conv_name is not None:
                         out_java_struct += (
-                            "\t\t" + info.from_hu_conv[1].replace("this", return_type_info.to_hu_conv_name) + ";\n")
+                            "\t\t" + info.from_hu_conv[1].replace("this", return_type_info.to_hu_conv_name).replace("\n", "\n\t\t") + ";\n")
                     else:
-                        out_java_struct += ("\t\t" + info.from_hu_conv[1] + ";\n")
+                        out_java_struct += ("\t\t" + info.from_hu_conv[1].replace("\n", "\n\t\t") + ";\n")
 
             if return_type_info.to_hu_conv_name is not None:
                 out_java_struct += ("\t\treturn " + return_type_info.to_hu_conv_name + ";\n")