summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Bernstein <ruby@bernsteinbear.com>2025-09-19 09:01:05 -0400
committerMax Bernstein <tekknolagi@gmail.com>2025-09-19 12:00:39 -0400
commitd7ad44613723201a4c218aabae5baa7585a9867e (patch)
tree4476ddae9524d318488a16906eab6ba3e498409a
parentf0702c5aa32aa7092a4bb6c0c3e5863c4411e22d (diff)
ZJIT: Count method sends where method lookup fails
-rw-r--r--zjit/src/hir.rs4
-rw-r--r--zjit/src/stats.rs2
2 files changed, 6 insertions, 0 deletions
diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs
index 1fdef0e404..08bdd5311f 100644
--- a/zjit/src/hir.rs
+++ b/zjit/src/hir.rs
@@ -481,6 +481,7 @@ pub enum MethodType {
Optimized,
Missing,
Refined,
+ Null,
}
impl From<u32> for MethodType {
@@ -1852,6 +1853,9 @@ impl Function {
// Do method lookup
let mut cme = unsafe { rb_callable_method_entry(klass, mid) };
if cme.is_null() {
+ if let Insn::SendWithoutBlock { def_type: insn_def_type, .. } = &mut self.insns[insn_id.0] {
+ *insn_def_type = Some(MethodType::Null);
+ }
self.push_insn_id(block, insn_id); continue;
}
// Load an overloaded cme if applicable. See vm_search_cc().
diff --git a/zjit/src/stats.rs b/zjit/src/stats.rs
index 6fed5cf559..012b8be250 100644
--- a/zjit/src/stats.rs
+++ b/zjit/src/stats.rs
@@ -150,6 +150,7 @@ make_counters! {
send_fallback_optimized,
send_fallback_missing,
send_fallback_refined,
+ send_fallback_null,
// Writes to the VM frame
vm_write_pc_count,
@@ -263,6 +264,7 @@ pub fn send_fallback_counter(def_type: crate::hir::MethodType) -> Counter {
Optimized => send_fallback_optimized,
Missing => send_fallback_missing,
Refined => send_fallback_refined,
+ Null => send_fallback_null,
}
}