[ruby-core:113291] [Ruby master Feature#18825] Specialized instruction for "array literal + `.hash`"

Issue #18825 has been updated by tenderlovemaking (Aaron Patterson). Status changed from Open to Rejected Closing in favor of #18897 ---------------------------------------- Feature #18825: Specialized instruction for "array literal + `.hash`" https://bugs.ruby-lang.org/issues/18825#change-102849 * Author: tenderlovemaking (Aaron Patterson) * Status: Rejected * 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: #<ISeq:hash@test.rb:1 (1,0)-(3,3)> (catch: FALSE) 0000 getinstancevariable :@a, <is:0> ( 2)[LiCa] 0003 getinstancevariable :@b, <is:1> 0006 getinstancevariable :@c, <is:2> 0009 newarray 3 0011 opt_send_without_block <callinfo!mid:hash, argc:0, ARGS_SIMPLE>, <callcache> 0014 leave ``` ISeqs after the optimization: ``` == disasm: #<ISeq:hash@test.rb:1 (1,0)-(3,3)> (catch: FALSE) 0000 getinstancevariable :@a, <is:0> ( 2)[LiCa] 0003 getinstancevariable :@b, <is:1> 0006 getinstancevariable :@c, <is:2> 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/
participants (1)
-
tenderlovemaking (Aaron Patterson)