summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Bernstein <rubybugs@bernsteinbear.com>2025-09-22 17:54:06 -0400
committerGitHub <noreply@github.com>2025-09-22 21:54:06 +0000
commit98de251c4118d13fa3d17481e48b19253f9f41e0 (patch)
treea098f06ff1e9ed40a76b778b29e03dbf99933159
parent6b088c876a4e2d41f39acfb0b338b6a178b30089 (diff)
ZJIT: Add more type information to DefinedIvar (#14628)
Add test.
-rw-r--r--zjit/src/hir.rs33
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)