[pypy-svn] pypy jit-virtual_state: array support

hakanardo commits-noreply at bitbucket.org
Mon Feb 7 08:23:47 CET 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-virtual_state
Changeset: r41663:102f57821f4e
Date: 2011-02-07 07:57 +0100
http://bitbucket.org/pypy/pypy/changeset/102f57821f4e/

Log:	array support

diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py
--- a/pypy/jit/metainterp/resume.py
+++ b/pypy/jit/metainterp/resume.py
@@ -562,6 +562,16 @@
         for i in self.fieldnums:
             debug_print("\t\t", str(untag(i)))
 
+    def generalization_of(self, other):
+        if self.arraydescr is not other.arraydescr:
+            return False
+        if len(self.fieldstate) != len(other.fieldstate):
+            return False
+        for i in range(len(self.fieldstate)):
+            if not self.fieldstate[i].generalization_of(other.fieldstate[i]):
+                return False
+        return True
+
 
 class VStrPlainInfo(AbstractVirtualInfo):
     """Stands for the string made out of the characters of all fieldnums."""

diff --git a/pypy/jit/metainterp/test/test_virtual.py b/pypy/jit/metainterp/test/test_virtual.py
--- a/pypy/jit/metainterp/test/test_virtual.py
+++ b/pypy/jit/metainterp/test/test_virtual.py
@@ -566,6 +566,38 @@
         def g(n1, n2, s):
             return f(n1, s) + f(n2, s)
         # FIXME: Try the case where we need to call the second version from the interpreter
+
+    def test_virtual_array_bridge(self):
+        myjitdriver = JitDriver(greens = [], reds = ['n', 'node'])
+        def f(n):
+            node = [42, 42]
+            while n > 0:
+                myjitdriver.can_enter_jit(n=n, node=node)
+                myjitdriver.jit_merge_point(n=n, node=node)
+                if (n>>3) & 1:
+                    node = [node[0], node[1] + n]
+                else:
+                    node = [node[0] + n, node[1]]
+                n -= 1
+            return node[0] + node[1]
+        assert self.meta_interp(f, [40]) == f(40)
+
+    def test_virtual_array_different_bridge(self):
+        myjitdriver = JitDriver(greens = [], reds = ['n', 'node'])
+        def f(n):
+            node = [42, 42]
+            while n > 0:
+                myjitdriver.can_enter_jit(n=n, node=node)
+                myjitdriver.jit_merge_point(n=n, node=node)
+                if (n>>3) & 1:
+                    node = [node[0], node[1] + n]
+                else:
+                    node = [node[0] + n, node[-1], node[0] + node[1]]
+                n -= 1
+            return node[0] + node[1]
+        assert self.meta_interp(f, [40]) == f(40)
+
+        
         
 
 class VirtualMiscTests:


More information about the Pypy-commit mailing list