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 {
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;
}
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);
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) {
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) {
}
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);
}
"""
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"
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
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:
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 = ")
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")