[pypy-svn] r68210 - in pypy/trunk/pypy/jit/metainterp: . test

pedronis at codespeak.net pedronis at codespeak.net
Tue Oct 6 17:21:07 CEST 2009


Author: pedronis
Date: Tue Oct  6 17:21:07 2009
New Revision: 68210

Modified:
   pypy/trunk/pypy/jit/metainterp/pyjitpl.py
   pypy/trunk/pypy/jit/metainterp/resume.py
   pypy/trunk/pypy/jit/metainterp/test/test_resume.py
Log:
(pedronis, cfbolz): refactor resuming in preparation for further changes


Modified: pypy/trunk/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/pyjitpl.py	Tue Oct  6 17:21:07 2009
@@ -1678,15 +1678,11 @@
 
     def rebuild_state_after_failure(self, resumedescr, newboxes):
         vinfo = self.staticdata.virtualizable_info
-        resumereader = resume.ResumeDataReader(resumedescr, newboxes, self)
         self.framestack = []
-        while resumereader.has_more_frame_infos():
-            jitcode, pc, exception_target = resumereader.consume_frame_info()
-            env = resumereader.consume_boxes()
-            f = self.newframe(jitcode)
-            f.setup_resume_at_op(pc, exception_target, env)
-        if vinfo is not None:
-            self.virtualizable_boxes = resumereader.consume_boxes()
+        expect_virtualizable = vinfo is not None
+        virtualizable_boxes = resume.rebuild_from_resumedata(self, newboxes, resumedescr, expect_virtualizable)
+        if expect_virtualizable:
+            self.virtualizable_boxes = virtualizable_boxes
             # just jumped away from assembler (case 4 in the comment in
             # virtualizable.py) into tracing (case 2); check that vable_rti
             # is and stays NULL.

Modified: pypy/trunk/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/resume.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/resume.py	Tue Oct  6 17:21:07 2009
@@ -10,7 +10,7 @@
 # because it needs to support optimize.py which encodes virtuals with
 # arbitrary cycles.
 
-# XXX I guess that building the data so that it is as compact as possible
+# XXX building the data so that it is as compact as possible
 # on the 'storage' object would be a big win.
 
 debug = False
@@ -331,6 +331,19 @@
                                          self.fieldnums)
 
 
+def rebuild_from_resumedata(metainterp, newboxes, resumedescr, expects_virtualizables):
+    resumereader = ResumeDataReader(resumedescr, newboxes, metainterp)
+    while resumereader.has_more_frame_infos():
+        jitcode, pc, exception_target = resumereader.consume_frame_info()
+        env = resumereader.consume_boxes()
+        f = metainterp.newframe(jitcode)
+        f.setup_resume_at_op(pc, exception_target, env)
+    if expects_virtualizables:
+        virtualizable_boxes = resumereader.consume_boxes()
+        return virtualizable_boxes
+    return None
+
+
 class ResumeDataReader(object):
     i_frame_infos = 0
     i_boxes = 0

Modified: pypy/trunk/pypy/jit/metainterp/test/test_resume.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_resume.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_resume.py	Tue Oct  6 17:21:07 2009
@@ -119,6 +119,14 @@
         self.exception_target = exc_target
         self.env = list(boxes)
 
+    def setup_resume_at_op(self, pc, exception_target, env):
+        self.__init__(self.jitcode, pc, exception_target, *env)
+    
+    def __eq__(self, other):
+        return self.__dict__ == other.__dict__
+    def __ne__(self, other):
+        return self.__dict__ != other.__dict__
+
 def test_Snapshot_create():
     l = ['b0', 'b1']
     snap = Snapshot(None, l)
@@ -216,6 +224,69 @@
     assert snapshot.prev is fs[2].parent_resumedata_snapshot
     assert snapshot.boxes == fs[2].env
 
+def test_rebuild_from_resumedata():
+    class FakeMetaInterp(object):
+        def __init__(self):
+            self.framestack = []
+        def newframe(self, jitcode):
+            frame = FakeFrame(jitcode, -1, -1)
+            self.framestack.append(frame)
+            return frame
+    b1, b2, b3 = [BoxInt(), BoxPtr(), BoxInt()]
+    c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]    
+    storage = Storage()
+    fs = [FakeFrame("code0", 0, -1, b1, c1, b2),
+          FakeFrame("code1", 3, 7, b3, c2, b1),
+          FakeFrame("code2", 9, -1, c3, b2)]
+    capture_resumedata(fs, None, storage)
+    memo = ResumeDataLoopMemo(None)
+    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier.walk_snapshots({})
+    liveboxes = modifier.finish({})
+    metainterp = FakeMetaInterp()
+
+    b1t, b2t, b3t = [BoxInt(), BoxPtr(), BoxInt()]
+    newboxes = _resume_remap(liveboxes, [b1, b2, b3], b1t, b2t, b3t)
+
+    result = rebuild_from_resumedata(metainterp, newboxes, storage,
+                                     False)
+    assert result is None
+    fs2 = [FakeFrame("code0", 0, -1, b1t, c1, b2t),
+           FakeFrame("code1", 3, 7, b3t, c2, b1t),
+           FakeFrame("code2", 9, -1, c3, b2t)]
+    assert metainterp.framestack == fs2
+
+def test_rebuild_from_resumedata_with_virtualizable():
+    class FakeMetaInterp(object):
+        def __init__(self):
+            self.framestack = []
+        def newframe(self, jitcode):
+            frame = FakeFrame(jitcode, -1, -1)
+            self.framestack.append(frame)
+            return frame
+    b1, b2, b3, b4 = [BoxInt(), BoxPtr(), BoxInt(), BoxPtr()]
+    c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]    
+    storage = Storage()
+    fs = [FakeFrame("code0", 0, -1, b1, c1, b2),
+          FakeFrame("code1", 3, 7, b3, c2, b1),
+          FakeFrame("code2", 9, -1, c3, b2)]
+    capture_resumedata(fs, [b4], storage)
+    memo = ResumeDataLoopMemo(None)
+    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier.walk_snapshots({})
+    liveboxes = modifier.finish({})
+    metainterp = FakeMetaInterp()
+
+    b1t, b2t, b3t, b4t = [BoxInt(), BoxPtr(), BoxInt(), BoxPtr()]
+    newboxes = _resume_remap(liveboxes, [b1, b2, b3, b4], b1t, b2t, b3t, b4t)
+
+    result = rebuild_from_resumedata(metainterp, newboxes, storage,
+                                     True)
+    assert result == [b4t]
+    fs2 = [FakeFrame("code0", 0, -1, b1t, c1, b2t),
+           FakeFrame("code1", 3, 7, b3t, c2, b1t),
+           FakeFrame("code2", 9, -1, c3, b2t)]
+    assert metainterp.framestack == fs2
 # ____________________________________________________________
 
 def test_walk_snapshots():



More information about the Pypy-commit mailing list