[PRISM] Don't pop several args related nodes

This commit is contained in:
Jemma Issroff 2023-11-20 16:16:22 -05:00
parent 150ed44d87
commit 6d447fa35f
2 changed files with 15 additions and 6 deletions

View file

@ -1354,8 +1354,8 @@ pm_setup_args(pm_arguments_node_t *arguments_node, int *flags, struct rb_callinf
case PM_ASSOC_NODE: { case PM_ASSOC_NODE: {
pm_assoc_node_t *assoc = (pm_assoc_node_t *)cur_node; pm_assoc_node_t *assoc = (pm_assoc_node_t *)cur_node;
PM_COMPILE(assoc->key); PM_COMPILE_NOT_POPPED(assoc->key);
PM_COMPILE(assoc->value); PM_COMPILE_NOT_POPPED(assoc->value);
cur_hash_size++; cur_hash_size++;
// If we're at the last keyword arg, or the last assoc node of this "set", // If we're at the last keyword arg, or the last assoc node of this "set",
@ -1386,7 +1386,7 @@ pm_setup_args(pm_arguments_node_t *arguments_node, int *flags, struct rb_callinf
} }
pm_assoc_splat_node_t *assoc_splat = (pm_assoc_splat_node_t *)cur_node; pm_assoc_splat_node_t *assoc_splat = (pm_assoc_splat_node_t *)cur_node;
PM_COMPILE(assoc_splat->value); PM_COMPILE_NOT_POPPED(assoc_splat->value);
*flags |= VM_CALL_KW_SPLAT | VM_CALL_KW_SPLAT_MUT; *flags |= VM_CALL_KW_SPLAT | VM_CALL_KW_SPLAT_MUT;
@ -1411,14 +1411,14 @@ pm_setup_args(pm_arguments_node_t *arguments_node, int *flags, struct rb_callinf
} }
else { else {
*kw_arg = rb_xmalloc_mul_add(len, sizeof(VALUE), sizeof(struct rb_callinfo_kwarg)); *kw_arg = rb_xmalloc_mul_add(len, sizeof(VALUE), sizeof(struct rb_callinfo_kwarg));
*flags |= VM_CALL_KWARG; *flags = VM_CALL_KWARG;
(*kw_arg)->keyword_len += len; (*kw_arg)->keyword_len = (int) len;
// TODO: Method callers like `foo(a => b)` // TODO: Method callers like `foo(a => b)`
for (size_t i = 0; i < len; i++) { for (size_t i = 0; i < len; i++) {
pm_assoc_node_t *assoc = (pm_assoc_node_t *)keyword_arg->elements.nodes[i]; pm_assoc_node_t *assoc = (pm_assoc_node_t *)keyword_arg->elements.nodes[i];
(*kw_arg)->keywords[i] = pm_static_literal_value(assoc->key, scope_node, parser); (*kw_arg)->keywords[i] = pm_static_literal_value(assoc->key, scope_node, parser);
PM_COMPILE(assoc->value); PM_COMPILE_NOT_POPPED(assoc->value);
} }
} }
break; break;

View file

@ -804,6 +804,15 @@ module Prism
# with arguments and popped # with arguments and popped
assert_prism_eval("eval '1'; 1") assert_prism_eval("eval '1'; 1")
# With different types of calling arguments
assert_prism_eval(<<-CODE)
def self.prism_test_call_node(**); end
prism_test_call_node(b: 1, **{})
CODE
assert_prism_eval(<<-CODE)
prism_test_call_node(:b => 1)
CODE
end end
def test_CallAndWriteNode def test_CallAndWriteNode