diff options
author | 2022-04-18 21:18:37 -0700 | |
---|---|---|
committer | 2022-04-18 21:18:37 -0700 | |
commit | c2cf1d649352de3d4f73290b13995ef67308ee2a (patch) | |
tree | b7a36d99bfed269430e5205e6e1275421191c8fd | |
parent | 612fad706f66d8f830ef9a6efbc33f49a1343ea5 (diff) | |
download | bun-c2cf1d649352de3d4f73290b13995ef67308ee2a.tar.gz bun-c2cf1d649352de3d4f73290b13995ef67308ee2a.tar.zst bun-c2cf1d649352de3d4f73290b13995ef67308ee2a.zip |
not sure yet
-rw-r--r-- | Makefile | 6 | ||||
-rw-r--r-- | packages/bun-wasm/index.ts | 168 | ||||
-rw-r--r-- | packages/bun-wasm/test/node.mjs | 24 | ||||
-rw-r--r-- | src/main_wasm.zig | 1 |
4 files changed, 107 insertions, 92 deletions
@@ -471,13 +471,15 @@ wasm: api build-obj-wasm-small @cp src/api/schema.d.ts packages/bun-wasm/schema.d.ts @cp src/api/schema.js packages/bun-wasm/schema.js @cd packages/bun-wasm && $(NPM_CLIENT) run tsc -- -p . - @esbuild --sourcemap=external --external:fs --define:process.env.NODE_ENV="production" --outdir=packages/bun-wasm --target=esnext --bundle packages/bun-wasm/index.ts --format=esm --minify > /dev/null + @esbuild --sourcemap=external --external:fs --define:process.env.NODE_ENV='"production"' --outdir=packages/bun-wasm --target=esnext --bundle packages/bun-wasm/index.ts --format=esm --minify 2> /dev/null @mv packages/bun-wasm/index.js packages/bun-wasm/index.mjs @mv packages/bun-wasm/index.js.map packages/bun-wasm/index.mjs.map - @esbuild --sourcemap=external --external:fs --define:process.env.NODE_ENV="production" --outdir=packages/bun-wasm --target=esnext --bundle packages/bun-wasm/index.ts --format=cjs --minify --platform=node > /dev/null + @esbuild --sourcemap=external --external:fs --define:process.env.NODE_ENV='"production"' --outdir=packages/bun-wasm --target=esnext --bundle packages/bun-wasm/index.ts --format=cjs --minify --platform=node 2> /dev/null @mv packages/bun-wasm/index.js packages/bun-wasm/index.cjs @mv packages/bun-wasm/index.js.map packages/bun-wasm/index.cjs.map @rm -rf packages/bun-wasm/*.tsbuildinfo + @wasm-opt -O4 --enable-mutable-globals packages/bun-wasm/bun.wasm -o /tmp/bun.wasm + @mv /tmp/bun.wasm packages/bun-wasm/bun.wasm build-obj-safe: $(ZIG) build obj -Drelease-safe diff --git a/packages/bun-wasm/index.ts b/packages/bun-wasm/index.ts index 78582c84b..d886a2cda 100644 --- a/packages/bun-wasm/index.ts +++ b/packages/bun-wasm/index.ts @@ -45,12 +45,6 @@ interface WebAssemblyModule { scan(a: number): number; } -const wasm_imports_sym: symbol | string = - //@ts-ignore - process.env.NODE_ENV === "development" - ? "wasm_imports" - : Symbol("wasm_imports"); - const ptr_converter = new ArrayBuffer(16); const ptr_float = new BigUint64Array(ptr_converter); const slice = new Uint32Array(ptr_converter); @@ -85,28 +79,97 @@ const Wasi = { var scratch: Uint8Array; var scratch2: Uint8Array; +const env = { + console_log(slice: number) { + //@ts-ignore + console.log(Bun._wasmPtrLenToString(slice)); + }, + console_error(slice: number) { + //@ts-ignore + console.error(Bun._wasmPtrLenToString(slice)); + }, + console_warn(slice: number) { + //@ts-ignore + console.warn(Bun._wasmPtrLenToString(slice)); + }, + console_info(slice: number) { + //@ts-ignore + console.info(Bun._wasmPtrLenToString(slice)); + }, + // @ts-ignore-line + __indirect_function_table: new WebAssembly.Table({ + initial: 0, + element: "anyfunc", + }), + // @ts-ignore-line + __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) { + //@ts-ignore + Bun.memory_array.fill(value, ptr, ptr + len); + }, + memcpy(ptr: number, value: number, len: number) { + //@ts-ignore + 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); + }, + // 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() {}, +}; + export class Bun { - static has_initialized = false; + private static has_initialized = false; // @ts-ignore-line - static wasm_source: WebAssembly.WebAssemblyInstantiatedSource = null; - static get wasm_exports(): WebAssemblyModule { + private static wasm_source: WebAssembly.WebAssemblyInstantiatedSource = null; + private static get wasm_exports(): WebAssemblyModule { return Bun.wasm_source.instance.exports as any; } // @ts-ignore-line - static get memory(): WebAssembly.Memory { + private static get memory(): WebAssembly.Memory { return Bun.wasm_source.instance.exports.memory as any; } - static memory_array: Uint8Array; + private static memory_array: Uint8Array; - static _decoder: TextDecoder; + private static _decoder: TextDecoder; - static _wasmPtrToSlice(offset: number | bigint) { + private 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) { + private static _wasmPtrLenToString(slice: number) { if (!Bun._decoder) { Bun._decoder = new TextDecoder("utf8"); } @@ -115,71 +178,6 @@ export class Bun { return Bun._decoder.decode(region); } - // We don't want people to be calling these manually - // @ts-ignore-line - static [wasm_imports_sym as symbol] = { - console_log(slice: number) { - console.log(Bun._wasmPtrLenToString(slice)); - }, - console_error(slice: number) { - console.error(Bun._wasmPtrLenToString(slice)); - }, - console_warn(slice: number) { - console.warn(Bun._wasmPtrLenToString(slice)); - }, - console_info(slice: number) { - console.info(Bun._wasmPtrLenToString(slice)); - }, - // @ts-ignore-line - __indirect_function_table: new WebAssembly.Table({ - initial: 0, - element: "anyfunc", - }), - // @ts-ignore-line - __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); - }, - // 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, fetch = globalThis.fetch) { // globalThis.sucraseTransform = sucraseTransform; scratch = new Uint8Array(8096); @@ -191,14 +189,14 @@ export class Bun { if (globalThis?.WebAssembly?.instantiateStreaming) { Bun.wasm_source = await globalThis.WebAssembly.instantiateStreaming( fetch(url), - { env: Bun[wasm_imports_sym], wasi_snapshot_preview1: Wasi } + { env: env, wasi_snapshot_preview1: Wasi } ); } else if (typeof window !== "undefined") { const resp = await fetch(url); Bun.wasm_source = await globalThis.WebAssembly.instantiate( await resp.arrayBuffer(), { - env: Bun[wasm_imports_sym], + env: env, wasi_snapshot_preview1: Wasi, } ); @@ -210,7 +208,7 @@ export class Bun { Bun.wasm_source = await globalThis.WebAssembly.instantiate( fs.readFileSync(url), { - env: Bun[wasm_imports_sym], + env: env, wasi_snapshot_preview1: Wasi, } ); @@ -344,3 +342,9 @@ if ("window" in globalThis && !("Bun" in globalThis)) { // @ts-ignore-line globalThis.Bun = Bun; } + +//@ts-ignore +if (process.env.NODE_ENV === "development") { + //@ts-ignore + Bun.env = env; +} diff --git a/packages/bun-wasm/test/node.mjs b/packages/bun-wasm/test/node.mjs index 832b3f67b..92162fa4f 100644 --- a/packages/bun-wasm/test/node.mjs +++ b/packages/bun-wasm/test/node.mjs @@ -1,17 +1,25 @@ import * as Bun from "../index.mjs"; +import process from "process"; await Bun.init(new URL("../bun.wasm", import.meta.url)); -const hey = Bun.transformSync( - ` +const buf = + (process.argv.length > 2 ? process.argv.at(-1) : "") || + new TextEncoder().encode(` export function hi() { - return true; + return <div>Hey</div>; } -`, - "hi.js", - "js" -); +`); +const result = Bun.transformSync(buf, "hi.jsx", "jsx"); +if (result.errors?.length) { + console.log(JSON.stringify(result.errors, null, 2)); + throw new Error("Failed"); +} + +if (!result.files.length) { + throw new Error("unexpectedly empty"); +} -console.log(JSON.stringify(hey, null, 2)); +process.stdout.write(result.files[0].data); diff --git a/src/main_wasm.zig b/src/main_wasm.zig index 185d785c5..5785a06d7 100644 --- a/src/main_wasm.zig +++ b/src/main_wasm.zig @@ -232,6 +232,7 @@ export fn transform(opts_array: u64) u64 { }, &log, &code, define, allocator) catch unreachable; parser.options.jsx.parse = loader.isJSX(); parser.options.ts = loader.isTypeScript(); + parser.options.tree_shaking = false; parser.options.features.top_level_await = true; const result = parser.parse() catch unreachable; if (result.ok) { |