[pypy-svn] r37705 - in pypy/branch/jit-virtual-world/pypy/jit/timeshifter: . test

arigo at codespeak.net arigo at codespeak.net
Thu Feb 1 00:09:25 CET 2007


Author: arigo
Date: Thu Feb  1 00:09:20 2007
New Revision: 37705

Modified:
   pypy/branch/jit-virtual-world/pypy/jit/timeshifter/rtimeshift.py
   pypy/branch/jit-virtual-world/pypy/jit/timeshifter/rvalue.py
   pypy/branch/jit-virtual-world/pypy/jit/timeshifter/test/test_exception.py
   pypy/branch/jit-virtual-world/pypy/jit/timeshifter/test/test_portal.py
   pypy/branch/jit-virtual-world/pypy/jit/timeshifter/vlist.py
Log:
(arre, pedronis, arigo)

Don't merge jit states with exceptions and jit states without.
Some related minor fixes done while looking at it.


Modified: pypy/branch/jit-virtual-world/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/jit-virtual-world/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/branch/jit-virtual-world/pypy/jit/timeshifter/rtimeshift.py	Thu Feb  1 00:09:20 2007
@@ -761,6 +761,14 @@
     #fz_virtualizables = ...  set by freeze()
 
     def exactmatch(self, jitstate, outgoingvarboxes, memo):
+        if not memo.force_merge:
+            null1 = self.fz_exc_type_box.is_constant_nullptr()
+            box = jitstate.exc_type_box
+            null2 = (box.is_constant() and
+                     not rvalue.ll_getvalue(box, llmemory.Address))
+            if null1 != null2:
+                raise rvalue.DontMerge # a jit-with-exc. and a jit-without-exc.
+
         fullmatch = True
         if not self.fz_frame.exactmatch(jitstate.frame,
                                         outgoingvarboxes,

Modified: pypy/branch/jit-virtual-world/pypy/jit/timeshifter/rvalue.py
==============================================================================
--- pypy/branch/jit-virtual-world/pypy/jit/timeshifter/rvalue.py	(original)
+++ pypy/branch/jit-virtual-world/pypy/jit/timeshifter/rvalue.py	Thu Feb  1 00:09:20 2007
@@ -309,6 +309,9 @@
     def is_constant_equal(self, box):
         return False
 
+    def is_constant_nullptr(self):
+        return False
+
 
 class FrozenConst(FrozenValue):
 
@@ -403,6 +406,9 @@
                 self.gv_const.revealconst(llmemory.Address) ==
                 box.genvar.revealconst(llmemory.Address))
 
+    def is_constant_nullptr(self):
+        return not self.gv_const.revealconst(llmemory.Address)
+
     def exactmatch(self, box, outgoingvarboxes, memo):
         assert isinstance(box, PtrRedBox)
         memo.partialdatamatch[box] = None     # could do better
@@ -410,7 +416,7 @@
         if not memo.force_merge and not match:
             from pypy.jit.timeshifter.rcontainer import VirtualContainer
             if isinstance(box.content, VirtualContainer):
-                raise DontMerge
+                raise DontMerge   # XXX recursive data structures?
         return match
 
     def unfreeze(self, incomingvarboxes, memo):
@@ -426,7 +432,7 @@
         if not memo.force_merge and not match:
             from pypy.jit.timeshifter.rcontainer import VirtualContainer
             if isinstance(box.content, VirtualContainer):
-                raise DontMerge
+                raise DontMerge   # XXX recursive data structures?
         return match
 
     def unfreeze(self, incomingvarboxes, memo):
@@ -454,7 +460,7 @@
         if not memo.force_merge and not match:
             from pypy.jit.timeshifter.rcontainer import VirtualContainer
             if isinstance(box.content, VirtualContainer):
-                raise DontMerge
+                raise DontMerge   # XXX recursive data structures?
         return match
 
 

Modified: pypy/branch/jit-virtual-world/pypy/jit/timeshifter/test/test_exception.py
==============================================================================
--- pypy/branch/jit-virtual-world/pypy/jit/timeshifter/test/test_exception.py	(original)
+++ pypy/branch/jit-virtual-world/pypy/jit/timeshifter/test/test_exception.py	Thu Feb  1 00:09:20 2007
@@ -122,3 +122,19 @@
 
         self.timeshift_raises(ValueError,
                               ll_function, [-3], [0], policy=P_OOPSPEC)
+
+    def test_raise_or_return_virtual(self):
+        class A:
+            def __init__(self, n):
+                self.n = n
+        def g(x):
+            if x < 3:
+                raise ValueError
+            return A(x)
+        def ll_function(n):
+            a = g(n)
+            return a.n
+
+        res = self.timeshift(ll_function, [5], [], policy=P_NOVIRTUAL)
+        assert res == 5
+        self.check_insns(malloc=0)

Modified: pypy/branch/jit-virtual-world/pypy/jit/timeshifter/test/test_portal.py
==============================================================================
--- pypy/branch/jit-virtual-world/pypy/jit/timeshifter/test/test_portal.py	(original)
+++ pypy/branch/jit-virtual-world/pypy/jit/timeshifter/test/test_portal.py	Thu Feb  1 00:09:20 2007
@@ -2,7 +2,7 @@
 from pypy.translator.translator import graphof
 from pypy.jit.timeshifter.test.test_timeshift import hannotate, getargtypes
 from pypy.jit.timeshifter.hrtyper import HintRTyper
-from pypy.jit.timeshifter.test.test_timeshift import P_NOVIRTUAL
+from pypy.jit.timeshifter.test.test_timeshift import P_NOVIRTUAL, StopAtXPolicy
 from pypy.jit.timeshifter.test.test_vlist import P_OOPSPEC
 from pypy.rpython.llinterp import LLInterpreter
 from pypy.objspace.flow.model import checkgraph, summary
@@ -338,11 +338,13 @@
             hint(o.__class__, promote=True)
             return o.double().get()
 
-        res = self.timeshift_from_portal(ll_function, ll_function, [5], policy=P_NOVIRTUAL)
+        res = self.timeshift_from_portal(ll_function, ll_function, [5],
+                                         policy=StopAtXPolicy(ll_make))
         assert res == 10
         self.check_insns(indirect_call=0, malloc=0)
 
-        res = self.timeshift_from_portal(ll_function, ll_function, [0], policy=P_NOVIRTUAL)
+        res = self.timeshift_from_portal(ll_function, ll_function, [0],
+                                         policy=StopAtXPolicy(ll_make))
         assert res == ord('2')
         self.check_insns(indirect_call=0, malloc=0)
 

Modified: pypy/branch/jit-virtual-world/pypy/jit/timeshifter/vlist.py
==============================================================================
--- pypy/branch/jit-virtual-world/pypy/jit/timeshifter/vlist.py	(original)
+++ pypy/branch/jit-virtual-world/pypy/jit/timeshifter/vlist.py	Thu Feb  1 00:09:20 2007
@@ -3,6 +3,9 @@
 from pypy.jit.timeshifter.rcontainer import cachedtype
 from pypy.jit.timeshifter import rvalue, rvirtualizable
 
+from pypy.rpython.lltypesystem import lloperation
+debug_print = lloperation.llop.debug_print
+
 
 class ItemDesc(object):
     __metaclass__ = cachedtype
@@ -160,6 +163,7 @@
         boxes = self.item_boxes
         self.item_boxes = None
 
+        debug_print(lltype.Void, "FORCE LIST (%d items)" % (len(boxes),))
         args_gv = [builder.rgenop.genconst(len(boxes))]
         gv_list = builder.genop_call(typedesc.tok_ll_newlist,
                                      typedesc.gv_ll_newlist,



More information about the Pypy-commit mailing list