diff options
| author | Takashi Kokubun <takashikkbn@gmail.com> | 2026-03-26 17:12:59 -0700 |
|---|---|---|
| committer | Takashi Kokubun <takashikkbn@gmail.com> | 2026-03-27 16:26:12 -0700 |
| commit | 59fe446e8f80c67d31c12609a8bb39dba6f48ec5 (patch) | |
| tree | feb19eee3007fd6b04d32e165af1c1fe294da9da /zjit | |
| parent | 219f7bbf2626e46c42c67da26ab2e0ed1c569868 (diff) | |
ZJIT: Use bare opcode variant in iseq_may_write_block_code
Add rb_iseq_bare_opcode_at_pc which uses rb_vm_insn_addr2insn to
return the base instruction, stripping trace/zjit variants. Use it
in iseq_may_write_block_code to simplify the match arms.
Diffstat (limited to 'zjit')
| -rw-r--r-- | zjit/bindgen/src/main.rs | 1 | ||||
| -rw-r--r-- | zjit/src/codegen.rs | 12 | ||||
| -rw-r--r-- | zjit/src/cruby_bindings.inc.rs | 4 |
3 files changed, 10 insertions, 7 deletions
diff --git a/zjit/bindgen/src/main.rs b/zjit/bindgen/src/main.rs index 33dd4eac1e..209623ffa2 100644 --- a/zjit/bindgen/src/main.rs +++ b/zjit/bindgen/src/main.rs @@ -276,6 +276,7 @@ fn main() { .allowlist_function("rb_iseq_(get|set)_zjit_payload") .allowlist_function("rb_iseq_pc_at_idx") .allowlist_function("rb_iseq_opcode_at_pc") + .allowlist_function("rb_iseq_bare_opcode_at_pc") .allowlist_function("rb_jit_reserve_addr_space") .allowlist_function("rb_jit_mark_writable") .allowlist_function("rb_jit_mark_executable") diff --git a/zjit/src/codegen.rs b/zjit/src/codegen.rs index 817a52aaa6..493033a6b1 100644 --- a/zjit/src/codegen.rs +++ b/zjit/src/codegen.rs @@ -2704,7 +2704,7 @@ fn gen_incr_send_fallback_counter(asm: &mut Assembler, reason: SendFallbackReaso } /// Check if an ISEQ contains instructions that may write to block_code -/// (send, sendforward, invokesuper, invokesuperforward, invokeblock, and their trace variants). +/// (send, sendforward, invokesuper, invokesuperforward, invokeblock). /// These instructions call vm_caller_setup_arg_block which writes to cfp->block_code. #[allow(non_upper_case_globals)] fn iseq_may_write_block_code(iseq: IseqPtr) -> bool { @@ -2713,14 +2713,12 @@ fn iseq_may_write_block_code(iseq: IseqPtr) -> bool { while insn_idx < encoded_size { let pc = unsafe { rb_iseq_pc_at_idx(iseq, insn_idx) }; - let opcode = unsafe { rb_iseq_opcode_at_pc(iseq, pc) } as u32; + let opcode = unsafe { rb_iseq_bare_opcode_at_pc(iseq, pc) } as u32; match opcode { - YARVINSN_send | YARVINSN_trace_send | - YARVINSN_sendforward | YARVINSN_trace_sendforward | - YARVINSN_invokesuper | YARVINSN_trace_invokesuper | - YARVINSN_invokesuperforward | YARVINSN_trace_invokesuperforward | - YARVINSN_invokeblock | YARVINSN_trace_invokeblock => { + YARVINSN_send | YARVINSN_sendforward | + YARVINSN_invokesuper | YARVINSN_invokesuperforward | + YARVINSN_invokeblock => { return true; } _ => {} diff --git a/zjit/src/cruby_bindings.inc.rs b/zjit/src/cruby_bindings.inc.rs index b270929da7..9a453bdd8f 100644 --- a/zjit/src/cruby_bindings.inc.rs +++ b/zjit/src/cruby_bindings.inc.rs @@ -2181,6 +2181,10 @@ unsafe extern "C" { pub fn rb_iseq_encoded_size(iseq: *const rb_iseq_t) -> ::std::os::raw::c_uint; pub fn rb_iseq_pc_at_idx(iseq: *const rb_iseq_t, insn_idx: u32) -> *mut VALUE; pub fn rb_iseq_opcode_at_pc(iseq: *const rb_iseq_t, pc: *const VALUE) -> ::std::os::raw::c_int; + pub fn rb_iseq_bare_opcode_at_pc( + iseq: *const rb_iseq_t, + pc: *const VALUE, + ) -> ::std::os::raw::c_int; pub fn rb_RSTRING_LEN(str_: VALUE) -> ::std::os::raw::c_ulong; pub fn rb_RSTRING_PTR(str_: VALUE) -> *mut ::std::os::raw::c_char; pub fn rb_insn_name(insn: VALUE) -> *const ::std::os::raw::c_char; |
