summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-08-04 14:29:17 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-08-04 14:29:17 +0000
commitfabb2fed252c634d9196813d452667e8a0ed80ac (patch)
treee3309c8c6737cf70569f645c061b1a02b6d1bdb2
parent194a55259bc5d58b48c00f01030b460072aa7fd3 (diff)
merge revision(s) 66977: [Backport #15578]
Revert r63383, r63248 "compile.c: copy a short insn with leave" When copying `leave` insn, TRACE also should be copied if it is present, but this optimization is trivial and not worth the complexity. [ruby-core:91366] [Bug #15578] 4cae5353c03009beb1e0a1619422072773580609 5afd479de63b6609ddcd1510da94d2c1ac384f7f git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67726 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--compile.c19
-rw-r--r--test/coverage/test_coverage.rb4
-rw-r--r--test/ruby/test_settracefunc.rb12
-rw-r--r--version.h4
4 files changed, 20 insertions, 19 deletions
diff --git a/compile.c b/compile.c
index d6e6c8f4fa..4ceb8951b7 100644
--- a/compile.c
+++ b/compile.c
@@ -2709,7 +2709,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
optimize_checktype(iseq, iobj);
if (IS_INSN_ID(iobj, jump)) {
- INSN *niobj, *diobj, *piobj, *dniobj;
+ INSN *niobj, *diobj, *piobj;
diobj = (INSN *)get_destination_insn(iobj);
niobj = (INSN *)get_next_insn(iobj);
@@ -2740,11 +2740,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
remove_unreachable_chunk(iseq, iobj->link.next);
goto again;
}
- else if (dniobj = 0,
- IS_INSN_ID(diobj, leave) ||
- (diobj->operand_size == 0 &&
- (dniobj = (INSN *)get_next_insn(diobj)) != 0 &&
- (IS_INSN_ID(dniobj, leave) || (dniobj = 0)))) {
+ else if (IS_INSN_ID(diobj, leave)) {
INSN *pop;
/*
* jump LABEL
@@ -2760,19 +2756,12 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
*/
/* replace */
unref_destination(iobj, 0);
- iobj->insn_id = diobj->insn_id;
+ iobj->insn_id = BIN(leave);
iobj->operand_size = 0;
iobj->insn_info = diobj->insn_info;
- if (dniobj) {
- dniobj = new_insn_body(iseq, dniobj->insn_info.line_no, BIN(leave), 0);
- ELEM_INSERT_NEXT(&iobj->link, &dniobj->link);
- }
- else {
- dniobj = iobj;
- }
/* adjust stack depth */
pop = new_insn_body(iseq, diobj->insn_info.line_no, BIN(pop), 0);
- ELEM_INSERT_NEXT(&dniobj->link, &pop->link);
+ ELEM_INSERT_NEXT(&iobj->link, &pop->link);
goto again;
}
else if (IS_INSN(iobj->link.prev) &&
diff --git a/test/coverage/test_coverage.rb b/test/coverage/test_coverage.rb
index 6a58706440..30523c341a 100644
--- a/test/coverage/test_coverage.rb
+++ b/test/coverage/test_coverage.rb
@@ -171,8 +171,8 @@ class TestCoverage < Test::Unit::TestCase
result = {
:branches => {
[:"&.", 0, 1, 0, 1, 8] => {
- [:then, 1, 1, 0, 1, 8] => 1,
- [:else, 2, 1, 0, 1, 8] => 0,
+ [:then, 1, 1, 0, 1, 8] => 0,
+ [:else, 2, 1, 0, 1, 8] => 1,
},
},
}
diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb
index 2ada093f8d..6021038fe9 100644
--- a/test/ruby/test_settracefunc.rb
+++ b/test/ruby/test_settracefunc.rb
@@ -2115,4 +2115,16 @@ class TestSetTraceFunc < Test::Unit::TestCase
}
assert_equal [], events
end
+
+ def test_return_event_with_rescue
+ obj = Object.new
+ def obj.example
+ 1 if 1 == 1
+ rescue
+ end
+ ok = false
+ tp = TracePoint.new(:return) {ok = true}
+ tp.enable {obj.example}
+ assert ok, "return event should be emitted"
+ end
end
diff --git a/version.h b/version.h
index b81f9d7aa0..4f26133dca 100644
--- a/version.h
+++ b/version.h
@@ -1,10 +1,10 @@
#define RUBY_VERSION "2.6.3"
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 76
+#define RUBY_PATCHLEVEL 77
#define RUBY_RELEASE_YEAR 2019
#define RUBY_RELEASE_MONTH 8
-#define RUBY_RELEASE_DAY 3
+#define RUBY_RELEASE_DAY 4
#include "ruby/version.h"