From cb98b018c05832d183812b03fb133cd11edee04b Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 31 Jan 2024 13:42:11 -0500 Subject: [PATCH] [PRISM] Fix else with rescue Fixes ruby/prism#2307. --- prism_compile.c | 3 ++- test/ruby/test_compile_prism.rb | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/prism_compile.c b/prism_compile.c index f5648381bb0bdb..abfcab10ab5569 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -3583,12 +3583,13 @@ pm_compile_rescue(rb_iseq_t *iseq, pm_begin_node_t *begin_node, LINK_ANCHOR *con } ISEQ_COMPILE_DATA(iseq)->in_rescue = prev_in_rescue; + ADD_LABEL(ret, lend); + if (begin_node->else_clause) { PM_POP_UNLESS_POPPED; PM_COMPILE((pm_node_t *)begin_node->else_clause); } - ADD_LABEL(ret, lend); PM_NOP; ADD_LABEL(ret, lcont); diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index e4748e3898616a..d004eb9ce77d64 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -1395,6 +1395,23 @@ def test_RescueNode end end CODE + + # Test RescueNode with ElseNode + assert_prism_eval(<<~RUBY) + calls = [] + begin + begin + rescue RuntimeError + calls << 1 + else + calls << 2 + raise RuntimeError + end + rescue RuntimeError + end + + calls + RUBY end def test_RescueModifierNode