[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