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 /prism_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 'prism_compile.c')
-rw-r--r-- | prism_compile.c | 40 |
1 files changed, 11 insertions, 29 deletions
diff --git a/prism_compile.c b/prism_compile.c index f2a469a398..044ef5083d 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -1536,13 +1536,9 @@ pm_compile_hash_elements(rb_iseq_t *iseq, const pm_node_t *node, const pm_node_l #undef FLUSH_CHUNK } -#define SPLATARRAY_FALSE 0 -#define SPLATARRAY_TRUE 1 -#define DUP_SINGLE_KW_SPLAT 2 - // This is details. Users should call pm_setup_args() instead. static int -pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *block, int *flags, const bool has_regular_blockarg, struct rb_callinfo_kwarg **kw_arg, int *dup_rest, rb_iseq_t *iseq, LINK_ANCHOR *const ret, pm_scope_node_t *scope_node, const pm_node_location_t *node_location) +pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *block, int *flags, const bool has_regular_blockarg, struct rb_callinfo_kwarg **kw_arg, VALUE *dup_rest, rb_iseq_t *iseq, LINK_ANCHOR *const ret, pm_scope_node_t *scope_node, const pm_node_location_t *node_location) { const pm_node_location_t location = *node_location; @@ -1580,18 +1576,9 @@ pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *b // in this case, so mark the method as passing mutable // keyword splat. *flags |= VM_CALL_KW_SPLAT_MUT; - pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); - } - else if (*dup_rest & DUP_SINGLE_KW_SPLAT) { - *flags |= VM_CALL_KW_SPLAT_MUT; - PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - PUSH_INSN1(ret, location, newhash, INT2FIX(0)); - pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); - PUSH_SEND(ret, location, id_core_hash_merge_kwd, INT2FIX(2)); - } - else { - pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); } + + pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); } else { // We need to first figure out if all elements of the @@ -1697,8 +1684,8 @@ pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *b // foo(a, *b, c) // ^^ if (index + 1 < arguments->size || has_regular_blockarg) { - PUSH_INSN1(ret, location, splatarray, (*dup_rest & SPLATARRAY_TRUE) ? Qtrue : Qfalse); - if (*dup_rest & SPLATARRAY_TRUE) *dup_rest &= ~SPLATARRAY_TRUE; + PUSH_INSN1(ret, location, splatarray, *dup_rest); + if (*dup_rest == Qtrue) *dup_rest = Qfalse; } // If this is the first spalt array seen and it's the last // parameter, we don't want splatarray to dup it. @@ -1859,7 +1846,7 @@ pm_setup_args_dup_rest_p(const pm_node_t *node) static int pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, int *flags, struct rb_callinfo_kwarg **kw_arg, rb_iseq_t *iseq, LINK_ANCHOR *const ret, pm_scope_node_t *scope_node, const pm_node_location_t *node_location) { - int dup_rest = SPLATARRAY_TRUE; + VALUE dup_rest = Qtrue; const pm_node_list_t *arguments; size_t arguments_size; @@ -1876,23 +1863,23 @@ pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, // Start by assuming that dup_rest=false, then check each element of the // hash to ensure we don't need to flip it back to true (in case one of // the elements could potentially mutate the array). - dup_rest = SPLATARRAY_FALSE; + dup_rest = Qfalse; const pm_keyword_hash_node_t *keyword_hash = (const pm_keyword_hash_node_t *) arguments->nodes[arguments_size - 1]; const pm_node_list_t *elements = &keyword_hash->elements; - for (size_t index = 0; dup_rest == SPLATARRAY_FALSE && index < elements->size; index++) { + for (size_t index = 0; dup_rest == Qfalse && index < elements->size; index++) { const pm_node_t *element = elements->nodes[index]; switch (PM_NODE_TYPE(element)) { case PM_ASSOC_NODE: { const pm_assoc_node_t *assoc = (const pm_assoc_node_t *) element; - if (pm_setup_args_dup_rest_p(assoc->key) || pm_setup_args_dup_rest_p(assoc->value)) dup_rest = SPLATARRAY_TRUE; + if (pm_setup_args_dup_rest_p(assoc->key) || pm_setup_args_dup_rest_p(assoc->value)) dup_rest = Qtrue; break; } case PM_ASSOC_SPLAT_NODE: { const pm_assoc_splat_node_t *assoc = (const pm_assoc_splat_node_t *) element; - if (assoc->value != NULL && pm_setup_args_dup_rest_p(assoc->value)) dup_rest = SPLATARRAY_TRUE; + if (assoc->value != NULL && pm_setup_args_dup_rest_p(assoc->value)) dup_rest = Qtrue; break; } default: @@ -1901,7 +1888,7 @@ pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, } } - int initial_dup_rest = dup_rest; + VALUE initial_dup_rest = dup_rest; int argc; if (block && PM_NODE_TYPE_P(block, PM_BLOCK_ARGUMENT_NODE)) { @@ -1910,11 +1897,6 @@ pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, // duplicate the array. bool regular_block_arg = true; - if (pm_setup_args_dup_rest_p(block)) { - dup_rest = SPLATARRAY_TRUE | DUP_SINGLE_KW_SPLAT; - initial_dup_rest = dup_rest; - } - DECL_ANCHOR(block_arg); INIT_ANCHOR(block_arg); pm_compile_node(iseq, block, block_arg, false, scope_node); |