Author: Carl Friedrich Bolz <[email protected]>
Branch: small-unroll-improvements
Changeset: r70846:e973dd1b60d5
Date: 2014-04-22 10:25 +0200
http://bitbucket.org/pypy/pypy/changeset/e973dd1b60d5/

Log:    properly generate guards for virtual dicts

        extremely advanced technology

diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py 
b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -10,7 +10,7 @@
                                                            equaloplists
 from rpython.jit.metainterp.optimizeopt.intutils import IntBound
 from rpython.jit.metainterp.optimizeopt.virtualize import (VirtualValue,
-        VArrayValue, VStructValue)
+        VArrayValue, VStructValue, VArrayStructValue)
 from rpython.jit.metainterp.history import TreeLoop, JitCellToken
 from rpython.jit.metainterp.optimizeopt.test.test_optimizeopt import 
FakeMetaInterpStaticData
 from rpython.jit.metainterp.resoperation import ResOperation, rop
@@ -535,6 +535,34 @@
         """
         self.guards(info1, info2, value1, expected, [self.nodebox])
 
+    def test_generate_guards_on_virtual_fields_matches_arraystruct(self):
+        innervalue1 = OptValue(self.nodebox)
+        constclassbox = self.cpu.ts.cls_of_box(self.nodebox)
+        innervalue1.make_constant_class(constclassbox, -1)
+        innerinfo1 = NotVirtualStateInfo(innervalue1)
+        innerinfo1.position = 1
+        innerinfo2 = NotVirtualStateInfo(OptValue(self.nodebox))
+        innerinfo2.position = 1
+
+        arraydescr = object()
+        fielddescr = object()
+
+        info1 = VArrayStructStateInfo(arraydescr, [[fielddescr]])
+        info1.fieldstate = [innerinfo1]
+
+        info2 = VArrayStructStateInfo(arraydescr, [[fielddescr]])
+        info2.fieldstate = [innerinfo2]
+
+        value1 = VArrayStructValue(arraydescr, 1, self.nodebox)
+        value1._items[0][fielddescr] = OptValue(self.nodebox)
+
+        expected = """
+        [p0]
+        guard_nonnull(p0) []
+        guard_class(p0, ConstClass(node_vtable)) []
+        """
+        self.guards(info1, info2, value1, expected, [self.nodebox])
+
     # _________________________________________________________________________
     # the below tests don't really have anything to do with guard generation
 
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py 
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -223,7 +223,6 @@
         self.fielddescrs = fielddescrs
 
     def _generate_guards(self, other, value, state):
-        # XXX this needs a test in test_virtualstate!!!
         if not isinstance(other, VArrayStructStateInfo):
             raise VirtualStatesCantMatch("other is not an 
VArrayStructStateInfo")
         if self.arraydescr is not other.arraydescr:
@@ -233,14 +232,19 @@
             raise VirtualStatesCantMatch("other has a different length")
 
         p = 0
+        v = None
         for i in range(len(self.fielddescrs)):
             if len(self.fielddescrs[i]) != len(other.fielddescrs[i]):
                 raise VirtualStatesCantMatch("other has a different length")
             for j in range(len(self.fielddescrs[i])):
-                if self.fielddescrs[i][j] is not other.fielddescrs[i][j]:
+                descr = self.fielddescrs[i][j]
+                if descr is not other.fielddescrs[i][j]:
                     raise VirtualStatesCantMatch("other is a different kind of 
array")
+                if value is not None:
+                    assert isinstance(value, virtualize.VArrayStructValue)
+                    v = value._items[i][descr]
                 self.fieldstate[p].generate_guards(other.fieldstate[p],
-                                                   None, # XXX
+                                                   v,
                                                    state)
                 p += 1
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to