
Issue #21553 has been updated by k0kubun (Takashi Kokubun). ref: [Bug #9382], commit:58f800a278b8b70463f4afdbb23a918d8ab441ff ---------------------------------------- Feature #21553: Remove opt_aref_with and opt_aset_with instructions https://bugs.ruby-lang.org/issues/21553#change-114394 * Author: tenderlovemaking (Aaron Patterson) * Status: Closed ---------------------------------------- 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: #<ISeq:<main>@-e:1 (1,0)-(1,10)> 0000 putself ( 1)[Li] 0001 opt_send_without_block <calldata!mid:foo, argc:0, FCALL|VCALL|ARGS_SIMPLE> 0003 opt_aref_with "bar", <calldata!mid:[], argc:1, ARGS_SIMPLE> 0006 leave
Enabling frozen string literals will use `putobject` with `opt_aref`:
./miniruby --dump=insns --enable=frozen-string-literal -e'foo["bar"]' == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,10)> 0000 putself ( 1)[Li] 0001 opt_send_without_block <calldata!mid:foo, argc:0, FCALL|VCALL|ARGS_SIMPLE> 0003 putobject "bar" 0005 opt_aref <calldata!mid:[], argc:1, ARGS_SIMPLE>[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/