summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2021-08-12 23:19:15 -0700
committerTakashi Kokubun <takashikkbn@gmail.com>2021-08-12 23:26:44 -0700
commitac4d53bd461ff386cd45fdd484ffb6b628a251ad (patch)
tree9dd22e012d1feb655023819460e1e1090932ee8d
parent365da4c6ace385f08b97bd657ff5a118055e8ad1 (diff)
Don't cancel JIT-ed code on TracePoint :class
events get enabled
-rw-r--r--NEWS.md3
-rw-r--r--test/ruby/test_jit.rb8
-rw-r--r--vm_trace.c8
3 files changed, 17 insertions, 2 deletions
diff --git a/NEWS.md b/NEWS.md
index 6b78cec01a..f72756761c 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -173,6 +173,9 @@ Excluding feature bug fixes.
* The default `--jit-max-cache` is changed from 100 to 10000.
+* JIT-ed code is no longer cancelled when a TracePoint for class events
+ is enabled.
+
* The JIT compiler no longer skips compilation of methods longer than
1000 instructions.
diff --git a/test/ruby/test_jit.rb b/test/ruby/test_jit.rb
index d6306dcfc9..60e128b3d9 100644
--- a/test/ruby/test_jit.rb
+++ b/test/ruby/test_jit.rb
@@ -1101,6 +1101,14 @@ class TestJIT < Test::Unit::TestCase
end;
end
+ def test_not_cancel_by_tracepoint_class
+ assert_eval_with_jit("#{<<~"begin;"}\n#{<<~"end;"}", success_count: 1, min_calls: 2)
+ begin;
+ TracePoint.new(:class) {}.enable
+ 2.times {}
+ end;
+ end
+
def test_cancel_by_tracepoint
assert_eval_with_jit("#{<<~"begin;"}\n#{<<~"end;"}", success_count: 0, min_calls: 2)
begin;
diff --git a/vm_trace.c b/vm_trace.c
index b603293d34..ed218b8120 100644
--- a/vm_trace.c
+++ b/vm_trace.c
@@ -81,8 +81,12 @@ update_global_event_hook(rb_event_flag_t vm_events)
rb_event_flag_t enabled_iseq_events = ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS;
if (new_iseq_events & ~enabled_iseq_events) {
- // Stop calling all JIT-ed code. We can't rewrite existing JIT-ed code to trace_ insns for now.
- mjit_cancel_all("TracePoint is enabled");
+ // :class events are triggered only in ISEQ_TYPE_CLASS, but mjit_target_iseq_p ignores such iseqs.
+ // Thus we don't need to cancel JIT-ed code for :class events.
+ if (new_iseq_events != RUBY_EVENT_CLASS) {
+ // Stop calling all JIT-ed code. We can't rewrite existing JIT-ed code to trace_ insns for now.
+ mjit_cancel_all("TracePoint is enabled");
+ }
/* write all ISeqs if and only if new events are added */
rb_iseq_trace_set_all(new_iseq_events | enabled_iseq_events);