Skip to content

Commit 111df6b

Browse files
committed
ZJIT: Guard SendDirect against blocks and bmethods
1 parent 845ad2c commit 111df6b

1 file changed

Lines changed: 6 additions & 13 deletions

File tree

zjit/src/codegen.rs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -801,8 +801,10 @@ fn gen_function(cb: &mut CodeBlock, iseq: IseqPtr, version: IseqVersionRef, func
801801
call_c_function_void(builder, isa, rb_zjit_writebarrier_check_immediate as *const u8, &[r, v]);
802802
}
803803

804-
// === SendDirect: JIT-to-JIT call ===
805-
Insn::SendDirect { cme, iseq: callee_iseq, recv, args, kw_bits, blockiseq, state, .. } => {
804+
// === SendDirect: JIT-to-JIT call (no block, no bmethod) ===
805+
Insn::SendDirect { cme, iseq: callee_iseq, recv, args, kw_bits, blockiseq: None, state, .. }
806+
if VM_METHOD_TYPE_BMETHOD != unsafe { get_cme_def_type(cme) } =>
807+
{
806808
let state = &function.frame_state(state);
807809
let callee_iseq = callee_iseq;
808810
let local_size = unsafe { get_iseq_body_local_table_size(callee_iseq) }.to_usize();
@@ -840,17 +842,8 @@ fn gen_function(cb: &mut CodeBlock, iseq: IseqPtr, version: IseqVersionRef, func
840842
// ep[-2]: CME
841843
let cme_val = builder.ins().iconst(cl_types::I64, VALUE::from(cme).as_i64());
842844
builder.ins().store(MemFlags::trusted(), cme_val, sp, Offset32::new((ep_offset - 2) * SIZEOF_VALUE_I32));
843-
// ep[-1]: specval (block handler)
844-
let specval = if let Some(biseq) = blockiseq {
845-
// cfp_self | 1 as block handler — simplified
846-
let biseq_val = builder.ins().iconst(cl_types::I64, VALUE::from(biseq).as_i64());
847-
let self_val = builder.ins().load(cl_types::I64, MemFlags::trusted(), cfp, Offset32::new(RUBY_OFFSET_CFP_SELF));
848-
let self_addr = builder.ins().load(cl_types::I64, MemFlags::trusted(), cfp, Offset32::new(RUBY_OFFSET_CFP_SELF));
849-
// Store blockiseq to callee CFP block_code later; use VM_BLOCK_HANDLER_NONE for now
850-
builder.ins().iconst(cl_types::I64, VM_BLOCK_HANDLER_NONE as i64)
851-
} else {
852-
builder.ins().iconst(cl_types::I64, VM_BLOCK_HANDLER_NONE as i64)
853-
};
845+
// ep[-1]: specval (block handler = none, we matched blockiseq: None)
846+
let specval = builder.ins().iconst(cl_types::I64, VM_BLOCK_HANDLER_NONE as i64);
854847
builder.ins().store(MemFlags::trusted(), specval, sp, Offset32::new((ep_offset - 1) * SIZEOF_VALUE_I32));
855848
// ep[0]: frame type
856849
let frame_type = builder.ins().iconst(cl_types::I64, (VM_FRAME_MAGIC_METHOD | VM_ENV_FLAG_LOCAL) as i64);

0 commit comments

Comments
 (0)