ruby-changes:67141
From: Takashi <ko1@a...>
Date: Fri, 13 Aug 2021 15:28:17 +0900 (JST)
Subject: [ruby-changes:67141] ac4d53bd46 (master): Don't cancel JIT-ed code on TracePoint :class
https://git.ruby-lang.org/ruby.git/commit/?id=ac4d53bd46 From ac4d53bd461ff386cd45fdd484ffb6b628a251ad Mon Sep 17 00:00:00 2001 From: Takashi Kokubun <takashikkbn@g...> Date: Thu, 12 Aug 2021 23:19:15 -0700 Subject: Don't cancel JIT-ed code on TracePoint :class events get enabled --- NEWS.md | 3 +++ test/ruby/test_jit.rb | 8 ++++++++ vm_trace.c | 8 ++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 6b78cec..f727567 100644 --- a/NEWS.md +++ b/NEWS.md @@ -173,6 +173,9 @@ Excluding feature bug fixes. https://github.com/ruby/ruby/blob/trunk/NEWS.md#L173 * 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 d6306dc..60e128b 100644 --- a/test/ruby/test_jit.rb +++ b/test/ruby/test_jit.rb @@ -1101,6 +1101,14 @@ class TestJIT < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_jit.rb#L1101 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 b603293..ed218b8 100644 --- a/vm_trace.c +++ b/vm_trace.c @@ -81,8 +81,12 @@ update_global_event_hook(rb_event_flag_t vm_events) https://github.com/ruby/ruby/blob/trunk/vm_trace.c#L81 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); -- cgit v1.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/