[pypy-svn] r66679 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Wed Jul 29 20:11:27 CEST 2009


Author: arigo
Date: Wed Jul 29 20:11:26 2009
New Revision: 66679

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/optimizefindnode.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizefindnode.py
Log:
Implement and test matches_instance_node() on VirtualArraySpecNode.


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/optimizefindnode.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/optimizefindnode.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/optimizefindnode.py	Wed Jul 29 20:11:26 2009
@@ -363,10 +363,29 @@
 
 class __extend__(VirtualArraySpecNode):
     def make_instance_node(self):
-        xxx
-    def matches_instance_node(self):
-        xxx
-
+        raise AssertionError, "not implemented (but not used actually)"
+    def matches_instance_node(self, exitnode):
+        if exitnode.unique == UNIQUE_NO:
+            return False
+        #
+        assert exitnode.unique == UNIQUE_ARRAY
+        assert self.arraydescr == exitnode.arraydescr
+        if len(self.items) != exitnode.arraysize:
+            # the size is known to be a mismatch
+            return False
+        #
+        d = exitnode.curitems
+        for i in range(exitnode.arraysize):
+            try:
+                if d is None:
+                    raise KeyError
+                itemnode = d[i]
+            except KeyError:
+                itemnode = NodeFinder.node_escaped
+            subspecnode = self.items[i]
+            if not subspecnode.matches_instance_node(itemnode):
+                return False
+        return True
 
 class BridgeSpecializationFinder(NodeFinder):
 

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizefindnode.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizefindnode.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizefindnode.py	Wed Jul 29 20:11:26 2009
@@ -701,6 +701,28 @@
         """
         self.find_bridge(ops, 'Not', 'Not')
 
+    def test_bridge_array_virtual_1(self):
+        ops = """
+        [i1]
+        p1 = new_array(3, descr=arraydescr)
+        setarrayitem_gc(p1, 0, i1, descr=arraydescr)
+        jump(p1)
+        """
+        self.find_bridge(ops, 'Not', 'Not')
+        self.find_bridge(ops, 'Not', 'VArray(arraydescr, Not, Not, Not)')
+
+    def test_bridge_array_virtual_2(self):
+        ops = """
+        [i1]
+        p1 = new_array(3, descr=arraydescr)
+        setarrayitem_gc(p1, 0, i1, descr=arraydescr)
+        escape(p1)
+        jump(p1)
+        """
+        self.find_bridge(ops, 'Not', 'Not')
+        self.find_bridge(ops, 'Not', 'VArray(arraydescr, Not, Not, Not)',
+                         mismatch=True)
+
 
 class TestLLtype(BaseTestOptimizeFindNode, LLtypeMixin):
     pass



More information about the Pypy-commit mailing list