[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