Drop eliminated catch-entries
Drop catch table entries used in eliminated block, as well as call_infos. [Bug #16184]
This commit is contained in:
parent
03284fb911
commit
79d5332a2d
12
compile.c
12
compile.c
@ -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;
|
LABEL *then_label, *else_label, *end_label;
|
||||||
VALUE branches = Qfalse;
|
VALUE branches = Qfalse;
|
||||||
int ci_size, ci_kw_size;
|
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(cond_seq);
|
||||||
INIT_ANCHOR(then_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_size = body->ci_size;
|
||||||
ci_kw_size = body->ci_kw_size;
|
ci_kw_size = body->ci_kw_size;
|
||||||
CHECK(COMPILE_(then_seq, "then", node_body, popped));
|
CHECK(COMPILE_(then_seq, "then", node_body, popped));
|
||||||
|
catch_table = ISEQ_COMPILE_DATA(iseq)->catch_table_ary;
|
||||||
if (!then_label->refcnt) {
|
if (!then_label->refcnt) {
|
||||||
body->ci_size = ci_size;
|
body->ci_size = ci_size;
|
||||||
body->ci_kw_size = ci_kw_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_size = body->ci_size;
|
||||||
ci_kw_size = body->ci_kw_size;
|
ci_kw_size = body->ci_kw_size;
|
||||||
CHECK(COMPILE_(else_seq, "else", node_else, popped));
|
CHECK(COMPILE_(else_seq, "else", node_else, popped));
|
||||||
|
catch_table = ISEQ_COMPILE_DATA(iseq)->catch_table_ary;
|
||||||
if (!else_label->refcnt) {
|
if (!else_label->refcnt) {
|
||||||
body->ci_size = ci_size;
|
body->ci_size = ci_size;
|
||||||
body->ci_kw_size = ci_kw_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);
|
ADD_SEQ(ret, cond_seq);
|
||||||
|
@ -825,4 +825,19 @@ class TestRubyOptimization < Test::Unit::TestCase
|
|||||||
}
|
}
|
||||||
end;
|
end;
|
||||||
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
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user