summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Valentine-House <matt@eightbitraptor.com>2024-01-17 16:44:58 +0000
committerMatt Valentine-House <matt@eightbitraptor.com>2024-01-18 20:03:27 +0000
commit8a3e7f08b85a9a21077c420b6fa76f56899e90ee (patch)
treec9a3cee3926d0177ea6ee64d2b19ff6cbccfb974
parent686b1655a008f194d4daccf2d423d94c30633206 (diff)
[PRISM] Fix case splat with no predicate
-rw-r--r--prism_compile.c5
-rw-r--r--test/ruby/test_compile_prism.rb21
2 files changed, 24 insertions, 2 deletions
diff --git a/prism_compile.c b/prism_compile.c
index 43ac0af160..2d1dd99388 100644
--- a/prism_compile.c
+++ b/prism_compile.c
@@ -3514,10 +3514,11 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret,
pm_node_t *condition_node = when_node->conditions.nodes[i];
if (PM_NODE_TYPE_P(condition_node, PM_SPLAT_NODE)) {
+ int checkmatch_type = has_predicate ? VM_CHECKMATCH_TYPE_CASE : VM_CHECKMATCH_TYPE_WHEN;
ADD_INSN (ret, &dummy_line_node, dup);
PM_COMPILE_NOT_POPPED(condition_node);
- ADD_INSN1(ret, &dummy_line_node, splatarray, Qfalse);
- ADD_INSN1(ret, &dummy_line_node, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_CASE | VM_CHECKMATCH_ARRAY));
+ ADD_INSN1(ret, &dummy_line_node, checkmatch,
+ INT2FIX(checkmatch_type | VM_CHECKMATCH_ARRAY));
}
else {
PM_COMPILE_NOT_POPPED(condition_node);
diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb
index f1274fccf5..0765a946a5 100644
--- a/test/ruby/test_compile_prism.rb
+++ b/test/ruby/test_compile_prism.rb
@@ -857,6 +857,17 @@ module Prism
end
RUBY
+ # Test splat in when
+ assert_prism_eval(<<~RUBY)
+ ary = [1, 2]
+ case 1
+ when :foo, *ary
+ :ok
+ else
+ :ng
+ end
+ RUBY
+
# Test case without predicate
assert_prism_eval(<<~RUBY)
case
@@ -866,6 +877,16 @@ module Prism
:ok
end
RUBY
+
+ # test splat with no predicate
+ assert_prism_eval(<<~RUBY)
+ case
+ when *[true]
+ :ok
+ else
+ :ng
+ end
+ RUBY
end
def test_ElseNode