summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2024-01-22 15:00:36 -0500
committerAaron Patterson <aaron.patterson@gmail.com>2024-01-22 15:07:39 -0800
commit18471923660a5314e0543f0600a4a2278ed399cf (patch)
tree4357d41177ace8fe3aa575a4e41632b529cc6b83
parenta64e26c5d5363719c91e5db2a0c9946c7b2e85f9 (diff)
[PRISM] Fix block in aset
Fixes ruby/prism#2223.
-rw-r--r--prism_compile.c7
-rw-r--r--test/ruby/test_compile_prism.rb9
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")