[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]