[PRISM] Fix block in aset

Fixes ruby/prism#2223.
This commit is contained in:
Peter Zhu 2024-01-22 15:00:36 -05:00 committed by Aaron Patterson
parent a64e26c5d5
commit 1847192366
2 changed files with 15 additions and 1 deletions

View File

@ -2711,7 +2711,12 @@ pm_compile_call(rb_iseq_t *iseq, const pm_call_node_t *call_node, LINK_ANCHOR *c
}
if (pm_node->flags & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) {
if (flags & VM_CALL_ARGS_SPLAT) {
if (flags & VM_CALL_ARGS_BLOCKARG) {
ADD_INSN1(ret, &dummy_line_node, topn, INT2FIX(1));
ADD_INSN1(ret, &dummy_line_node, setn, INT2FIX(orig_argc + 3));
PM_POP;
}
else if (flags & VM_CALL_ARGS_SPLAT) {
ADD_INSN(ret, &dummy_line_node, dup);
ADD_INSN1(ret, &dummy_line_node, putobject, INT2FIX(-1));
ADD_SEND_WITH_FLAG(ret, &dummy_line_node, idAREF, INT2FIX(1), INT2FIX(0));

View File

@ -1762,6 +1762,15 @@ end
obj[*[1]] = 3
RUBY
# Test passing block inside of []=
assert_prism_eval(<<~RUBY)
obj = Object.new
def obj.[]=(a); end
p = proc {}
obj[&p] = 4
RUBY
assert_prism_eval(<<-CODE)
def self.prism_opt_var_trail_hash(a = nil, *b, c, **d); end
prism_opt_var_trail_hash("a")