@@ -1379,7 +1379,8 @@ enum IseqReturn {
13791379 Value(VALUE),
13801380 LocalVariable(u32),
13811381 Receiver,
1382- InvokeLeafBuiltin(rb_builtin_function),
1382+ // Builtin descriptor and return type (if known)
1383+ InvokeLeafBuiltin(rb_builtin_function, Option<Type>),
13831384}
13841385
13851386unsafe extern "C" {
@@ -1441,7 +1442,11 @@ fn iseq_get_return_value(iseq: IseqPtr, captured_opnd: Option<InsnId>, ci_flags:
14411442 let builtin_attrs = unsafe { rb_jit_iseq_builtin_attrs(iseq) };
14421443 let leaf = builtin_attrs & BUILTIN_ATTR_LEAF != 0;
14431444 if !leaf { return None; }
1444- Some(IseqReturn::InvokeLeafBuiltin(bf))
1445+ // Check if this builtin is annotated
1446+ let return_type = ZJITState::get_method_annotations()
1447+ .get_builtin_properties(&bf)
1448+ .map(|props| props.return_type);
1449+ Some(IseqReturn::InvokeLeafBuiltin(bf, return_type))
14451450 }
14461451 _ => None,
14471452 }
@@ -2468,14 +2473,14 @@ impl Function {
24682473 self.push_insn(block, Insn::IncrCounter(Counter::inline_iseq_optimized_send_count));
24692474 self.make_equal_to(insn_id, recv);
24702475 }
2471- IseqReturn::InvokeLeafBuiltin(bf) => {
2476+ IseqReturn::InvokeLeafBuiltin(bf, return_type ) => {
24722477 self.push_insn(block, Insn::IncrCounter(Counter::inline_iseq_optimized_send_count));
24732478 let replacement = self.push_insn(block, Insn::InvokeBuiltin {
24742479 bf,
24752480 args: vec![recv],
24762481 state,
24772482 leaf: true,
2478- return_type: None ,
2483+ return_type,
24792484 });
24802485 self.make_equal_to(insn_id, replacement);
24812486 }
@@ -11036,7 +11041,7 @@ mod opt_tests {
1103611041 PatchPoint MethodRedefined(Module@0x1010, class@0x1018, cme:0x1020)
1103711042 PatchPoint NoSingletonClass(Module@0x1010)
1103811043 IncrCounter inline_iseq_optimized_send_count
11039- v26:BasicObject = InvokeBuiltin leaf _bi20, v21
11044+ v26:Class = InvokeBuiltin leaf _bi20, v21
1104011045 CheckInterrupts
1104111046 Return v26
1104211047 ");
0 commit comments