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

pedronis at codespeak.net pedronis at codespeak.net
Tue Oct 6 17:56:20 CEST 2009


Author: pedronis
Date: Tue Oct  6 17:56:20 2009
New Revision: 68211

Modified:
   pypy/trunk/pypy/jit/metainterp/resume.py
   pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py
   pypy/trunk/pypy/jit/metainterp/test/test_resume.py
Log:
(cfbolz, pedronis): keep the frame infos as chained lists. fix dump_storage


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:56:20 2009
@@ -217,7 +217,6 @@
         storage.rd_frame_infos = frame_infos        
 
     def finish(self, values):
-        self._flatten_frame_info()
         storage = self.storage
         liveboxes = []
         for box in self.liveboxes.iterkeys():
@@ -225,18 +224,18 @@
                 self.liveboxes[box] = tag(len(liveboxes), TAGBOX)
                 liveboxes.append(box)
         nums = storage.rd_nums = [rffi.r_short(0)]*self.nnums
-        i = self.nnums-1
+        i = 0
         snapshot = self.storage.rd_snapshot
         while True: # at least one
             boxes = snapshot.boxes
-            nums[i] = NEXTFRAME
-            i -= 1
-            for j in range(len(boxes)-1, -1, -1):
+            for j in range(len(boxes)):
                 box = boxes[j]
                 if box in values:
                     box = values[box].get_key_box()
                 nums[i] = self._gettagged(box)
-                i -= 1
+                i += 1
+            nums[i] = NEXTFRAME
+            i += 1
             snapshot = snapshot.prev
             if snapshot is None:
                 break
@@ -292,7 +291,7 @@
         return 'VirtualInfo("%s", %s, %s)' % (
             self.known_class,
             ['"%s"' % (fd,) for fd in self.fielddescrs],
-            self.fieldnums)
+            [untag(i) for i in self.fieldnums])
 
 class VStructInfo(AbstractVirtualStructInfo):
     def __init__(self, typedescr, fielddescrs):
@@ -306,7 +305,7 @@
         return 'VStructInfo("%s", %s, %s)' % (
             self.typedescr,
             ['"%s"' % (fd,) for fd in self.fielddescrs],
-            self.fieldnums)
+            [untag(i) for i in self.fieldnums])
 
 class VArrayInfo(AbstractVirtualInfo):
     def __init__(self, arraydescr):
@@ -327,21 +326,26 @@
                                           box, ConstInt(i), itembox)
 
     def repr_rpython(self):
-        return 'VArrayInfo("%s", %s)' % (self.arraydescr,
-                                         self.fieldnums)
+        return 'VArrayInfo("%s", %s)' % (
+            self.arraydescr,
+            [untag(i) for i in 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)
+def rebuild_from_resumedata(metainterp, newboxes, storage, expects_virtualizables):
+    resumereader = ResumeDataReader(storage, newboxes, metainterp)
+    virtualizable_boxes = None
     if expects_virtualizables:
         virtualizable_boxes = resumereader.consume_boxes()
-        return virtualizable_boxes
-    return None
+    frameinfo = storage.rd_frame_info_list
+    while True:
+        env = resumereader.consume_boxes()
+        f = metainterp.newframe(frameinfo.jitcode)
+        f.setup_resume_at_op(frameinfo.pc, frameinfo.exception_target, env)
+        frameinfo = frameinfo.prev
+        if frameinfo is None:
+            break
+    metainterp.framestack.reverse()
+    return virtualizable_boxes
 
 
 class ResumeDataReader(object):
@@ -350,7 +354,6 @@
     virtuals = None
 
     def __init__(self, storage, liveboxes, metainterp=None):
-        self.frame_infos = storage.rd_frame_infos
         self.nums = storage.rd_nums
         self.consts = storage.rd_consts
         self.liveboxes = liveboxes
@@ -387,14 +390,6 @@
             assert tag == TAGBOX
             return self.liveboxes[num]
 
-    def has_more_frame_infos(self):
-        return self.i_frame_infos < len(self.frame_infos)
-
-    def consume_frame_info(self):
-        frame_info = self.frame_infos[self.i_frame_infos]
-        self.i_frame_infos += 1
-        return frame_info
-
 # ____________________________________________________________
 
 def dump_storage(storage, liveboxes):
@@ -403,9 +398,14 @@
     from pypy.rlib import objectmodel
     fd = os.open('log.storage', os.O_WRONLY | os.O_APPEND | os.O_CREAT, 0666)
     os.write(fd, 'Log(%d, [\n' % objectmodel.compute_unique_id(storage))
-    for frame_info in storage.rd_frame_infos:
-        os.write(fd, '\t("%s", %d, %d),\n' % frame_info)
-    os.write(fd, '\t],\n\t%s,\n' % (storage.rd_nums,))
+    frameinfo = storage.rd_frame_info_list
+    while True:
+        os.write(fd, '\t("%s", %d, %d),\n' % (
+            frameinfo.jitcode, frameinfo.pc, frameinfo.exception_target))
+        frameinfo = frameinfo.prev
+        if frameinfo is None:
+            break
+    os.write(fd, '\t],\n\t%s,\n' % ([untag(i) for i in storage.rd_nums],))
     os.write(fd, '\t[\n')
     for const in storage.rd_consts:
         os.write(fd, '\t"%s",\n' % (const.repr_rpython(),))

Modified: pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py	Tue Oct  6 17:56:20 2009
@@ -32,7 +32,6 @@
     fdescr = ResumeGuardDescr(None)
     op = ResOperation(rop.GUARD_TRUE, [], None, descr=fdescr)
     # setup rd data
-    fi = [("code0", 1, 2), ("code1", 3, -1)]
     fi0 = resume.FrameInfo(None, FakeFrame("code0", 1, 2))
     fdescr.rd_frame_info_list = resume.FrameInfo(fi0,
                                                  FakeFrame("code1", 3, -1))
@@ -41,15 +40,14 @@
     #
     opt.store_final_boxes_in_guard(op)
     if op.fail_args == [b0, b1]:
-        assert fdescr.rd_nums == [tag(0, TAGBOX), NEXTFRAME,
-                                  tag(1, TAGBOX), NEXTFRAME]
-    else:
-        assert op.fail_args == [b1, b0]
         assert fdescr.rd_nums == [tag(1, TAGBOX), NEXTFRAME,
                                   tag(0, TAGBOX), NEXTFRAME]
+    else:
+        assert op.fail_args == [b1, b0]
+        assert fdescr.rd_nums == [tag(0, TAGBOX), NEXTFRAME,
+                                  tag(1, TAGBOX), NEXTFRAME]
     assert fdescr.rd_virtuals is None
     assert fdescr.rd_consts == []
-    assert fdescr.rd_frame_infos == fi
 
 def test_sharing_field_lists_of_virtual():
     virt1 = optimizeopt.AbstractVirtualStructValue(None, None)

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:56:20 2009
@@ -89,23 +89,7 @@
     lst = reader.consume_boxes()
     assert lst == [b1s, b2s, b3s]
 
-def test_frame_info():
-    storage = Storage()
-    storage.rd_frame_infos = [(1, 2, 5), (3, 4, 7)]
-    storage.rd_consts = []
-    storage.rd_nums = []
-    storage.rd_virtuals = None    
-    #
-    reader = ResumeDataReader(storage, [])
-    assert reader.has_more_frame_infos()
-    fi = reader.consume_frame_info()
-    assert fi == (1, 2, 5)
-    assert reader.has_more_frame_infos()
-    fi = reader.consume_frame_info()
-    assert fi == (3, 4, 7)
-    assert not reader.has_more_frame_infos()
-
-# ____________________________________________________________
+    # ____________________________________________________________
 
 
 
@@ -434,11 +418,11 @@
     metainterp = MyMetaInterp(LLtypeMixin.cpu)
     reader = ResumeDataReader(storage, newboxes, metainterp)
     lst = reader.consume_boxes()
-    assert lst == [b1t, ConstInt(1), b1t, b2t]
+    assert lst == [b1t, b2t, b3t]
     lst = reader.consume_boxes()
     assert lst == [ConstInt(2), ConstInt(3)]
     lst = reader.consume_boxes()
-    assert lst == [b1t, b2t, b3t]
+    assert lst == [b1t, ConstInt(1), b1t, b2t]
     assert metainterp.trace == []
 
 def test_virtual_adder_int_constants():
@@ -452,12 +436,12 @@
     metainterp = MyMetaInterp(LLtypeMixin.cpu)
     reader = ResumeDataReader(storage, [], metainterp)
     lst = reader.consume_boxes()
-    assert lst == [ConstInt(sys.maxint), ConstInt(1), ConstInt(sys.maxint),
-                   ConstInt(2**16)]
+    assert lst == [b1s, b2s, b3s]
     lst = reader.consume_boxes()
     assert lst == [ConstInt(2), ConstInt(3)]
     lst = reader.consume_boxes()
-    assert lst == [b1s, b2s, b3s]
+    assert lst == [ConstInt(sys.maxint), ConstInt(1), ConstInt(sys.maxint),
+                   ConstInt(2**16)]
     assert metainterp.trace == []
 
 
@@ -507,11 +491,11 @@
     metainterp = MyMetaInterp(LLtypeMixin.cpu)
     reader = ResumeDataReader(storage, newboxes, metainterp)
     lst = reader.consume_boxes()
-    assert lst == [b1t, ConstInt(1), b1t, b1t]
+    assert lst == [b1t, b1t, b3t]
     lst = reader.consume_boxes()
     assert lst == [ConstInt(2), ConstInt(3)]
     lst = reader.consume_boxes()
-    assert lst == [b1t, b1t, b3t]
+    assert lst == [b1t, ConstInt(1), b1t, b1t]
     assert metainterp.trace == []    
 
 def test_virtual_adder_make_virtual():
@@ -551,12 +535,19 @@
     #
     metainterp = MyMetaInterp(LLtypeMixin.cpu)
     reader = ResumeDataReader(storage, newboxes, metainterp)
+    trace = metainterp.trace[:]
+    del metainterp.trace[:]
+    lst = reader.consume_boxes()
+    b2t = lst[1]
+    assert lst == [b1t, b2t, b3t]
+    lst = reader.consume_boxes()
+    assert lst == [ConstInt(2), ConstInt(3)]
     lst = reader.consume_boxes()
-    b2t = lst[-1]
+    assert metainterp.trace == []
     assert lst == [b1t, ConstInt(1), b1t, b2t]
     b4tx = b2t.value._obj.container._as_ptr().next
     b4tx = lltype.cast_opaque_ptr(llmemory.GCREF, b4tx)
-    assert metainterp.trace == [
+    assert trace == [
         (rop.NEW_WITH_VTABLE, [LLtypeMixin.node_vtable_adr], b2t.value, None),
         (rop.NEW_WITH_VTABLE, [LLtypeMixin.node_vtable_adr2], b4tx, None),
         (rop.SETFIELD_GC, [b2t.value, b4tx],     None, LLtypeMixin.nextdescr),
@@ -565,13 +556,6 @@
         (rop.SETFIELD_GC, [b4tx, b3t.value],     None, LLtypeMixin.valuedescr),
         (rop.SETFIELD_GC, [b4tx, b5t.value],     None, LLtypeMixin.otherdescr),
         ]
-    del metainterp.trace[:]
-    lst = reader.consume_boxes()
-    assert lst == [ConstInt(2), ConstInt(3)]
-    assert metainterp.trace == []
-    lst = reader.consume_boxes()
-    assert lst == [b1t, b2t, b3t]
-    assert metainterp.trace == []
     #
     ptr = b2t.value._obj.container._as_ptr()
     assert lltype.typeOf(ptr) == lltype.Ptr(LLtypeMixin.NODE)
@@ -610,11 +594,11 @@
         reader = ResumeDataReader(storage, newboxes, metainterp)
         lst = reader.consume_boxes()
         c1t = ConstInt(111)
-        assert lst == [c1t, ConstInt(1), c1t, b2t]
+        assert lst == [c1t, b2t, b3t]
         lst = reader.consume_boxes()
         assert lst == [ConstInt(2), ConstInt(3)]
         lst = reader.consume_boxes()
-        assert lst == [c1t, b2t, b3t]
+        assert lst == [c1t, ConstInt(1), c1t, b2t]
         assert metainterp.trace == []
 
 
@@ -643,20 +627,21 @@
     #
     metainterp = MyMetaInterp(LLtypeMixin.cpu)
     reader = ResumeDataReader(storage, newboxes, metainterp)
+    trace = metainterp.trace[:]
+    del metainterp.trace[:]
     lst = reader.consume_boxes()
-    b2t = lst[-1]
-    assert lst == [b1t, ConstInt(1), b1t, b2t]
-    assert metainterp.trace == [
+    b2t = lst[1]
+    assert lst == [b1t, b2t, b3t]
+    assert trace == [
         (rop.NEW_ARRAY, [2], b2t.value,                LLtypeMixin.arraydescr),
         (rop.SETARRAYITEM_GC, [b2t.value,0,44],  None, LLtypeMixin.arraydescr),
         (rop.SETARRAYITEM_GC, [b2t.value,1,111], None, LLtypeMixin.arraydescr),
         ]
-    del metainterp.trace[:]
     lst = reader.consume_boxes()
     assert lst == [ConstInt(2), ConstInt(3)]
     assert metainterp.trace == []
     lst = reader.consume_boxes()
-    assert lst == [b1t, b2t, b3t]
+    assert lst == [b1t, ConstInt(1), b1t, b2t]
     assert metainterp.trace == []
     #
     ptr = b2t.value._obj.container._as_ptr()
@@ -694,9 +679,11 @@
     metainterp = MyMetaInterp(LLtypeMixin.cpu)
     reader = ResumeDataReader(storage, newboxes, metainterp)
     lst = reader.consume_boxes()
-    b2t = lst[-1]
-    assert lst == [b1t, ConstInt(1), b1t, b2t]
-    assert metainterp.trace == [
+    trace = metainterp.trace[:]
+    del metainterp.trace[:]
+    b2t = lst[1]
+    assert lst == [b1t, b2t, b3t]
+    assert trace == [
         (rop.NEW, [], b2t.value, LLtypeMixin.ssize),
         (rop.SETFIELD_GC, [b2t.value, 111],  None, LLtypeMixin.adescr),
         (rop.SETFIELD_GC, [b2t.value, NULL], None, LLtypeMixin.bdescr),
@@ -706,7 +693,7 @@
     assert lst == [ConstInt(2), ConstInt(3)]
     assert metainterp.trace == []
     lst = reader.consume_boxes()
-    assert lst == [b1t, b2t, b3t]
+    assert lst == [b1t, ConstInt(1), b1t, b2t]
     assert metainterp.trace == []
     #
     ptr = b2t.value._obj.container._as_ptr()



More information about the Pypy-commit mailing list