Skip to content

Commit 394841d

Browse files
Extend default fiber stack size tentatively
1 parent fb12843 commit 394841d

File tree

3 files changed

+45
-12
lines changed

3 files changed

+45
-12
lines changed

packages/npm-packages/ruby-wasm-wasi/src/browser.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,15 @@ export const DefaultRubyVM = async (
7070
}> => {
7171
await init();
7272

73-
const wasi = new WASI({});
73+
const wasi = new WASI({
74+
env: {
75+
// FIXME(katei): setjmp consumes a LOT of stack now, so we extend
76+
// default Fiber stack size as well as main stack size allocated
77+
// by wasm-ld's --stack-size. The ideal solution is to reduce
78+
// stack consumption in setjmp.
79+
"RUBY_FIBER_MACHINE_STACK_SIZE": "16777216"
80+
}
81+
});
7482
const vm = new RubyVM();
7583

7684
const imports = wasi.getImports(rubyModule) as WebAssembly.Imports;

packages/npm-packages/ruby-wasm-wasi/src/node.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,15 @@ import { WASI } from "wasi";
22
import { RubyVM } from "./index";
33

44
export const DefaultRubyVM = async (rubyModule: WebAssembly.Module) => {
5-
const wasi = new WASI();
5+
const wasi = new WASI({
6+
env: {
7+
// FIXME(katei): setjmp consumes a LOT of stack now, so we extend
8+
// default Fiber stack size as well as main stack size allocated
9+
// by wasm-ld's --stack-size. The ideal solution is to reduce
10+
// stack consumption in setjmp.
11+
"RUBY_FIBER_MACHINE_STACK_SIZE": "16777216"
12+
}
13+
});
614
const vm = new RubyVM();
715
const imports = {
816
wasi_snapshot_preview1: wasi.wasiImport,

packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/browser-script.spec.ts

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,31 @@ if (!process.env.RUBY_NPM_PACKAGE_ROOT) {
1010
setupProxy(context);
1111
})
1212

13+
const resolveBinding = async (page: Page, name: string) => {
14+
let checkResolved;
15+
const resolvedValue = new Promise((resolve) => {
16+
checkResolved = resolve;
17+
})
18+
await page.exposeBinding(name, async (source, v) => {
19+
checkResolved(v);
20+
});
21+
return async () => await resolvedValue
22+
}
23+
1324
test.describe('data-eval="async"', () => {
14-
test("JS::Object#await returns value", async ({ page, context }) => {
15-
let checkResolved;
16-
const resolvedValue = new Promise((resolve) => {
17-
checkResolved = resolve;
18-
})
19-
await page.exposeBinding('checkResolved', async (source, v) => {
20-
checkResolved(v);
21-
});
25+
test("JS::Object#await returns value", async ({ page }) => {
26+
const resolve = await resolveBinding(page, "checkResolved");
2227
await page.setContent(`
2328
<script src="https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@latest/dist/browser.script.iife.js"></script>
2429
<script type="text/ruby" data-eval="async">
2530
require "js"
2631
JS.global.checkResolved JS.global[:Promise].resolve(42).await
2732
</script>
2833
`)
29-
expect(await resolvedValue).toBe(42);
34+
expect(await resolve()).toBe(42);
3035
})
3136

32-
test("JS::Object#await throws error on default attr", async ({ page, context }) => {
37+
test("JS::Object#await throws error on default attr", async ({ page }) => {
3338
await page.setContent(`
3439
<script src="https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@latest/dist/browser.script.iife.js"></script>
3540
<script type="text/ruby">
@@ -40,5 +45,17 @@ if (!process.env.RUBY_NPM_PACKAGE_ROOT) {
4045
const error = await page.waitForEvent("pageerror")
4146
expect(error.message).toMatch(/please ensure that you specify `data-eval="async"`/)
4247
})
48+
49+
test("default stack size is enough to require 'json'", async ({ page }) => {
50+
const resolve = await resolveBinding(page, "checkResolved");
51+
await page.setContent(`
52+
<script src="https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@latest/dist/browser.script.iife.js"></script>
53+
<script type="text/ruby" data-eval="async">
54+
require 'json'
55+
JS.global.checkResolved "ok"
56+
</script>
57+
`)
58+
expect(await resolve()).toBe("ok");
59+
})
4360
})
4461
}

0 commit comments

Comments
 (0)