diff options
author | Takashi Kokubun <takashikkbn@gmail.com> | 2022-12-24 01:13:40 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-24 01:13:40 -0800 |
commit | b9332ac8e7126066ac4238443d63eaa4c06789f9 (patch) | |
tree | 1d3d45ec28ddbcc7e124d026540be61cf4ef3840 /lib/ruby_vm | |
parent | d521c9e5a7ed603f8f1aaa9a9a66c3cc80599b0c (diff) |
MJIT: Cancel all on disastrous situations (#7019)
I noticed this while running test_yjit with --mjit-call-threshold=1,
which redefines `Integer#<`. When Ruby is monkey-patched,
MJIT itself could be broken.
Similarly, Ruby scripts could break MJIT in many different ways. I
prepared the same set of hooks as YJIT so that we could possibly
override it and disable it on those moments. Every constant under
RubyVM::MJIT is private and thus it's an unsupported behavior though.
Notes
Notes:
Merged-By: k0kubun <takashikkbn@gmail.com>
Diffstat (limited to 'lib/ruby_vm')
-rw-r--r-- | lib/ruby_vm/mjit/hooks.rb | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/ruby_vm/mjit/hooks.rb b/lib/ruby_vm/mjit/hooks.rb new file mode 100644 index 0000000000..3fb1004111 --- /dev/null +++ b/lib/ruby_vm/mjit/hooks.rb @@ -0,0 +1,32 @@ +module RubyVM::MJIT::Hooks # :nodoc: all + C = RubyVM::MJIT.const_get(:C, false) + + def self.on_bop_redefined(_redefined_flag, _bop) + C.mjit_cancel_all("BOP is redefined") + end + + def self.on_cme_invalidate(_cme) + # to be used later + end + + def self.on_ractor_spawn + C.mjit_cancel_all("Ractor is spawned") + end + + def self.on_constant_state_changed(_id) + # to be used later + end + + def self.on_constant_ic_update(_iseq, _ic, _insn_idx) + # to be used later + end + + def self.on_tracing_invalidate_all(new_iseq_events) + # Stop calling all JIT-ed code. We can't rewrite existing JIT-ed code to trace_ insns for now. + # :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 != C.RUBY_EVENT_CLASS + C.mjit_cancel_all("TracePoint is enabled") + end + end +end |