From 23765a5e094f61b11bddce98f7fdd425d1c8ed87 Mon Sep 17 00:00:00 2001 From: Max Bernstein Date: Mon, 5 Jan 2026 15:16:48 -0500 Subject: [PATCH 1/5] ZJIT: Update Iongraph (#15806) Fix some rendering bugs and remove React. --- tool/zjit_iongraph.html | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tool/zjit_iongraph.html b/tool/zjit_iongraph.html index e97ac74e4ac411..993cce90455260 100644 --- a/tool/zjit_iongraph.html +++ b/tool/zjit_iongraph.html @@ -1,7 +1,7 @@ + 39b04fa18f23cbf3fd2ca7339a45341ff3351ba1 in tekknolagi/iongraph --> @@ -337,6 +337,10 @@ overflow-y: auto; } +.ig-hide-if-empty:empty { + display: none; +} + /* Non-utility styles */ .ig-graph { @@ -511,8 +515,7 @@ -
- From 7a1180afb665286556315bcf27188263854b213b Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 5 Jan 2026 13:33:57 -0800 Subject: [PATCH 2/5] ruby-bench: Prefer --excludes over rm -rf to remind us of skipped benchmarks in the CI job names --- .github/workflows/ubuntu.yml | 6 ++++-- .github/workflows/zjit-macos.yml | 6 ++++-- .github/workflows/zjit-ubuntu.yml | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 6489454c57c74b..81c6bff401780e 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -208,7 +208,7 @@ jobs: matrix: include: # Using the same setup as ZJIT jobs - - bench_opts: '--warmup=1 --bench=1' + - bench_opts: '--warmup=1 --bench=1 --excludes=lobsters' runs-on: ubuntu-24.04 @@ -242,8 +242,10 @@ jobs: repository: ruby/ruby-bench path: ruby-bench + # If you want to skip failing benchmark, consider using `--excludes`. + # e.g. `bench_opts: '--warmup=1 --bench=1 --excludes=railsbench,lobsters'` - name: Run ruby-bench - run: rm -rf benchmarks/lobsters && ruby run_benchmarks.rb -e "ruby::../build/install/bin/ruby" ${{ matrix.bench_opts }} + run: ruby run_benchmarks.rb -e "ruby::../build/install/bin/ruby" ${{ matrix.bench_opts }} working-directory: ruby-bench - uses: ./.github/actions/slack diff --git a/.github/workflows/zjit-macos.yml b/.github/workflows/zjit-macos.yml index 55bfcb30f22364..a638907811c3f1 100644 --- a/.github/workflows/zjit-macos.yml +++ b/.github/workflows/zjit-macos.yml @@ -158,7 +158,7 @@ jobs: include: # Test --call-threshold=2 with 2 iterations in total - ruby_opts: '--zjit-call-threshold=2' - bench_opts: '--warmup=1 --bench=1' + bench_opts: '--warmup=1 --bench=1 --excludes=lobsters' configure: '--enable-zjit=dev_nodebug' # --enable-zjit=dev is too slow runs-on: macos-14 @@ -197,8 +197,10 @@ jobs: repository: ruby/ruby-bench path: ruby-bench + # If you want to skip failing benchmark, consider using `--excludes`. + # e.g. `bench_opts: '--warmup=1 --bench=1 --excludes=railsbench,lobsters'` - name: Run ruby-bench - run: rm -rf benchmarks/lobsters && ruby run_benchmarks.rb -e "zjit::../build/install/bin/ruby ${{ matrix.ruby_opts }}" ${{ matrix.bench_opts }} + run: ruby run_benchmarks.rb -e "zjit::../build/install/bin/ruby ${{ matrix.ruby_opts }}" ${{ matrix.bench_opts }} working-directory: ruby-bench - uses: ./.github/actions/slack diff --git a/.github/workflows/zjit-ubuntu.yml b/.github/workflows/zjit-ubuntu.yml index 13b1add5b09568..4d5ecb7280c04d 100644 --- a/.github/workflows/zjit-ubuntu.yml +++ b/.github/workflows/zjit-ubuntu.yml @@ -215,7 +215,7 @@ jobs: include: # Test --call-threshold=2 with 2 iterations in total - ruby_opts: '--zjit-call-threshold=2' - bench_opts: '--warmup=1 --bench=1' + bench_opts: '--warmup=1 --bench=1 --excludes=lobsters' configure: '--enable-zjit=dev_nodebug' # --enable-zjit=dev is too slow runs-on: ubuntu-24.04 @@ -250,8 +250,10 @@ jobs: repository: ruby/ruby-bench path: ruby-bench + # If you want to skip failing benchmark, consider using `--excludes`. + # e.g. `bench_opts: '--warmup=1 --bench=1 --excludes=railsbench,lobsters'` - name: Run ruby-bench - run: rm -rf benchmarks/lobsters && ruby run_benchmarks.rb -e "zjit::../build/install/bin/ruby ${{ matrix.ruby_opts }}" ${{ matrix.bench_opts }} + run: ruby run_benchmarks.rb -e "zjit::../build/install/bin/ruby ${{ matrix.ruby_opts }}" ${{ matrix.bench_opts }} working-directory: ruby-bench - uses: ./.github/actions/slack From a25f4689175b5b0f7da0831dbcedf86b62f67e19 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Mon, 5 Jan 2026 16:18:16 +0000 Subject: [PATCH 3/5] [DOC] Harmonize #>= methods --- compar.c | 11 ++++++++--- hash.c | 5 ++--- numeric.c | 9 +++++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/compar.c b/compar.c index eda7e83824a4e0..0fb7e5f6584e73 100644 --- a/compar.c +++ b/compar.c @@ -109,10 +109,15 @@ cmp_gt(VALUE x, VALUE y) /* * call-seq: - * obj >= other -> true or false + * self >= other -> true or false + * + * Returns whether +self+ is "greater than or equal to" +other+; + * equivalent to (self <=> other) >= 0: + * + * 'food' >= 'foo' # => true + * 'foo' >= 'foo' # => true + * 'foo' >= 'food' # => false * - * Compares two objects based on the receiver's <=> - * method, returning true if it returns a value greater than or equal to 0. */ static VALUE diff --git a/hash.c b/hash.c index b0de8e943355af..f264bfba4bc40f 100644 --- a/hash.c +++ b/hash.c @@ -4950,10 +4950,9 @@ rb_hash_lt(VALUE hash, VALUE other) /* * call-seq: - * self >= other_hash -> true or false + * self >= other -> true or false * - * Returns +true+ if the entries of +self+ are a superset of the entries of +other_hash+, - * +false+ otherwise: + * Returns whether the entries of +self+ are a superset of the entries of +other+: * * h0 = {foo: 0, bar: 1, baz: 2} * h1 = {foo: 0, bar: 1} diff --git a/numeric.c b/numeric.c index 87d50ae4a1b9e8..8f866d00bde628 100644 --- a/numeric.c +++ b/numeric.c @@ -1674,7 +1674,8 @@ rb_float_gt(VALUE x, VALUE y) * call-seq: * self >= other -> true or false * - * Returns +true+ if +self+ is numerically greater than or equal to +other+: + * Returns whether the value of +self+ is greater than or equal to the value of +other+; + * +other+ must be numeric, but may not be Complex: * * 2.0 >= 1 # => true * 2.0 >= 1.0 # => true @@ -5001,10 +5002,10 @@ fix_ge(VALUE x, VALUE y) /* * call-seq: - * self >= real -> true or false + * self >= other -> true or false * - * Returns +true+ if the value of +self+ is greater than or equal to - * that of +other+: + * Returns whether the value of +self+ is greater than or equal to the value of +other+; + * +other+ must be numeric, but may not be Complex: * * 1 >= 0 # => true * 1 >= 1 # => true From dd67874ad9ef1beb57e2c76528ff715c525163c6 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Mon, 5 Jan 2026 18:29:04 +0000 Subject: [PATCH 4/5] [DOC] Harmonize #=== methods --- object.c | 11 ++++++----- range.c | 5 ++--- re.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/object.c b/object.c index aaa3326ebf6df5..ed7e0ff224cf0b 100644 --- a/object.c +++ b/object.c @@ -162,7 +162,7 @@ rb_obj_setup(VALUE obj, VALUE klass, VALUE type) * * Returns +true+ or +false+. * - * Like Object#==, if +object+ is an instance of Object + * Like Object#==, if +other+ is an instance of \Object * (and not an instance of one of its many subclasses). * * This method is commonly overridden by those subclasses, @@ -1892,11 +1892,12 @@ rb_mod_freeze(VALUE mod) /* * call-seq: - * mod === obj -> true or false + * self === other -> true or false * - * Case Equality---Returns true if obj is an - * instance of mod or an instance of one of mod's descendants. - * Of limited use for modules, but can be used in case statements + * Returns whether +other+ is an instance of +self+, + * or is an instance of a subclass of +self+. + * + * Of limited use for modules, but can be used in +case+ statements * to classify objects by class. */ diff --git a/range.c b/range.c index 7aa917bc067b68..c8a4b9938bab8e 100644 --- a/range.c +++ b/range.c @@ -2054,10 +2054,9 @@ VALUE rb_str_include_range_p(VALUE beg, VALUE end, VALUE val, VALUE exclusive); /* * call-seq: - * self === object -> true or false + * self === other -> true or false * - * Returns +true+ if +object+ is between self.begin and self.end. - * +false+ otherwise: + * Returns whether +other+ is between self.begin and self.end: * * (1..4) === 2 # => true * (1..4) === 5 # => false diff --git a/re.c b/re.c index 621af13cd73f16..f8672d1d7ce187 100644 --- a/re.c +++ b/re.c @@ -3728,9 +3728,9 @@ rb_reg_match(VALUE re, VALUE str) /* * call-seq: - * regexp === string -> true or false + * self === other -> true or false * - * Returns +true+ if +self+ finds a match in +string+: + * Returns whether +self+ finds a match in +other+: * * /^[a-z]*$/ === 'HELLO' # => false * /^[A-Z]*$/ === 'HELLO' # => true From 5d26a2aeea1368c5e37cb75ca511e62c5e21960f Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Sun, 4 Jan 2026 14:14:26 -0500 Subject: [PATCH 5/5] [ruby/mmtk] Assert pinning object is not moved https://github.com/ruby/mmtk/commit/8813e76bf8 --- gc/mmtk/src/pinning_registry.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gc/mmtk/src/pinning_registry.rs b/gc/mmtk/src/pinning_registry.rs index 71cf73eaf913b4..b498b508f1f97b 100644 --- a/gc/mmtk/src/pinning_registry.rs +++ b/gc/mmtk/src/pinning_registry.rs @@ -110,6 +110,11 @@ impl GCWork for PinPinningChildren { target_object ); if pin { + debug_assert!( + target_object.get_forwarded_object().is_none(), + "Trying to pin {target_object} but has been moved" + ); + pinned_objs.push(target_object); } target_object