diff options
author | 2021-05-07 14:12:56 -0700 | |
---|---|---|
committer | 2021-05-07 14:12:56 -0700 | |
commit | caa747ba717e28791089d2db22ee9300f11b4d25 (patch) | |
tree | 0cc00b1815befb269132c26cdbe73a3a507b4d94 /src/api/demo/lib/api.ts | |
parent | fad34bb4abfe1715d4febec6e7de2809bfffb4e2 (diff) | |
download | bun-caa747ba717e28791089d2db22ee9300f11b4d25.tar.gz bun-caa747ba717e28791089d2db22ee9300f11b4d25.tar.zst bun-caa747ba717e28791089d2db22ee9300f11b4d25.zip |
wip
Former-commit-id: f4267e2d1fee0d885630dc2a87be0a5699bf526f
Diffstat (limited to 'src/api/demo/lib/api.ts')
-rw-r--r-- | src/api/demo/lib/api.ts | 73 |
1 files changed, 49 insertions, 24 deletions
diff --git a/src/api/demo/lib/api.ts b/src/api/demo/lib/api.ts index e09eec51b..1619e2c46 100644 --- a/src/api/demo/lib/api.ts +++ b/src/api/demo/lib/api.ts @@ -2,7 +2,7 @@ import * as Schema from "../../schema"; import { ByteBuffer } from "peechy"; export interface WebAssemblyModule { - init(): number; + init(starting_memory: number): number; transform(a: number): number; malloc(a: number): number; calloc(a: number): number; @@ -10,38 +10,62 @@ export interface WebAssemblyModule { free(a: number): number; } +const wasm_imports_sym: symbol | string = + process.env.NODE_ENV === "development" + ? "wasm_imports" + : Symbol("wasm_imports"); + export class ESDev { static has_initialized = false; static wasm_source: WebAssembly.WebAssemblyInstantiatedSource = null; - static wasm_exports: WebAssemblyModule; - static memory: WebAssembly.Memory; + static get wasm_exports(): WebAssemblyModule { + return ESDev.wasm_source.instance.exports as any; + } + static get memory() { + return ESDev.wasm_exports.memory as WebAssembly.Memory; + } static memory_array: Uint8Array; - static async init(url) { - if (typeof SharedArrayBuffer !== "undefined") { - ESDev.memory = new WebAssembly.Memory({ - initial: 1500, - maximum: 3000, - shared: true, - }); - } else { - ESDev.memory = new WebAssembly.Memory({ - initial: 1500, - maximum: 3000, - }); + + static _decoder: TextDecoder; + + static _wasmPtrLenToString(ptr: number, len: number) { + if (!ESDev._decoder) { + ESDev._decoder = new TextDecoder(); } - ESDev.memory_array = new Uint8Array(ESDev.memory.buffer); + const region = ESDev.memory_array.subarray(ptr, ptr + len + 1); + return ESDev._decoder.decode(region); + } + + // We don't want people to be calling these manually + static [wasm_imports_sym] = { + console_log(ptr: number, len: number) { + console.log(ESDev._wasmPtrLenToString(ptr, len)); + }, + console_error(ptr: number, len: number) { + console.error(ESDev._wasmPtrLenToString(ptr, len)); + }, + console_warn(ptr: number, len: number) { + console.warn(ESDev._wasmPtrLenToString(ptr, len)); + }, + console_info(ptr: number, len: number) { + console.info(ESDev._wasmPtrLenToString(ptr, len)); + }, + }; + + static async init(url) { ESDev.wasm_source = await globalThis.WebAssembly.instantiateStreaming( fetch(url), - { - js: { - mem: ESDev.memory, - }, - } + { env: ESDev[wasm_imports_sym] } ); - ESDev.wasm_exports = ESDev.wasm_source.instance.exports as any; - ESDev.wasm_exports.init(); - console.log("WASM loaded."); + const res = ESDev.wasm_exports.init(1500); + if (res < 0) { + throw `[ESDev] Failed to initialize WASM module: code ${res}`; + } else { + console.log("WASM loaded."); + } + ESDev.memory_array = new Uint8Array(ESDev.memory.buffer); + ESDev.has_initialized = true; } @@ -63,6 +87,7 @@ export class ESDev { bb ); const data = bb.toUint8Array(); + const ptr = ESDev.wasm_exports.malloc(data.byteLength); ESDev.memory_array.set(data, ptr); debugger; |