diff options
| author | Max Bernstein <rubybugs@bernsteinbear.com> | 2025-09-22 17:54:06 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-22 21:54:06 +0000 |
| commit | 98de251c4118d13fa3d17481e48b19253f9f41e0 (patch) | |
| tree | a098f06ff1e9ed40a76b778b29e03dbf99933159 | |
| parent | 6b088c876a4e2d41f39acfb0b338b6a178b30089 (diff) | |
ZJIT: Add more type information to DefinedIvar (#14628)
Add test.
| -rw-r--r-- | zjit/src/hir.rs | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs index 0351b965f8..faf363e32a 100644 --- a/zjit/src/hir.rs +++ b/zjit/src/hir.rs @@ -1556,7 +1556,7 @@ impl Function { Insn::InvokeBlock { .. } => types::BasicObject, Insn::InvokeBuiltin { return_type, .. } => return_type.unwrap_or(types::BasicObject), Insn::Defined { pushval, .. } => Type::from_value(*pushval).union(types::NilClass), - Insn::DefinedIvar { .. } => types::BasicObject, + Insn::DefinedIvar { pushval, .. } => Type::from_value(*pushval).union(types::NilClass), Insn::GetConstantPath { .. } => types::BasicObject, Insn::ArrayMax { .. } => types::BasicObject, Insn::GetGlobal { .. } => types::BasicObject, @@ -4989,13 +4989,42 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@<compiled>:2: bb0(v0:BasicObject): - v5:BasicObject = DefinedIvar v0, :@foo + v5:StringExact|NilClass = DefinedIvar v0, :@foo CheckInterrupts Return v5 "); } #[test] + fn if_defined_ivar() { + eval(" + def test + if defined?(@foo) + 3 + else + 4 + end + end + "); + assert_contains_opcode("test", YARVINSN_definedivar); + assert_snapshot!(hir_string("test"), @r" + fn test@<compiled>:3: + bb0(v0:BasicObject): + v5:TrueClass|NilClass = DefinedIvar v0, :@foo + CheckInterrupts + v8:CBool = Test v5 + IfFalse v8, bb1(v0) + v12:Fixnum[3] = Const Value(3) + CheckInterrupts + Return v12 + bb1(v18:BasicObject): + v22:Fixnum[4] = Const Value(4) + CheckInterrupts + Return v22 + "); + } + + #[test] fn defined() { eval(" def test = return defined?(SeaChange), defined?(favourite), defined?($ruby) |
