From 394841d142fabc2287e7f918a605c7009e545846 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Sun, 21 May 2023 05:41:18 +0000 Subject: [PATCH] Extend default fiber stack size tentatively --- .../ruby-wasm-wasi/src/browser.ts | 10 ++++- .../npm-packages/ruby-wasm-wasi/src/node.ts | 10 ++++- .../integrations/browser-script.spec.ts | 37 ++++++++++++++----- 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/packages/npm-packages/ruby-wasm-wasi/src/browser.ts b/packages/npm-packages/ruby-wasm-wasi/src/browser.ts index 9dc4810ee8..eaf90cd45c 100644 --- a/packages/npm-packages/ruby-wasm-wasi/src/browser.ts +++ b/packages/npm-packages/ruby-wasm-wasi/src/browser.ts @@ -70,7 +70,15 @@ export const DefaultRubyVM = async ( }> => { await init(); - const wasi = new WASI({}); + const wasi = new WASI({ + env: { + // FIXME(katei): setjmp consumes a LOT of stack now, so we extend + // default Fiber stack size as well as main stack size allocated + // by wasm-ld's --stack-size. The ideal solution is to reduce + // stack consumption in setjmp. + "RUBY_FIBER_MACHINE_STACK_SIZE": "16777216" + } + }); const vm = new RubyVM(); const imports = wasi.getImports(rubyModule) as WebAssembly.Imports; diff --git a/packages/npm-packages/ruby-wasm-wasi/src/node.ts b/packages/npm-packages/ruby-wasm-wasi/src/node.ts index 4d27fee208..245ec4d4ef 100644 --- a/packages/npm-packages/ruby-wasm-wasi/src/node.ts +++ b/packages/npm-packages/ruby-wasm-wasi/src/node.ts @@ -2,7 +2,15 @@ import { WASI } from "wasi"; import { RubyVM } from "./index"; export const DefaultRubyVM = async (rubyModule: WebAssembly.Module) => { - const wasi = new WASI(); + const wasi = new WASI({ + env: { + // FIXME(katei): setjmp consumes a LOT of stack now, so we extend + // default Fiber stack size as well as main stack size allocated + // by wasm-ld's --stack-size. The ideal solution is to reduce + // stack consumption in setjmp. + "RUBY_FIBER_MACHINE_STACK_SIZE": "16777216" + } + }); const vm = new RubyVM(); const imports = { wasi_snapshot_preview1: wasi.wasiImport, diff --git a/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/browser-script.spec.ts b/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/browser-script.spec.ts index db68f9d4d6..89e7234128 100644 --- a/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/browser-script.spec.ts +++ b/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/browser-script.spec.ts @@ -10,15 +10,20 @@ if (!process.env.RUBY_NPM_PACKAGE_ROOT) { setupProxy(context); }) + const resolveBinding = async (page: Page, name: string) => { + let checkResolved; + const resolvedValue = new Promise((resolve) => { + checkResolved = resolve; + }) + await page.exposeBinding(name, async (source, v) => { + checkResolved(v); + }); + return async () => await resolvedValue + } + test.describe('data-eval="async"', () => { - test("JS::Object#await returns value", async ({ page, context }) => { - let checkResolved; - const resolvedValue = new Promise((resolve) => { - checkResolved = resolve; - }) - await page.exposeBinding('checkResolved', async (source, v) => { - checkResolved(v); - }); + test("JS::Object#await returns value", async ({ page }) => { + const resolve = await resolveBinding(page, "checkResolved"); await page.setContent(` `) - expect(await resolvedValue).toBe(42); + expect(await resolve()).toBe(42); }) - test("JS::Object#await throws error on default attr", async ({ page, context }) => { + test("JS::Object#await throws error on default attr", async ({ page }) => { await page.setContent(` + + `) + expect(await resolve()).toBe("ok"); + }) }) }