summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Bernstein <ruby@bernsteinbear.com>2025-10-24 15:53:06 -0700
committerMax Bernstein <tekknolagi@gmail.com>2025-10-27 18:57:08 -0400
commit46525fa7b8c91d05a24571337eff76f1023cb152 (patch)
tree858e61d6babe09a8dfd09018a804c862ad42de00
parent3fb96ee93bb8e541fb510bd2a1a454f82160ba96 (diff)
ZJIT: Add return_type to inlined InvokeBuiltin
-rw-r--r--zjit/src/hir.rs15
1 files changed, 10 insertions, 5 deletions
diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs
index 706982625a..8074a50e2b 100644
--- a/zjit/src/hir.rs
+++ b/zjit/src/hir.rs
@@ -1379,7 +1379,8 @@ enum IseqReturn {
Value(VALUE),
LocalVariable(u32),
Receiver,
- InvokeLeafBuiltin(rb_builtin_function),
+ // Builtin descriptor and return type (if known)
+ InvokeLeafBuiltin(rb_builtin_function, Option<Type>),
}
unsafe extern "C" {
@@ -1441,7 +1442,11 @@ fn iseq_get_return_value(iseq: IseqPtr, captured_opnd: Option<InsnId>, ci_flags:
let builtin_attrs = unsafe { rb_jit_iseq_builtin_attrs(iseq) };
let leaf = builtin_attrs & BUILTIN_ATTR_LEAF != 0;
if !leaf { return None; }
- Some(IseqReturn::InvokeLeafBuiltin(bf))
+ // Check if this builtin is annotated
+ let return_type = ZJITState::get_method_annotations()
+ .get_builtin_properties(&bf)
+ .map(|props| props.return_type);
+ Some(IseqReturn::InvokeLeafBuiltin(bf, return_type))
}
_ => None,
}
@@ -2468,14 +2473,14 @@ impl Function {
self.push_insn(block, Insn::IncrCounter(Counter::inline_iseq_optimized_send_count));
self.make_equal_to(insn_id, recv);
}
- IseqReturn::InvokeLeafBuiltin(bf) => {
+ IseqReturn::InvokeLeafBuiltin(bf, return_type) => {
self.push_insn(block, Insn::IncrCounter(Counter::inline_iseq_optimized_send_count));
let replacement = self.push_insn(block, Insn::InvokeBuiltin {
bf,
args: vec![recv],
state,
leaf: true,
- return_type: None,
+ return_type,
});
self.make_equal_to(insn_id, replacement);
}
@@ -11036,7 +11041,7 @@ mod opt_tests {
PatchPoint MethodRedefined(Module@0x1010, class@0x1018, cme:0x1020)
PatchPoint NoSingletonClass(Module@0x1010)
IncrCounter inline_iseq_optimized_send_count
- v26:BasicObject = InvokeBuiltin leaf _bi20, v21
+ v26:Class = InvokeBuiltin leaf _bi20, v21
CheckInterrupts
Return v26
");