From 0462b1b350b0f86ce4cfebc195fe0f24005d28f4 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 12 Jan 2024 10:40:23 -0500 Subject: [PATCH] [PRISM] Fix splat in when Fixes ruby/prism#2147. --- prism_compile.c | 17 ++++++++++++++--- test/ruby/test_compile_prism.rb | 11 +++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index cab2af42e9..b235232843 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -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); } } diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index 7115597903..965f3d3c91 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -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