@ledsun blog

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

2023年にruby.wasmにマージできたプルリクエスト

https://github.com/ruby/ruby.wasm/pulls?q=+author%3Aledsun+is%3Amerged+created%3A%3E2023-01-01 で一覧できます。 6件でした。 時系列で見ていきます。


github.com

JavaScriptのオブジェクトを、newメソッドで作れるようにしました。 それまでは、次のようにJavaScript側でnewメソッドを呼ぶ必要がありました。

JS.eval 'return new URLSearchParams(location.search)'

次のようにRubyの中でnewメソッドを呼べるようにしました。

JS.global[:URLSearchParams].new(JS.global[:location][:search])

github.com

JavaScriptのtrue, falseとRubyのtrue, falseは異なるオブジェクトです。 ですので、次の比較は常にfalseになります。

if searchParams.has('phrase') == true
  ...
end

これを簡単に書くために、JavaScriptのtrueを定数にしました。 次のように書けます。

if searchParams.has('phrase') == JS::True
  ...
end

github.com

WebAssembly.complieStreamingというwasmバイナリのダウンロードとコンパイルを同時に実行するAPIを使うようにしました。 40ms速くなりました。 ダウンロードの方が400msぐらい掛かって支配的です。 今のところはそんなに効果はないですが、将来効果が大きくなるといいですね。


github.com

ruby.wasmはビルドの途中でzlibのソースコードをダウンロードします。 zlib 1.3がリリースされたときに、旧バージョンのソースコードがダウンロードできなくなりました。 ruby.wasmのビルドも通らなくなったので、その修正です。


github.com

Kernel#require_relativeをパッチするためのメソッドとして、RequireRemote#loadを追加しました。 自作のRubyスクリプトを読み込むだけなら次のパッチで行けます。

require 'js/require_remote'

module Kernel
  def require_relative(path) = JS::RequireRemote.instance.load(path)
end

これだけだと組み込みgemでつかっているrequirue_relativeが壊れます。 もうちょっと複雑なパッチが必要です。 ruby.wasm/packages/npm-packages/ruby-wasm-wasi/example/require_relative/index.html at 6acf40356079463b9b8d545031e8562a9b3931d2 · ruby/ruby.wasm · GitHub を見てください。

require_remoteをruby.wasmのbundled gemにする計画があります。 そうしたら、このパッチもgemに入れてもいいのかもしれません。 まあ、もう少し先の話なので、一先ずはRequireRemote#loadを組み込んだ自作のアプリケーションを作ります。


github.com

ruby.wasmのnpmパッケージの名称が変わりました。 そのときのテストコードの修正漏れの対応です。