Drop eliminated catch-entries

Drop catch table entries used in eliminated block, as well as
call_infos.  [Bug #16184]
This commit is contained in:
Nobuyoshi Nakada 2019-09-27 21:12:27 +09:00
parent 03284fb911
commit 79d5332a2d
No known key found for this signature in database
GPG Key ID: 4BC7D6DF58D8DF60
2 changed files with 27 additions and 0 deletions

View File

@ -5118,6 +5118,8 @@ compile_if(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int
LABEL *then_label, *else_label, *end_label;
VALUE branches = Qfalse;
int ci_size, ci_kw_size;
VALUE catch_table = ISEQ_COMPILE_DATA(iseq)->catch_table_ary;
long catch_table_size = NIL_P(catch_table) ? 0 : RARRAY_LEN(catch_table);
INIT_ANCHOR(cond_seq);
INIT_ANCHOR(then_seq);
@ -5132,17 +5134,27 @@ compile_if(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int
ci_size = body->ci_size;
ci_kw_size = body->ci_kw_size;
CHECK(COMPILE_(then_seq, "then", node_body, popped));
catch_table = ISEQ_COMPILE_DATA(iseq)->catch_table_ary;
if (!then_label->refcnt) {
body->ci_size = ci_size;
body->ci_kw_size = ci_kw_size;
if (!NIL_P(catch_table)) rb_ary_set_len(catch_table, catch_table_size);
}
else {
if (!NIL_P(catch_table)) catch_table_size = RARRAY_LEN(catch_table);
}
ci_size = body->ci_size;
ci_kw_size = body->ci_kw_size;
CHECK(COMPILE_(else_seq, "else", node_else, popped));
catch_table = ISEQ_COMPILE_DATA(iseq)->catch_table_ary;
if (!else_label->refcnt) {
body->ci_size = ci_size;
body->ci_kw_size = ci_kw_size;
if (!NIL_P(catch_table)) rb_ary_set_len(catch_table, catch_table_size);
}
else {
if (!NIL_P(catch_table)) catch_table_size = RARRAY_LEN(catch_table);
}
ADD_SEQ(ret, cond_seq);

View File

@ -825,4 +825,19 @@ class TestRubyOptimization < Test::Unit::TestCase
}
end;
end
def test_optimized_rescue
assert_in_out_err("", "#{<<~"begin;"}\n#{<<~'end;'}", [], /END \(RuntimeError\)/)
begin;
if false
begin
require "some_mad_stuff"
rescue LoadError
puts "no mad stuff loaded"
end
end
raise "END"
end;
end
end