Pass the target tuple to genbindings.py and avoid sys.platform
[ldk-java] / java_strings.py
index c44dca6503de951d422cca64ee5bc62a82f7c2ac..f5df004d80d3dd709c54366165a712ceb461337e 100644 (file)
@@ -5,6 +5,7 @@ import sys
 class Target(Enum):
     JAVA = 1,
     ANDROID = 2
+    MACOS = 3
 
 class Consts:
     def __init__(self, DEBUG: bool, target: Target, **kwargs):
@@ -193,7 +194,7 @@ void __attribute__((constructor)) spawn_stderr_redirection() {
         else:
             self.c_file_pfx = self.c_file_pfx + "#define DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__)\n"
 
-        if not DEBUG or sys.platform == "darwin":
+        if not DEBUG or self.target == Target.MACOS:
             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)
@@ -218,7 +219,7 @@ void __attribute__((constructor)) debug_log_version() {
 }
 """
 
-            if sys.platform != "darwin":
+            if self.target != Target.MACOS:
                 self.c_file_pfx += """
 // Running a leak check across all the allocations and frees of the JDK is a mess,
 // so instead we implement our own naive leak checker here, relying on the -wrap
@@ -521,6 +522,8 @@ import javax.annotation.Nullable;
             clz_var = ty_info.java_fn_ty_arg[1:].replace("[", "arr_of_")
             self.c_array_class_caches.add(clz_var)
             return "(*env)->NewObjectArray(env, " + arr_len + ", " + clz_var + "_clz, NULL);\n"
+        elif ty_info.subty.c_ty == "jstring":
+            return "(*env)->NewObjectArray(env, " + arr_len + ", String_clz, NULL);\n"
         else:
             return "(*env)->New" + ty_info.java_ty.strip("[]").title() + "Array(env, " + arr_len + ")"
     def set_native_arr_contents(self, arr_name, arr_len, ty_info):
@@ -531,6 +534,8 @@ import javax.annotation.Nullable;
         else:
             assert False
     def get_native_arr_contents(self, arr_name, dest_name, arr_len, ty_info, copy):
+        if "String" in ty_info.java_ty:
+            return None
         if ty_info.c_ty == "int8_tArray" or ty_info.c_ty == "int16_tArray":
             fn_ty = "Byte" if ty_info.c_ty == "int8_tArray" else "Short"
             if copy:
@@ -590,11 +595,16 @@ import javax.annotation.Nullable;
         res = ""
         for ty in sorted(self.c_array_class_caches):
             res = res + "static jclass " + ty + "_clz = NULL;\n"
+        res = res + "static jclass String_clz = NULL;\n"
         res = res + "JNIEXPORT void Java_org_ldk_impl_bindings_init_1class_1cache(JNIEnv * env, jclass clz) {\n"
         for ty in sorted(self.c_array_class_caches):
             res = res + "\t" + ty + "_clz = (*env)->FindClass(env, \"" + ty.replace("arr_of_", "[") + "\");\n"
             res = res + "\tCHECK(" + ty + "_clz != NULL);\n"
             res = res + "\t" + ty + "_clz = (*env)->NewGlobalRef(env, " + ty + "_clz);\n"
+        res = res + "\tString_clz = (*env)->FindClass(env, \"java/lang/String\");\n"
+        res = res + "\tCHECK(String_clz != NULL);\n"
+        res = res + "\tString_clz = (*env)->NewGlobalRef(env, String_clz);\n"
+
         res = res + "}\n"
         return res
 
@@ -777,12 +787,26 @@ import javax.annotation.Nullable;
                     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"
-        out_java_trait = out_java_trait + "\t}\n"
-        out_java_trait = out_java_trait + "\t@Override @SuppressWarnings(\"deprecation\")\n"
-        out_java_trait = out_java_trait + "\tprotected void finalize() throws Throwable {\n"
-        out_java_trait = out_java_trait + "\t\tif (ptr != 0) { bindings." + struct_name.replace("LDK","") + "_free(ptr); } super.finalize();\n"
-        out_java_trait = out_java_trait + "\t}\n\n"
+        out_java_trait += f"""         this.bindings_instance = arg;
+       }}
+       @Override @SuppressWarnings("deprecation")
+       protected void finalize() throws Throwable {{
+               if (ptr != 0) {{ bindings.{struct_name.replace("LDK","")}_free(ptr); }} super.finalize();
+       }}
+       /**
+        * Destroys the object, freeing associated resources. After this call, any access
+        * to this object may result in a SEGFAULT or worse.
+        *
+        * You should generally NEVER call this method. You should let the garbage collector
+        * do this for you when it finalizes objects. However, it may be useful for types
+        * which represent locks and should be closed immediately to avoid holding locks
+        * until the GC runs.
+        */
+       public void destroy() {{
+               if (ptr != 0) {{ bindings.{struct_name.replace("LDK","")}_free(ptr); }}
+               ptr = 0;
+       }}
+"""
 
         java_trait_constr = "\tprivate static class " + struct_name + "Holder { " + struct_name.replace("LDK", "") + " held; }\n"
         java_trait_constr = java_trait_constr + "\tpublic static " + struct_name.replace("LDK", "") + " new_impl(" + struct_name.replace("LDK", "") + "Interface arg"
@@ -1317,6 +1341,8 @@ import javax.annotation.Nullable;
                     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"
+                if meth_n == "wait":
+                    meth_n = "wait_indefinite"
                 out_java_struct += ("\tpublic " + return_type_info.java_hu_ty + " " + meth_n + "(")
             for idx, arg in enumerate(argument_types):
                 if idx != 0: