ZJIT: ADVANCED RUBY JIT PROTOTYPE¶ ↑
Build Instructions¶ ↑
To build ZJIT on macOS:
./autogen.sh ./configure --enable-zjit=dev --prefix=$HOME/.rubies/ruby-yjit --disable-install-doc --with-opt-dir="$(brew --prefix openssl):$(brew --prefix readline):$(brew --prefix libyaml)" make -j miniruby
Useful dev commands¶ ↑
To view YARV output for code snippets:
./miniruby --dump=insns -e0
To run code snippets with ZJIT:
./miniruby --zjit -e0
You can also try www.rubyexplorer.xyz/ to view Ruby YARV disasm output with syntax highlighting in a way that can be easily shared with other team members.
Testing¶ ↑
Make sure you have a --enable-zjit=dev
build, and run brew install cargo-nextest
first.
make zjit-test-all¶ ↑
This command runs all ZJIT tests: make zjit-test
and test/ruby/test_zjit.rb
.
make zjit-test-all
make zjit-test¶ ↑
This command runs Rust unit tests.
make zjit-test
You can also run a single test case by specifying the function name:
make zjit-test ZJIT_TESTS=test_putobject
If you expect that your changes cause tests to fail and they do, you can have expect-test
fix the expected value for you by putting UPDATE_EXPECT=1
before your test command, like so:
UPDATE_EXPECT=1 make zjit-test ZJIT_TESTS=test_putobject
Test changes will be reviewed alongside code changes.
<details>
<summary>Setting up zjit-test</summary>
ZJIT uses cargo-nextest
for Rust unit tests instead of cargo test
. cargo-nextest
runs each test in its own process, which is valuable since CRuby only supports booting once per process, and most APIs are not thread safe. Use brew install cargo-nextest
to install it on macOS, otherwise, refer to nexte.st/docs/installation/pre-built-binaries/ for installation instructions.
Since it uses Cargo, you’ll also need a configure --enable-zjit=dev ...
build for make zjit-test
. Since the tests need to link against CRuby, directly calling cargo test
, or cargo nextest
likely won’t build. Make sure to use make
.
</details>
test/ruby/test_zjit.rb¶ ↑
This command runs Ruby execution tests.
make test-all TESTS="test/ruby/test_zjit.rb"
You can also run a single test case by matching the method name:
make test-all TESTS="test/ruby/test_zjit.rb -n test_putobject"