[TS] Support mapping returned uint64[]s from rust functions
authorMatt Corallo <git@bluematt.me>
Thu, 4 Aug 2022 22:56:43 +0000 (22:56 +0000)
committerMatt Corallo <git@bluematt.me>
Fri, 5 Aug 2022 01:56:42 +0000 (01:56 +0000)
gen_type_mapping.py
typescript_strings.py

index 2ed6faa375f9d70ebbdbd985495a66e7c9dbc1a6..8dd7c6cafe452b09b52b91bb83ee91e6a3a5b446 100644 (file)
@@ -187,8 +187,6 @@ class TypeMappingGenerator:
                     if is_nullable:
                         ret_conv = (ret_conv[0], ret_conv[1] + "\n}")
 
-                to_hu_conv = None
-                to_hu_conv_name = None
                 if subty.to_hu_conv is not None:
                     to_hu_conv = self.consts.var_decl_statement(self.consts.c_type_map["uint32_t"][0], conv_name + "_len", self.consts.get_java_arr_len(arr_name)) + ";\n"
                     to_hu_conv += self.consts.var_decl_statement(ty_info.java_hu_ty, conv_name + "_arr", self.consts.constr_hu_array(ty_info, conv_name + "_len"))
@@ -200,6 +198,12 @@ class TypeMappingGenerator:
                     if cleanup is not None:
                         to_hu_conv += "\n" + cleanup
                     to_hu_conv_name = conv_name + "_arr"
+                else:
+                    to_hu_conv = self.consts.primitive_arr_to_hu(ty_info.subty, None, arr_name, arr_name + "_conv")
+                    if to_hu_conv is not None:
+                        to_hu_conv_name = arr_name + "_conv"
+                    else:
+                        to_hu_conv_name = None
                 from_hu_conv = self.consts.primitive_arr_from_hu(ty_info.subty, None, arr_name)
                 if subty.from_hu_conv is not None:
                     hu_conv_b = ""
index 0d3036429dda8d81db04f3c7c5b8535c0cabb614..24a146a9a32a248e0795f02090ace52011e254a7 100644 (file)
@@ -228,7 +228,23 @@ const decodeUint32Array = (arrayPointer: number, free = true) => {
        }
        return actualArray;
 }
-
+/* @internal */
+export function decodeUint64Array (arrayPointer: number, free = true): bigint[] {
+       const arraySize = getArrayLength(arrayPointer);
+       const actualArrayViewer = new BigUint64Array(
+               wasm.memory.buffer, // value
+               arrayPointer + 4, // offset (ignoring length bytes)
+               arraySize // uint32 count
+       );
+       // Clone the contents, TODO: In the future we should wrap the Viewer in a class that
+       // will free the underlying memory when it becomes unreachable instead of copying here.
+       const actualArray = new Array(arraySize);
+       for (var i = 0; i < arraySize; i++) actualArray[i] = actualArrayViewer[i];
+       if (free) {
+               wasm.TS_free(arrayPointer);
+       }
+       return actualArray;
+}
 
 export function freeWasmMemory(pointer: number) { wasm.TS_free(pointer); }
 
@@ -720,8 +736,12 @@ import * as bindings from '../bindings.mjs'
             assert False
 
     def primitive_arr_to_hu(self, mapped_ty, fixed_len, arr_name, conv_name):
-        assert mapped_ty.c_ty == "uint8_t" or mapped_ty.c_ty == "int8_t"
-        return "const " + conv_name + ": Uint8Array = bindings.decodeUint8Array(" + arr_name + ");"
+        if mapped_ty.c_ty == "uint8_t" or mapped_ty.c_ty == "int8_t":
+            return "const " + conv_name + ": Uint8Array = bindings.decodeUint8Array(" + arr_name + ");"
+        elif mapped_ty.c_ty == "uint64_t" or mapped_ty.c_ty == "int64_t":
+            return "const " + conv_name + ": bigint[] = bindings.decodeUint64Array(" + arr_name + ");"
+        else:
+            assert False
 
     def var_decl_statement(self, ty_string, var_name, statement):
         return "const " + var_name + ": " + ty_string + " = " + statement