Skip to content
  • Jeremy Evans's avatar
    a950f230
    Ensure f(**kw, &block) calls kw.to_hash before block.to_proc · a950f230
    Jeremy Evans authored
    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.
    a950f230
    Ensure f(**kw, &block) calls kw.to_hash before block.to_proc
    Jeremy Evans authored
    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.
Loading