[PRISM] Fix splat in when

Fixes ruby/prism#2147.
This commit is contained in:
Peter Zhu 2024-01-12 10:40:23 -05:00
parent 8b8dcc7af1
commit 0462b1b350
2 changed files with 25 additions and 3 deletions

View File

@ -3380,9 +3380,20 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret,
pm_when_node_t *when_node = (pm_when_node_t *)conditions.nodes[i];
for (size_t i = 0; i < when_node->conditions.size; i++) {
PM_COMPILE_NOT_POPPED(when_node->conditions.nodes[i]);
ADD_INSN1(ret, &dummy_line_node, topn, INT2FIX(1));
ADD_SEND_WITH_FLAG(ret, &dummy_line_node, idEqq, INT2NUM(1), INT2FIX(VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE));
pm_node_t *condition_node = when_node->conditions.nodes[i];
if (PM_NODE_TYPE_P(condition_node, PM_SPLAT_NODE)) {
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));
}
else {
PM_COMPILE_NOT_POPPED(condition_node);
ADD_INSN1(ret, &dummy_line_node, topn, INT2FIX(1));
ADD_SEND_WITH_FLAG(ret, &dummy_line_node, idEqq, INT2NUM(1), INT2FIX(VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE));
}
ADD_INSNL(ret, &dummy_line_node, branchif, label);
}
}

View File

@ -767,6 +767,17 @@ module Prism
end
prism_test_case_node
CODE
# Test splat in when
assert_prism_eval(<<~RUBY)
ary = [1, 2]
case 1
when *ary
:ok
else
:ng
end
RUBY
end
def test_ElseNode