diff options
author | Jeremy Evans <[email protected]> | 2023-11-08 15:56:53 -0800 |
---|---|---|
committer | Jeremy Evans <[email protected]> | 2023-12-09 13:15:47 -0800 |
commit | a950f230788d51e13d16596e37cb77e4cc6e2311 () | |
tree | 0110843746e7703e38e660dbe52da776656eade7 /insns.def | |
parent | c0b6ea7c8b5dc6e48ecf6e14e1dbd135d079f0fc (diff) |
Ensure f(**kw, &block) calls kw.to_hash before block.to_proc
Previously, block.to_proc was called first, by vm_caller_setup_arg_block. kw.to_hash was called later inside CALLER_SETUP_ARG or setup_parameters_complex. This adds a splatkw instruction that is inserted before sends with ARGS_BLOCKARG and KW_SPLAT and without KW_SPLAT_MUT. This is not needed in the KW_SPLAT_MUT case, because then you know the value is a hash, and you don't need to call to_hash on it. The splatkw instruction checks whether the second to top block is a hash, and if not, replaces it with the value of calling to_hash on it (using rb_to_hash_type). As it is always before a send with ARGS_BLOCKARG and KW_SPLAT, second to top is the keyword splat, and top is the passed block.
-rw-r--r-- | insns.def | 11 |
1 files changed, 11 insertions, 0 deletions
@@ -527,6 +527,17 @@ splatarray obj = vm_splat_array(flag, ary); } /* put new Hash from n elements. n must be an even number. */ DEFINE_INSN newhash |