diff options
author | 2022-02-27 23:20:10 -0800 | |
---|---|---|
committer | 2022-02-27 23:20:10 -0800 | |
commit | 50560e169ca39c0b4ec163cb32897baf7620aa69 (patch) | |
tree | 83eb721bfd4a0318874c1f69d254a4fd9446512b /src/api/demo/lib/api.ts | |
parent | 36c249e9c1fc6e0000d23ae0055eed54a5437c74 (diff) | |
download | bun-50560e169ca39c0b4ec163cb32897baf7620aa69.tar.gz bun-50560e169ca39c0b4ec163cb32897baf7620aa69.tar.zst bun-50560e169ca39c0b4ec163cb32897baf7620aa69.zip |
WASM
Diffstat (limited to 'src/api/demo/lib/api.ts')
-rw-r--r-- | src/api/demo/lib/api.ts | 296 |
1 files changed, 197 insertions, 99 deletions
diff --git a/src/api/demo/lib/api.ts b/src/api/demo/lib/api.ts index b861bb78b..455c73290 100644 --- a/src/api/demo/lib/api.ts +++ b/src/api/demo/lib/api.ts @@ -1,15 +1,15 @@ import * as Schema from "../../schema"; -import { ByteBuffer } from "peechy/bb"; +import { ByteBuffer } from "peechy"; +import path from "path"; +import { Loader } from "../schema"; // import { transform as sucraseTransform } from "sucrase"; export interface WebAssemblyModule { init(): number; transform(a: number): number; - malloc(a: number): number; - calloc(a: number): number; - realloc(a: number): number; - free(a: number): number; - cycle(): void; + bun_malloc(a: number): number; + bun_free(a: number): number; + scan(a: number): number; } const wasm_imports_sym: symbol | string = @@ -17,168 +17,266 @@ const wasm_imports_sym: symbol | string = ? "wasm_imports" : Symbol("wasm_imports"); -const ptr_converter = new ArrayBuffer(8); -const ptr_float = new Float64Array(ptr_converter); +const ptr_converter = new ArrayBuffer(16); +const ptr_float = new BigUint64Array(ptr_converter); const slice = new Uint32Array(ptr_converter); +const Wasi = { + clock_time_get(clk_id, tp) { + return Date.now(); + }, + environ_sizes_get() { + debugger; + return 0; + }, + environ_get(__environ, environ_buf) { + debugger; + return 0; + }, + + fd_close(fd) { + debugger; + return 0; + }, + proc_exit() {}, + + fd_seek(fd, offset_bigint, whence, newOffset) { + debugger; + }, + fd_write(fd, iov, iovcnt, pnum) { + debugger; + }, +}; + var scratch: Uint8Array; +var scratch2: Uint8Array; -export class ESDev { +export class Bun { static has_initialized = false; static wasm_source: WebAssembly.WebAssemblyInstantiatedSource = null; static get wasm_exports(): WebAssemblyModule { - return ESDev.wasm_source.instance.exports as any; + return Bun.wasm_source.instance.exports as any; } - static get memory() { - return ESDev[wasm_imports_sym].memory as WebAssembly.Memory; + static get memory(): WebAssembly.Memory { + return Bun.wasm_source.instance.exports.memory as any; } static memory_array: Uint8Array; static _decoder: TextDecoder; - static _wasmPtrToSlice(offset: number) { - if (ESDev.memory_array.buffer !== ESDev.memory.buffer) { - ESDev.memory_array = new Uint8Array(ESDev.memory.buffer); - } - ptr_float[0] = offset; - return ESDev.memory_array.subarray(slice[0], slice[0] + slice[1]); + static _wasmPtrToSlice(offset: number | bigint) { + ptr_float[0] = typeof offset === "number" ? BigInt(offset) : offset; + return new Uint8Array(Bun.memory.buffer, slice[0], slice[1]); } static _wasmPtrLenToString(slice: number) { - if (!ESDev._decoder) { - ESDev._decoder = new TextDecoder("utf8"); + if (!Bun._decoder) { + Bun._decoder = new TextDecoder("utf8"); } const region = this._wasmPtrToSlice(slice); - - return ESDev._decoder.decode(region); + return Bun._decoder.decode(region); } // We don't want people to be calling these manually static [wasm_imports_sym] = { console_log(slice: number) { - console.log(ESDev._wasmPtrLenToString(slice)); + console.log(Bun._wasmPtrLenToString(slice)); }, console_error(slice: number) { - console.error(ESDev._wasmPtrLenToString(slice)); + console.error(Bun._wasmPtrLenToString(slice)); }, console_warn(slice: number) { - console.warn(ESDev._wasmPtrLenToString(slice)); + console.warn(Bun._wasmPtrLenToString(slice)); }, console_info(slice: number) { - console.info(ESDev._wasmPtrLenToString(slice)); + console.info(Bun._wasmPtrLenToString(slice)); + }, + + __indirect_function_table: new WebAssembly.Table({ + initial: 0, + element: "anyfunc", + }), + __stack_pointer: new WebAssembly.Global({ + mutable: true, + value: "i32", + }), + __multi3(one: number, two: number) { + return Math.imul(one | 0, two | 0); + }, + fmod(one: number, two: number) { + return one % two; + }, + memset(ptr: number, value: number, len: number) { + Bun.memory_array.fill(value, ptr, ptr + len); + }, + memcpy(ptr: number, value: number, len: number) { + Bun.memory_array.copyWithin(ptr, value, value + len); + }, + // These functions convert a to an unsigned long long, rounding toward zero. Negative values all become zero. + __fixunsdfti(a: number) { + return Math.floor(a); }, - memory: null, - // __indirect_function_table: new WebAssembly.Table({ - // initial: 0, - // element: "anyfunc", - // }), - // __stack_pointer: new WebAssembly.Global({ - // mutable: true, - // value: "i32", - // }), - // __multi3(one: number, two: number) { - // return Math.imul(one | 0, two | 0); - // }, - // fmod(one: number, two: number) { - // return one % two; - // }, - // memset(ptr: number, value: number, len: number) { - // ESDev.memory_array.fill(value, ptr, ptr + len); - // }, - // memcpy(ptr: number, value: number, len: number) { - // ESDev.memory_array.copyWithin(ptr, value, value + len); - // }, - // // These functions convert a to an unsigned long long, rounding toward zero. Negative values all become zero. - // __fixunsdfti(a: number) { - // return Math.floor(a); - // }, - // // These functions return the remainder of the unsigned division of a and b. - // __umodti3(a: number, b: number) { - // return (a | 0) % (b | 0); - // }, - // // These functions return the quotient of the unsigned division of a and b. - // __udivti3(a: number, b: number) { - // return (a | 0) / (b | 0); - // }, - // // These functions return the result of shifting a left by b bits. - // __ashlti3(a: number, b: number) { - // return (a | 0) >> (b | 0); - // }, - // /* Returns: convert a to a double, rounding toward even. */ - // __floatuntidf(a: number) { - // const mod = a % 2; - // if (mod === 0) { - // return Math.ceil(a); - // } else if (mod === 1) { - // return Math.floor(a); - // } - // }, + // These functions return the remainder of the unsigned division of a and b. + __umodti3(a: number, b: number) { + return (a | 0) % (b | 0); + }, + // These functions return the quotient of the unsigned division of a and b. + __udivti3(a: number, b: number) { + return (a | 0) / (b | 0); + }, + // These functions return the result of shifting a left by b bits. + __ashlti3(a: number, b: number) { + return (a | 0) >> (b | 0); + }, + /* Returns: convert a to a double, rounding toward even. */ + __floatuntidf(a: number) { + const mod = a % 2; + if (mod === 0) { + return Math.ceil(a); + } else if (mod === 1) { + return Math.floor(a); + } + }, + emscripten_notify_memory_growth() {}, }; static async init(url) { // globalThis.sucraseTransform = sucraseTransform; scratch = new Uint8Array(8096); - if (ESDev.has_initialized) { + if (Bun.has_initialized) { return; } - ESDev[wasm_imports_sym].memory = new WebAssembly.Memory({ - initial: 20, - // shared: typeof SharedArrayBuffer !== "undefined", - maximum: typeof SharedArrayBuffer !== "undefined" ? 5000 : undefined, - }); - - ESDev.wasm_source = await globalThis.WebAssembly.instantiateStreaming( + Bun.wasm_source = await globalThis.WebAssembly.instantiateStreaming( fetch(url), - { env: ESDev[wasm_imports_sym] } + { env: Bun[wasm_imports_sym], wasi_snapshot_preview1: Wasi } ); - ESDev.memory_array = new Uint8Array(ESDev.memory.buffer); - const res = ESDev.wasm_exports.init(); + const res = Bun.wasm_exports.init(); if (res < 0) { - throw `[ESDev] Failed to initialize WASM module: code ${res}`; + throw `[Bun] Failed to initialize WASM module: code ${res}`; } else { console.log("WASM loaded."); } - ESDev.has_initialized = true; + Bun.has_initialized = true; } - static transform(content: Uint8Array, file_name: string) { - if (!ESDev.has_initialized) { - throw "Please run await ESDev.init(wasm_url) before using this."; + static transformSync(content: Uint8Array | string, file_name: string) { + if (!Bun.has_initialized) { + throw "Please run await Bun.init(wasm_url) before using this."; } // if (process.env.NODE_ENV === "development") { - // console.time("[ESDev] Transform " + file_name); + // console.time("[Bun] Transform " + file_name); // } const bb = new ByteBuffer(scratch); bb.length = 0; + bb.index = 0; + var contents_buffer; + if (typeof content === "string") { + if (!scratch2) { + scratch2 = new Uint8Array(content.length * 2); + } + + let i = 0; + for (; i < content.length; i++) { + if (i > scratch2.length) { + var scratch3 = new Uint8Array(scratch2.length * 2); + scratch3.set(scratch2); + scratch2 = scratch3; + } + scratch2[i] = content.charCodeAt(i); + } + contents_buffer = scratch2.subarray(0, i); + } else { + contents_buffer = content; + } Schema.encodeTransform( { - contents: content, + contents: contents_buffer, path: file_name, + loader: { + ".jsx": Loader.jsx, + ".tsx": Loader.tsx, + ".ts": Loader.ts, + ".js": Loader.js, + ".json": Loader.json, + }[path.extname(file_name)], }, bb ); const data = bb.toUint8Array(); - if (bb._data.buffer !== scratch.buffer) { - scratch = bb._data; - } - ESDev.wasm_exports.cycleStart(); - const ptr = ESDev.wasm_exports.malloc(data.byteLength); - this._wasmPtrToSlice(ptr).set(data); - const resp_ptr = ESDev.wasm_exports.transform(ptr); + + const input_ptr = Bun.wasm_exports.bun_malloc(data.length); + var buffer = this._wasmPtrToSlice(input_ptr); + buffer.set(data); + + const resp_ptr = Bun.wasm_exports.transform(input_ptr); var _bb = new ByteBuffer(this._wasmPtrToSlice(resp_ptr)); const response = Schema.decodeTransformResponse(_bb); - ESDev.wasm_exports.cycleEnd(); + Bun.wasm_exports.bun_free(input_ptr); + scratch = bb.data; + return response; + } + + static scan(content: Uint8Array | string, file_name: string, loader: Loader) { + if (!Bun.has_initialized) { + throw "Please run await Bun.init(wasm_url) before using this."; + } + + // if (process.env.NODE_ENV === "development") { + // console.time("[Bun] Transform " + file_name); + // } + scratch.fill(0); + const bb = new ByteBuffer(scratch); + bb.length = 0; + bb.index = 0; + var contents_buffer; + if (typeof content === "string") { + if (!scratch2) { + scratch2 = new Uint8Array(content.length * 2); + } + const encode_into = new TextEncoder().encodeInto(content, scratch2); + contents_buffer = scratch2.subarray(0, encode_into.written); + } else { + contents_buffer = content; + } + + Schema.encodeScan( + { + contents: contents_buffer, + path: file_name, + loader: + loader || + { + ".jsx": Loader.jsx, + ".tsx": Loader.tsx, + ".ts": Loader.ts, + ".js": Loader.js, + ".json": Loader.json, + }[path.extname(file_name)], + }, + bb + ); + const data = bb.toUint8Array(); + + const input_ptr = Bun.wasm_exports.bun_malloc(data.length); + var buffer = this._wasmPtrToSlice(input_ptr); + buffer.set(data); + + const resp_ptr = Bun.wasm_exports.scan(input_ptr); + var _bb = new ByteBuffer(this._wasmPtrToSlice(resp_ptr)); + const response = Schema.decodeScanResult(_bb); + Bun.wasm_exports.bun_free(input_ptr); + scratch = bb.data; return response; } } -globalThis.ESDev = ESDev; +globalThis.Bun = Bun; |