summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-09-27 21:12:27 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-09-27 21:12:27 +0900
commit79d5332a2da0e2743a77480aebfca256a54a962e (patch)
tree917226ea47b7d1530f08f2ee5f22c43fc28c6b66
parent03284fb91151bff5e12f1b7d5cdb0589f1ee43fb (diff)
Drop eliminated catch-entries
Drop catch table entries used in eliminated block, as well as call_infos. [Bug #16184]
-rw-r--r--compile.c12
-rw-r--r--test/ruby/test_optimization.rb15
2 files changed, 27 insertions, 0 deletions
diff --git a/compile.c b/compile.c
index 68c7e5a71d..5bd2315b7b 100644
--- a/compile.c
+++ b/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;
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);
diff --git a/test/ruby/test_optimization.rb b/test/ruby/test_optimization.rb
index ed779fe5a8..6a9e9601f4 100644
--- a/test/ruby/test_optimization.rb
+++ b/test/ruby/test_optimization.rb
@@ -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