summaryrefslogtreecommitdiff
path: root/zjit
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2026-03-26 17:12:59 -0700
committerTakashi Kokubun <takashikkbn@gmail.com>2026-03-27 16:26:12 -0700
commit59fe446e8f80c67d31c12609a8bb39dba6f48ec5 (patch)
treefeb19eee3007fd6b04d32e165af1c1fe294da9da /zjit
parent219f7bbf2626e46c42c67da26ab2e0ed1c569868 (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.rs1
-rw-r--r--zjit/src/codegen.rs12
-rw-r--r--zjit/src/cruby_bindings.inc.rs4
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;