[PRISM] Fix case splat with no predicate

This commit is contained in:
Matt Valentine-House 2024-01-17 16:44:58 +00:00
parent 686b1655a0
commit 8a3e7f08b8
2 changed files with 24 additions and 2 deletions

View File

@ -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]; pm_node_t *condition_node = when_node->conditions.nodes[i];
if (PM_NODE_TYPE_P(condition_node, PM_SPLAT_NODE)) { 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); ADD_INSN (ret, &dummy_line_node, dup);
PM_COMPILE_NOT_POPPED(condition_node); PM_COMPILE_NOT_POPPED(condition_node);
ADD_INSN1(ret, &dummy_line_node, splatarray, Qfalse); ADD_INSN1(ret, &dummy_line_node, checkmatch,
ADD_INSN1(ret, &dummy_line_node, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_CASE | VM_CHECKMATCH_ARRAY)); INT2FIX(checkmatch_type | VM_CHECKMATCH_ARRAY));
} }
else { else {
PM_COMPILE_NOT_POPPED(condition_node); PM_COMPILE_NOT_POPPED(condition_node);

View File

@ -857,6 +857,17 @@ module Prism
end end
RUBY 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 # Test case without predicate
assert_prism_eval(<<~RUBY) assert_prism_eval(<<~RUBY)
case case
@ -866,6 +877,16 @@ module Prism
:ok :ok
end end
RUBY RUBY
# test splat with no predicate
assert_prism_eval(<<~RUBY)
case
when *[true]
:ok
else
:ng
end
RUBY
end end
def test_ElseNode def test_ElseNode