@ledsun blog

無味の味は佳境に入らざればすなわち知れず

環境変数で大きなスタックサイズを指定したらrequire_relativeが動いた

ruby.wasmでrequire_relativeするやつの進捗状況 - @ledsun blogでSystemStackErrorがでると書きました。 ruby.wasmのリポジトリのissueで次の情報を見つけました。

https://github.com/ruby/ruby.wasm/issues/133#issuecomment-1365825417

evalAsync internally uses Fiber, and its stack size 256kb is smaller than main stack (16mb).

evalAsyncを使うと、スタックサイズが小さくなるそうです。 関係がありそうです。

irb.wasm/irb-worker.ts at 1d6696ea1c6fa5206b7e6a0eab3468c409545c8c · kateinoigakukun/irb.wasm · GitHub

        const wasi = new WASI({
            args,
            env: {
                "GEM_PATH": "/gems:/home/me/.gem/ruby/3.2.0+2",
                "GEM_SPEC_CACHE": "/home/me/.gem/specs",
                "RUBY_FIBER_MACHINE_STACK_SIZE": String(1024 * 1024 * 20),
            },
            preopens: {
                "/home": "/home",
                "/dev": "/dev",
            },
            bindings: {
                ...WASI.defaultBindings,
                fs: wasmFs.fs,
                path: path,
            }
        });

こんな感じで、WASIコンストラクターの引数で環境変数を指定するとスタックサイズを大きくできるそうです。 というわけで

  const wasi = new WASI({env: {
   "RUBY_FIBER_MACHINE_STACK_SIZE": String(1024 * 1024 * 20),
  }});

こんな風にスタックサイズを指定してみます。

2つのRubyスクリプトをrequire_relativeできました。

うお、やったぜ!一歩前進。

Add example for require_relative · ledsun/ruby.wasm@b418a31 · GitHub <- 動くコミットをメモしておきます。