@@ -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