[pypy-svn] r66680 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Wed Jul 29 21:44:27 CEST 2009


Author: arigo
Date: Wed Jul 29 21:44:26 2009
New Revision: 66680

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/resume.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_resume.py
Log:
Support virtual arrays in resume.py.
Slight improvement of the other tests as well.


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/resume.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/resume.py	Wed Jul 29 21:44:26 2009
@@ -1,5 +1,5 @@
 import sys
-from pypy.jit.metainterp.history import Box, Const
+from pypy.jit.metainterp.history import Box, Const, ConstInt
 from pypy.jit.metainterp.resoperation import rop
 
 # Logic to encode the chain of frames and the state of the boxes at a
@@ -70,9 +70,16 @@
             self.liveboxes[box] = self._getconstindex(const)
 
     def make_virtual(self, virtualbox, known_class, fielddescrs, fieldboxes):
+        vinfo = VirtualInfo(known_class, fielddescrs)
+        self._make_virtual(virtualbox, vinfo, fieldboxes)
+
+    def make_varray(self, virtualbox, arraydescr, itemboxes):
+        vinfo = VArrayInfo(arraydescr, len(itemboxes))
+        self._make_virtual(virtualbox, vinfo, itemboxes)
+
+    def _make_virtual(self, virtualbox, vinfo, fieldboxes):
         assert self.liveboxes[virtualbox] == 0
         self.liveboxes[virtualbox] = len(self.virtuals) | VIRTUAL_FLAG
-        vinfo = VirtualInfo(known_class, fielddescrs)
         self.virtuals.append(vinfo)
         self.vfieldboxes.append(fieldboxes)
         self._register_boxes(fieldboxes)
@@ -118,7 +125,14 @@
         return result
 
 
-class VirtualInfo(object):
+class AbstractVirtualInfo(object):
+    def allocate(self, metainterp):
+        raise NotImplementedError
+    def setfields(self, metainterp, box, fn_decode_box):
+        raise NotImplementedError
+
+
+class VirtualInfo(AbstractVirtualInfo):
     def __init__(self, known_class, fielddescrs):
         self.known_class = known_class
         self.fielddescrs = fielddescrs
@@ -135,6 +149,24 @@
                                           [box, fieldbox],
                                           descr=self.fielddescrs[i])
 
+class VArrayInfo(AbstractVirtualInfo):
+    def __init__(self, arraydescr, length):
+        self.arraydescr = arraydescr
+        self.length = length
+        #self.fieldnums = ...
+
+    def allocate(self, metainterp):
+        return metainterp.execute_and_record(rop.NEW_ARRAY,
+                                             [ConstInt(self.length)],
+                                             descr=self.arraydescr)
+
+    def setfields(self, metainterp, box, fn_decode_box):
+        for i in range(self.length):
+            itembox = fn_decode_box(self.fieldnums[i])
+            metainterp.execute_and_record(rop.SETARRAYITEM_GC,
+                                          [box, ConstInt(i), itembox],
+                                          descr=self.arraydescr)
+
 
 class ResumeDataReader(object):
     i_frame_infos = 0

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_resume.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_resume.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_resume.py	Wed Jul 29 21:44:26 2009
@@ -59,8 +59,13 @@
 class MyMetaInterp:
     def __init__(self, cpu):
         self.cpu = cpu
+        self.trace = []
     def execute_and_record(self, opnum, argboxes, descr=None):
-        return executor.execute(self.cpu, opnum, argboxes, descr)
+        resbox = executor.execute(self.cpu, opnum, argboxes, descr)
+        self.trace.append((opnum,
+                           [box.value for box in argboxes],
+                           resbox and resbox.value))
+        return resbox
 
 demo55 = lltype.malloc(LLtypeMixin.NODE)
 demo55o = lltype.cast_opaque_ptr(llmemory.GCREF, demo55)
@@ -78,14 +83,15 @@
     assert liveboxes == [b1s, b2s, b3s]
     #
     b1t, b2t, b3t = [BoxInt(11), BoxPtr(demo55o), BoxInt(33)]
-    reader = ResumeDataReader(storage, [b1t, b2t, b3t],
-                              MyMetaInterp(LLtypeMixin.cpu))
+    metainterp = MyMetaInterp(LLtypeMixin.cpu)
+    reader = ResumeDataReader(storage, [b1t, b2t, b3t], metainterp)
     lst = reader.consume_boxes()
     assert lst == [b1t, ConstInt(1), b1t, b2t]
     lst = reader.consume_boxes()
     assert lst == [ConstInt(2), ConstInt(3)]
     lst = reader.consume_boxes()
     assert lst == [b1t, b2t, b3t]
+    assert metainterp.trace == []
 
 
 def test_virtual_adder_make_virtual():
@@ -124,15 +130,29 @@
                          b5s]
     #
     b1t, b3t, b5t = [BoxInt(11), BoxInt(33), BoxPtr(demo55o)]
-    reader = ResumeDataReader(storage, [b1t, b3t, b5t],
-                              MyMetaInterp(LLtypeMixin.cpu))
+    metainterp = MyMetaInterp(LLtypeMixin.cpu)
+    reader = ResumeDataReader(storage, [b1t, b3t, b5t], metainterp)
     lst = reader.consume_boxes()
     b2t = lst[-1]
     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 == [
+        (rop.NEW_WITH_VTABLE, [LLtypeMixin.node_vtable_adr], b2t.value),
+        (rop.NEW_WITH_VTABLE, [LLtypeMixin.node_vtable_adr2], b4tx),
+        (rop.SETFIELD_GC, [b2t.value, b4tx], None),
+        (rop.SETFIELD_GC, [b2t.value, c1s.value], None),
+        (rop.SETFIELD_GC, [b4tx, b2t.value], None),
+        (rop.SETFIELD_GC, [b4tx, b3t.value], None),
+        (rop.SETFIELD_GC, [b4tx, b5t.value], None),
+        ]
+    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)
@@ -165,8 +185,8 @@
         assert liveboxes == [b2s, b3s]
         #
         b2t, b3t = [BoxPtr(demo55o), BoxInt(33)]
-        reader = ResumeDataReader(storage, [b2t, b3t],
-                                  MyMetaInterp(LLtypeMixin.cpu))
+        metainterp = MyMetaInterp(LLtypeMixin.cpu)
+        reader = ResumeDataReader(storage, [b2t, b3t], metainterp)
         lst = reader.consume_boxes()
         c1t = ConstInt(111)
         assert lst == [c1t, ConstInt(1), c1t, b2t]
@@ -174,3 +194,52 @@
         assert lst == [ConstInt(2), ConstInt(3)]
         lst = reader.consume_boxes()
         assert lst == [c1t, b2t, b3t]
+        assert metainterp.trace == []
+
+
+def test_virtual_adder_make_varray():
+    storage = make_demo_storage()
+    b1s, b2s, b3s, b4s = [BoxInt(1), BoxPtr(), BoxInt(3), BoxInt(4)]
+    c1s = ConstInt(111)
+    modifier = ResumeDataVirtualAdder(storage, [b1s, b2s, b3s])
+    assert not modifier.is_virtual(b1s)
+    assert not modifier.is_virtual(b2s)
+    assert not modifier.is_virtual(b3s)
+    modifier.make_varray(b2s,
+                         LLtypeMixin.arraydescr,
+                         [b4s, c1s])   # new fields
+    assert not modifier.is_virtual(b1s)
+    assert     modifier.is_virtual(b2s)
+    assert not modifier.is_virtual(b3s)
+    assert not modifier.is_virtual(b4s)
+    # done
+    liveboxes = modifier.finish()
+    assert liveboxes == [b1s,
+                         #b2s -- virtual
+                         b3s,
+                         b4s]
+    #
+    b1t, b3t, b4t = [BoxInt(11), BoxInt(33), BoxInt(44)]
+    metainterp = MyMetaInterp(LLtypeMixin.cpu)
+    reader = ResumeDataReader(storage, [b1t, b3t, b4t], metainterp)
+    lst = reader.consume_boxes()
+    b2t = lst[-1]
+    assert lst == [b1t, ConstInt(1), b1t, b2t]
+    assert metainterp.trace == [
+        (rop.NEW_ARRAY, [2], b2t.value),
+        (rop.SETARRAYITEM_GC, [b2t.value, 0, 44], None),
+        (rop.SETARRAYITEM_GC, [b2t.value, 1, 111], None),
+        ]
+    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(lltype.GcArray(lltype.Signed))
+    assert len(ptr) == 2
+    assert ptr[0] == 44
+    assert ptr[1] == 111



More information about the Pypy-commit mailing list