diff options
| author | Peter Zhu <peter@peterzhu.ca> | 2024-01-22 15:00:36 -0500 |
|---|---|---|
| committer | Aaron Patterson <aaron.patterson@gmail.com> | 2024-01-22 15:07:39 -0800 |
| commit | 18471923660a5314e0543f0600a4a2278ed399cf (patch) | |
| tree | 4357d41177ace8fe3aa575a4e41632b529cc6b83 | |
| parent | a64e26c5d5363719c91e5db2a0c9946c7b2e85f9 (diff) | |
[PRISM] Fix block in aset
Fixes ruby/prism#2223.
| -rw-r--r-- | prism_compile.c | 7 | ||||
| -rw-r--r-- | test/ruby/test_compile_prism.rb | 9 |
2 files changed, 15 insertions, 1 deletions
diff --git a/prism_compile.c b/prism_compile.c index be47806fbd..8c4f0fed0a 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -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)); diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index 29f0530462..7705959f4c 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -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") |
