[PRISM] Fix crash with empty ensure blocks

Fixes ruby/prism#2179.
This commit is contained in:
Peter Zhu 2024-01-16 10:30:31 -05:00
Родитель 7bd7030a96
Коммит 07b9b53459
2 изменённых файлов: 19 добавлений и 1 удалений

Просмотреть файл

@ -3247,14 +3247,16 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret,
PM_PUTNIL_UNLESS_POPPED; PM_PUTNIL_UNLESS_POPPED;
} }
} }
ADD_LABEL(ret, eend); ADD_LABEL(ret, eend);
ADD_LABEL(ret, econt);
if (!popped) { if (!popped) {
PM_NOP; PM_NOP;
} }
pm_statements_node_t *statements = begin_node->ensure_clause->statements; pm_statements_node_t *statements = begin_node->ensure_clause->statements;
if (statements) { if (statements) {
PM_COMPILE((pm_node_t *)statements); PM_COMPILE((pm_node_t *)statements);
ADD_LABEL(ret, econt);
PM_POP_UNLESS_POPPED; PM_POP_UNLESS_POPPED;
} }

Просмотреть файл

@ -962,6 +962,22 @@ module Prism
end end
prism_test_ensure_node prism_test_ensure_node
CODE CODE
# Test empty ensure block
assert_prism_eval(<<~RUBY)
res = []
begin
begin
raise
ensure
end
rescue
res << "rescue"
end
res
RUBY
end end
def test_NextNode def test_NextNode