From: "tenderlovemaking (Aaron Patterson)" Date: 2022-06-14T17:24:44+00:00 Subject: [ruby-core:108914] [Ruby master Feature#18825] Specialized instruction for "array literal + `.hash`" Issue #18825 has been updated by tenderlovemaking (Aaron Patterson). mame (Yusuke Endoh) wrote in #note-1: > Just an idea. Is it possible to introduce a general instruction like `opt_newarray_send` instead of individual `opt_newarray_*` instructions? It should be possible (IMO). But I guess it means the bytecode might be larger for `opt_newarray_min` and `opt_newarray_max` because we probably need to add a parameter for `opt_newarray_send`. Maybe it's not a big deal though. I will try making a patch. ---------------------------------------- Feature #18825: Specialized instruction for "array literal + `.hash`" https://bugs.ruby-lang.org/issues/18825#change-97999 * Author: tenderlovemaking (Aaron Patterson) * Status: Open * Priority: Normal ---------------------------------------- Feature #18611 is merged. That feature encourages people to write hash methods like this: ``` def hash [@a, @b, @c].hash end ``` I would like to add a specialized instruction for this case `opt_newarray_hash`. It's similar to `opt_newarray_max` and `opt_newarray_min` but for the hash method. ISeqs before the optimization: ``` == disasm: # (catch: FALSE) 0000 getinstancevariable :@a, ( 2)[LiCa] 0003 getinstancevariable :@b, 0006 getinstancevariable :@c, 0009 newarray 3 0011 opt_send_without_block , 0014 leave ``` ISeqs after the optimization: ``` == disasm: # (catch: FALSE) 0000 getinstancevariable :@a, ( 2)[LiCa] 0003 getinstancevariable :@b, 0006 getinstancevariable :@c, 0009 opt_newarray_hash 3 0011 leave ``` The new instruction allows us to avoid allocating a new array and also avoid pushing a stack frame. The implementation is [here](https://github.com/ruby/ruby/pull/5980), and I've also attached a patch. ---Files-------------------------------- 0001-Emit-special-instruction-for-array-literal-.hash.patch (4.91 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: