[pypy-svn] r63129 - in pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp: . test

fijal at codespeak.net fijal at codespeak.net
Fri Mar 20 12:52:45 CET 2009


Author: fijal
Date: Fri Mar 20 12:52:44 2009
New Revision: 63129

Modified:
   pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp/compile.py
   pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp/specnode.py
   pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp/test/test_virtualizable.py
Log:
A test and a partial fix


Modified: pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp/compile.py
==============================================================================
--- pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp/compile.py	(original)
+++ pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp/compile.py	Fri Mar 20 12:52:44 2009
@@ -169,9 +169,9 @@
     #
     res = optimize.optimize_bridge(metainterp.options, old_loops, bridge,
                                    metainterp.cpu)
-    old_loop, newboxlist, storage = res
-    if old_loop is None:
+    if res is None:
         return None
+    old_loop, newboxlist, storage = res
     bridge.jump_to = old_loop
     if newboxlist:
         # recompile loop

Modified: pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp/specnode.py
==============================================================================
--- pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp/specnode.py	(original)
+++ pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp/specnode.py	Fri Mar 20 12:52:44 2009
@@ -266,6 +266,15 @@
 
 class VirtualizedSpecNode(VirtualizedOrDelayedSpecNode):
 
+    def matches(self, instnode):
+        for key, value in self.fields:
+            if not isinstance(value, MatchEverythingSpecNode):
+                if key not in instnode.curfields:
+                    return False
+                if value is not None and not value.matches(instnode.curfields[key]):
+                    return False
+        return True
+
     def equals(self, other):
         if not self.known_class.equals(other.known_class):
             return False

Modified: pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp/test/test_virtualizable.py
==============================================================================
--- pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp/test/test_virtualizable.py	(original)
+++ pypy/branch/virtualizable-specnodes-2/pypy/jit/metainterp/test/test_virtualizable.py	Fri Mar 20 12:52:44 2009
@@ -459,6 +459,45 @@
         self.check_loops(getfield_gc=0)
         assert res == f(30)
 
+
+    def test_virtual_obj_on_always_virtual_more_bridges(self):
+        py.test.skip("Broken")
+        jitdriver = JitDriver(greens = [], reds = ['frame', 'n', 's'],
+                              virtualizables = ['frame'])
+
+        class Frame(object):
+            _virtualizable2_ = True
+
+            _always_virtual_ = ['l']
+
+            def __init__(self, l):
+                self.l = l
+
+        class Stuff(object):
+            def __init__(self, elem):
+                self.elem = elem
+
+        def f(n):
+            frame = Frame([Stuff(3), Stuff(4)])
+            s = 0
+            while n > 0:
+                jitdriver.can_enter_jit(frame=frame, n=n, s=s)
+                jitdriver.jit_merge_point(frame=frame, n=n, s=s)
+                if n % 2:
+                    s += frame.l[0].elem
+                    frame.l[0] = Stuff(n)
+                elif n % 3:
+                    s += 1
+                else:
+                    s += frame.l[1].elem
+                    frame.l[1] = Stuff(n)
+                n -= 1
+            return (frame.l[0].elem << 16) + frame.l[1].elem
+
+        res = self.meta_interp(f, [60], listops=True)
+        self.check_loops(getfield_gc=0)
+        assert res == f(60)
+
     def test_external_read(self):
         py.test.skip("Fails")
         jitdriver = JitDriver(greens = [], reds = ['frame'],



More information about the Pypy-commit mailing list