diff options
| author | Matt Valentine-House <matt@eightbitraptor.com> | 2024-01-17 16:44:58 +0000 |
|---|---|---|
| committer | Matt Valentine-House <matt@eightbitraptor.com> | 2024-01-18 20:03:27 +0000 |
| commit | 8a3e7f08b85a9a21077c420b6fa76f56899e90ee (patch) | |
| tree | c9a3cee3926d0177ea6ee64d2b19ff6cbccfb974 | |
| parent | 686b1655a008f194d4daccf2d423d94c30633206 (diff) | |
[PRISM] Fix case splat with no predicate
| -rw-r--r-- | prism_compile.c | 5 | ||||
| -rw-r--r-- | test/ruby/test_compile_prism.rb | 21 |
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 |
