diff options
author | Jeremy Evans <[email protected]> | 2024-09-18 11:26:10 -0700 |
---|---|---|
committer | Jeremy Evans <[email protected]> | 2024-09-18 11:26:10 -0700 |
commit | 9c12c39ed175c634dfa0e56619cb30a49e292043 (patch) | |
tree | 26e8d683d72c3060423be8e3ded2fb178faf5fca /compile.c | |
parent | 07d3bf4832532ae7446c9a6924d79aed60a7a9a5 (diff) |
Revert "Fix evaluation order issue in f(**h, &h.delete(key))"
This reverts commit 07d3bf4832532ae7446c9a6924d79aed60a7a9a5.
No failures in the pull request CI, but there are now allocation
test failures.
Diffstat (limited to 'compile.c')
-rw-r--r-- | compile.c | 54 |
1 files changed, 14 insertions, 40 deletions
@@ -6284,21 +6284,6 @@ keyword_node_single_splat_p(NODE *kwnode) RNODE_LIST(RNODE_LIST(node)->nd_next)->nd_next == NULL; } -static void -compile_single_keyword_splat_mutable(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, - NODE *kwnode, unsigned int *flag_ptr) -{ - *flag_ptr |= VM_CALL_KW_SPLAT_MUT; - ADD_INSN1(args, argn, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - ADD_INSN1(args, argn, newhash, INT2FIX(0)); - compile_hash(iseq, args, kwnode, TRUE, FALSE); - ADD_SEND(args, argn, id_core_hash_merge_kwd, INT2FIX(2)); -} - -#define SPLATARRAY_FALSE 0 -#define SPLATARRAY_TRUE 1 -#define DUP_SINGLE_KW_SPLAT 2 - static int setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, unsigned int *dup_rest, unsigned int *flag_ptr, struct rb_callinfo_kwarg **kwarg_ptr) @@ -6318,12 +6303,7 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, len -= 1; } else { - if (keyword_node_single_splat_p(kwnode) && (*dup_rest & DUP_SINGLE_KW_SPLAT)) { - compile_single_keyword_splat_mutable(iseq, args, argn, kwnode, flag_ptr); - } - else { - compile_hash(iseq, args, kwnode, TRUE, FALSE); - } + compile_hash(iseq, args, kwnode, TRUE, FALSE); } } @@ -6332,8 +6312,8 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, case NODE_SPLAT: { // f(*a) NO_CHECK(COMPILE(args, "args (splat)", RNODE_SPLAT(argn)->nd_head)); - ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest & SPLATARRAY_TRUE)); - if (*dup_rest & SPLATARRAY_TRUE) *dup_rest &= ~SPLATARRAY_TRUE; + ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest)); + if (*dup_rest) *dup_rest = 0; if (flag_ptr) *flag_ptr |= VM_CALL_ARGS_SPLAT; RUBY_ASSERT(flag_ptr == NULL || (*flag_ptr & VM_CALL_KW_SPLAT) == 0); return 1; @@ -6355,8 +6335,8 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, } if (nd_type_p(RNODE_ARGSCAT(argn)->nd_head, NODE_LIST)) { - ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest & SPLATARRAY_TRUE)); - if (*dup_rest & SPLATARRAY_TRUE) *dup_rest &= ~SPLATARRAY_TRUE; + ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest)); + if (*dup_rest) *dup_rest = 0; argc += 1; } else if (!args_pushed) { @@ -6398,14 +6378,8 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, *flag_ptr |= VM_CALL_KW_SPLAT; if (!keyword_node_single_splat_p(kwnode)) { *flag_ptr |= VM_CALL_KW_SPLAT_MUT; - compile_hash(iseq, args, kwnode, TRUE, FALSE); - } - else if (*dup_rest & DUP_SINGLE_KW_SPLAT) { - compile_single_keyword_splat_mutable(iseq, args, argn, kwnode, flag_ptr); - } - else { - compile_hash(iseq, args, kwnode, TRUE, FALSE); } + compile_hash(iseq, args, kwnode, TRUE, FALSE); argc += 1; } @@ -6463,7 +6437,7 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, unsigned int *flag, struct rb_callinfo_kwarg **keywords) { VALUE ret; - unsigned int dup_rest = SPLATARRAY_TRUE, initial_dup_rest; + unsigned int dup_rest = 1, initial_dup_rest; if (argn) { const NODE *check_arg = nd_type_p(argn, NODE_BLOCK_PASS) ? @@ -6473,7 +6447,7 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, switch(nd_type(check_arg)) { case(NODE_SPLAT): // avoid caller side array allocation for f(*arg) - dup_rest = SPLATARRAY_FALSE; + dup_rest = 0; break; case(NODE_ARGSCAT): // avoid caller side array allocation for f(1, *arg) @@ -6487,20 +6461,20 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, nd_type_p(RNODE_ARGSPUSH(check_arg)->nd_body, NODE_HASH) && !RNODE_HASH(RNODE_ARGSPUSH(check_arg)->nd_body)->nd_brace); - if (dup_rest == SPLATARRAY_FALSE) { + if (!dup_rest) { // require allocation for keyword key/value/splat that may modify splatted argument NODE *node = RNODE_HASH(RNODE_ARGSPUSH(check_arg)->nd_body)->nd_head; while (node) { NODE *key_node = RNODE_LIST(node)->nd_head; if (key_node && setup_args_dup_rest_p(key_node)) { - dup_rest = SPLATARRAY_TRUE; + dup_rest = 1; break; } node = RNODE_LIST(node)->nd_next; NODE *value_node = RNODE_LIST(node)->nd_head; if (setup_args_dup_rest_p(value_node)) { - dup_rest = SPLATARRAY_TRUE; + dup_rest = 1; break; } @@ -6513,9 +6487,9 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, } } - if (check_arg != argn && setup_args_dup_rest_p(RNODE_BLOCK_PASS(argn)->nd_body)) { - // for block pass that may modify splatted argument, dup rest and kwrest if given - dup_rest = SPLATARRAY_TRUE | DUP_SINGLE_KW_SPLAT; + if (!dup_rest && (check_arg != argn) && setup_args_dup_rest_p(RNODE_BLOCK_PASS(argn)->nd_body)) { + // require allocation for block pass that may modify splatted argument + dup_rest = 1; } } initial_dup_rest = dup_rest; |