aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-04-18 21:18:37 -0700
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-04-18 21:18:37 -0700
commitc2cf1d649352de3d4f73290b13995ef67308ee2a (patch)
treeb7a36d99bfed269430e5205e6e1275421191c8fd
parent612fad706f66d8f830ef9a6efbc33f49a1343ea5 (diff)
downloadbun-c2cf1d649352de3d4f73290b13995ef67308ee2a.tar.gz
bun-c2cf1d649352de3d4f73290b13995ef67308ee2a.tar.zst
bun-c2cf1d649352de3d4f73290b13995ef67308ee2a.zip
not sure yet
-rw-r--r--Makefile6
-rw-r--r--packages/bun-wasm/index.ts168
-rw-r--r--packages/bun-wasm/test/node.mjs24
-rw-r--r--src/main_wasm.zig1
4 files changed, 107 insertions, 92 deletions
diff --git a/Makefile b/Makefile
index d0c52e53b..2496c951d 100644
--- a/Makefile
+++ b/Makefile
@@ -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) {