diff options
author | Takashi Kokubun <takashikkbn@gmail.com> | 2023-03-05 22:09:57 -0800 |
---|---|---|
committer | Takashi Kokubun <takashikkbn@gmail.com> | 2023-03-05 23:28:59 -0800 |
commit | 22d944c8b76be04dc437100c46626db5fe9dd7f0 (patch) | |
tree | 81d24efc17ab8045017d94d4be739879d5dccdd6 | |
parent | d6814fa24f403c9152ab9727782d45f9f5f2c446 (diff) | |
download | ruby-22d944c8b76be04dc437100c46626db5fe9dd7f0.tar.gz |
Avoid crashing at a random ISEQ access
[Feature #19420]
-rw-r--r-- | lib/ruby_vm/mjit/exit_compiler.rb | 2 | ||||
-rw-r--r-- | mjit.c | 5 |
2 files changed, 6 insertions, 1 deletions
diff --git a/lib/ruby_vm/mjit/exit_compiler.rb b/lib/ruby_vm/mjit/exit_compiler.rb index b664d795b0..1d704a8dca 100644 --- a/lib/ruby_vm/mjit/exit_compiler.rb +++ b/lib/ruby_vm/mjit/exit_compiler.rb @@ -83,7 +83,7 @@ module RubyVM::MJIT def compile_branch_stub(ctx, asm, branch_stub, target0_p) # Call rb_mjit_branch_stub_hit iseq = branch_stub.iseq - if C.imemo_type(iseq) != C.imemo_iseq # Guard against ISEQ GC at random moments + if C.mjit_opts.dump_disasm && C.imemo_type(iseq) == C.imemo_iseq # Guard against ISEQ GC at random moments asm.comment("branch stub hit: #{iseq.body.location.label}@#{C.rb_iseq_path(iseq)}:#{iseq_lineno(iseq, target0_p ? branch_stub.target0.pc : branch_stub.target1.pc)}") end asm.mov(:rdi, to_value(branch_stub)) @@ -310,7 +310,11 @@ rb_mjit_collect_vm_usage_insn(int insn) #endif // YJIT_STATS +extern VALUE rb_gc_enable(void); +extern VALUE rb_gc_disable(void); + #define WITH_MJIT_ISOLATED(stmt) do { \ + VALUE was_disabled = rb_gc_disable(); \ rb_hook_list_t *global_hooks = rb_ec_ractor_hooks(GET_EC()); \ rb_mjit_global_events = global_hooks->events; \ global_hooks->events = 0; \ @@ -321,6 +325,7 @@ rb_mjit_collect_vm_usage_insn(int insn) mjit_call_p = (mjit_cancel_p ? false : original_call_p); \ mjit_stats_p = mjit_opts.stats; \ global_hooks->events = rb_mjit_global_events; \ + if (!was_disabled) rb_gc_enable(); \ } while (0); void |