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