From: "tenderlovemaking (Aaron Patterson) via ruby-core" Date: 2025-08-25T23:51:47+00:00 Subject: [ruby-core:123069] [Ruby Bug#21553] Remove opt_aref_with and opt_aset_with instructions Issue #21553 has been reported by tenderlovemaking (Aaron Patterson). ---------------------------------------- Bug #21553: Remove opt_aref_with and opt_aset_with instructions https://bugs.ruby-lang.org/issues/21553 * Author: tenderlovemaking (Aaron Patterson) * Status: Open * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- Hi, I'd like to remove the `opt_aref_with` and `opt_aset_with` instructions. I think they are fairly rare these days. Removing them will simplify the YARV compiler, the JIT compilers, and fix an issue with warnings. For background, these instructions are used with code like `foo["bar"]`, but only when the string literal isn't frozen: ``` > ./miniruby --dump=insns -e'foo["bar"]' == disasm: #@-e:1 (1,0)-(1,10)> 0000 putself ( 1)[Li] 0001 opt_send_without_block 0003 opt_aref_with "bar", 0006 leave ``` Enabling frozen string literals will use `putobject` with `opt_aref`: ``` > ./miniruby --dump=insns --enable=frozen-string-literal -e'foo["bar"]' == disasm: #@-e:1 (1,0)-(1,10)> 0000 putself ( 1)[Li] 0001 opt_send_without_block 0003 putobject "bar" 0005 opt_aref [CcCr] 0007 leave ``` The optimization avoids duping the string if the receiver happens to be a hash. I tested this with YJIT benchmarks and didn't see any impact. To be sure, I checked the lobsters benchmark to find uses of this instruction, and I found it was only used 4 times during any particular request which explained why removing the instruction didn't impact runtime performance. Also, removing these instructions fixes a bug where a "chilled string warning" won't show up. For example: ```ruby class Foo def self.[](x)= x.gsub!(/hello/, "hi") end Foo["hello world"] ``` I would expect to see a "chilled string" warning with this code, but no warning shows up. Removing these instructions makes the warning show up as expected. I sent a patch to remove the instructions here: https://github.com/ruby/ruby/pull/14336 -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/