Move TS Arrays to a single pointer
[ldk-java] / typescript_strings.py
index e2201c77fdbe67ad286536bef9f04ef663c1978c..eb8d36b9b1876fe293fb764a157c6253960fba95 100644 (file)
@@ -76,6 +76,7 @@ public static native long new_empty_slice_vec();
 """
 
         self.c_file_pfx = """#include <rust_types.h>
+#include "js-wasm.h"
 #include <stdatomic.h>
 #include <lightning.h>
 
@@ -85,7 +86,7 @@ void *memcpy(void *dest, const void *src, size_t n);
 int memcmp(const void *s1, const void *s2, size_t n);
 
 void __attribute__((noreturn)) abort(void);
-void assert(scalar expression);
+void assert(bool expression);
 """
 
         if not DEBUG:
@@ -196,9 +197,13 @@ _Static_assert(offsetof(LDKCVec_u8Z, datalen) == offsetof(LDKu8slice, datalen),
 
 _Static_assert(sizeof(void*) == 4, "Pointers mut be 32 bits");
 
-typedef struct int64_tArray {uint32_t len;int64_t *ptr;} int64_tArray;
-typedef struct uint32_tArray {uint32_t len;int32_t *ptr;} uint32_tArray;
-typedef struct int8_tArray {uint32_t len;int8_t *ptr;} int8_tArray;
+typedef struct int64_tArray { uint32_t *len; /* len + 1 is data */ } int64_tArray;
+typedef struct uint32_tArray { uint32_t *len; /* len + 1 is data */ } uint32_tArray;
+typedef struct ptrArray { uint32_t *len; /* len + 1 is data */ } ptrArray;
+typedef struct int8_tArray { uint32_t *len; /* len + 1 is data */ } int8_tArray;
+typedef struct jstring {} jstring;
+
+jstring conv_owned_string(const char* _src) { jstring a; return a; }
 
 typedef bool jboolean;
 
@@ -216,37 +221,46 @@ import * as bindings from '../bindings' // TODO: figure out location
         self.ptr_c_ty = "uint32_t"
         self.ptr_native_ty = "number" # "uint32_t"
         self.result_c_ty = "uint32_t"
-        self.ptr_arr = "uint32_tArray"
-        self.get_native_arr_len_call = ("", ".len")
-        self.get_native_arr_ptr_call = ("", ".ptr")
+        self.owned_str_to_c_call = ("conv_owned_string(", ")")
+        self.ptr_arr = "ptrArray"
+        self.get_native_arr_len_call = ("*", ".len")
 
-    def release_native_arr_ptr_call(self, arr_var, arr_ptr_var):
+    def release_native_arr_ptr_call(self, ty_info, arr_var, arr_ptr_var):
         return None
     def create_native_arr_call(self, arr_len, ty_info):
         if ty_info.c_ty == "int8_tArray":
-            return "{ .len = " + arr_len + ", .ptr = MALLOC(" + arr_len + ", \"Native " + ty_info.c_ty + " Bytes\") }"
+            return "{ .len = MALLOC(" + arr_len + " + sizeof(uint32_t), \"Native " + ty_info.c_ty + " Bytes\") }"
         elif ty_info.c_ty == "int64_tArray":
-            return "{ .len = " + arr_len + ", .ptr = MALLOC(" + arr_len + " * sizeof(int64_t), \"Native " + ty_info.c_ty + " Bytes\") }"
+            return "{ .len = MALLOC(" + arr_len + " * sizeof(int64_t) + sizeof(uint32_t), \"Native " + ty_info.c_ty + " Bytes\") }"
         elif ty_info.c_ty == "uint32_tArray":
-            return "{ .len = " + arr_len + ", .ptr = MALLOC(" + arr_len + " * sizeof(int32_t), \"Native " + ty_info.c_ty + " Bytes\") }"
+            return "{ .len = MALLOC(" + arr_len + " * sizeof(int32_t) + sizeof(uint32_t), \"Native " + ty_info.c_ty + " Bytes\") }"
+        elif ty_info.c_ty == "ptrArray":
+            assert ty_info.subty is not None and ty_info.subty.c_ty.endswith("Array")
+            return "{ .len = MALLOC(" + arr_len + " * sizeof(int32_t) + sizeof(uint32_t), \"Native Object Bytes\") }"
         else:
             print("Need to create arr!", ty_info.c_ty)
             return ty_info.c_ty
     def set_native_arr_contents(self, arr_name, arr_len, ty_info):
         if ty_info.c_ty == "int8_tArray":
-            return ("memcpy(" + arr_name + ".ptr, ", ", " + arr_len + ")")
+            return ("memcpy(" + arr_name + ".len + 1, ", ", " + arr_len + ")")
         else:
             assert False
     def get_native_arr_contents(self, arr_name, dest_name, arr_len, ty_info, copy):
         if ty_info.c_ty == "int8_tArray":
             if copy:
-                return "memcpy(" + dest_name + ", " + arr_name + ".ptr, " + arr_len + ")"
+                return "memcpy(" + dest_name + ", " + arr_name + ".len + 1, " + arr_len + ")"
             else:
-                return arr_name + ".ptr"
+                return "(int8_t*)(" + arr_name + ".len + 1)"
         else:
-            return "(" + ty_info.subty.c_ty + "*) " + arr_name + ".ptr"
+            return "(" + ty_info.subty.c_ty + "*)(" + arr_name + ".len + 1)"
     def get_native_arr_elem(self, arr_name, idxc, ty_info):
         assert False # Only called if above is None
+    def get_native_arr_ptr_call(self, ty_info):
+        if ty_info.subty is not None:
+            return "(" + ty_info.subty.c_ty + "*)(", ".len + 1)"
+        return "(" + ty_info.c_ty + "*)(", ".len + 1)"
+    def get_native_arr_entry_call(self, ty_info, arr_name, idxc, entry_access):
+        return None
     def cleanup_native_arr_ref_contents(self, arr_name, dest_name, arr_len, ty_info):
         if ty_info.c_ty == "int8_tArray":
             return None
@@ -271,7 +285,7 @@ const wasm = wasmInstance.exports;
 """
         return ''
 
-    def init_str(self, c_array_class_caches):
+    def init_str(self):
         return ""
 
     def native_c_unitary_enum_map(self, struct_name, variants):