Author: Hakan Ardo <[email protected]>
Branch: jit-short_from_state
Changeset: r44723:a246b848afe7
Date: 2011-06-05 17:29 +0200
http://bitbucket.org/pypy/pypy/changeset/a246b848afe7/
Log: guard_class needs to be guarded with guard_nonnull
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py
b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -56,6 +56,8 @@
op = ResOperation(rop.GUARD_VALUE, [box, self.box], None)
guards.append(op)
elif self.level == LEVEL_KNOWNCLASS:
+ op = ResOperation(rop.GUARD_NONNULL, [box], None)
+ guards.append(op)
op = ResOperation(rop.GUARD_CLASS, [box, self.known_class], None)
guards.append(op)
else:
diff --git a/pypy/jit/metainterp/test/test_virtualstate.py
b/pypy/jit/metainterp/test/test_virtualstate.py
--- a/pypy/jit/metainterp/test/test_virtualstate.py
+++ b/pypy/jit/metainterp/test/test_virtualstate.py
@@ -165,7 +165,24 @@
"""
self.guards(info1, info2, self.nodebox, expected)
py.test.raises(InvalidLoop, self.guards,
- info1, info2, BoxPtr(), expected)
+ info1, info2, BoxPtr(), expected)
+
+ def test_known_class_value(self):
+ value1 = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value1.make_constant_class(classbox, -1)
+ box = self.nodebox
+ guards = value1.make_guards(box)
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ guard_class(p0, ConstClass(node_vtable)) []
+ """
+ loop = self.parse(expected)
+ assert equaloplists(guards, loop.operations, False,
+ {loop.inputargs[0]: box})
+
+
class TestLLtype(BaseTestGenerateGuards, LLtypeMixin):
pass
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit