[pypy-svn] r66693 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Thu Jul 30 13:15:51 CEST 2009
Author: arigo
Date: Thu Jul 30 13:15:49 2009
New Revision: 66693
Modified:
pypy/branch/pyjitpl5/pypy/jit/metainterp/resume.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_resume.py
Log:
Support for rop.NEW in resume.py.
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 Thu Jul 30 13:15:49 2009
@@ -73,6 +73,10 @@
vinfo = VirtualInfo(known_class, fielddescrs)
self._make_virtual(virtualbox, vinfo, fieldboxes)
+ def make_vstruct(self, virtualbox, typedescr, fielddescrs, fieldboxes):
+ vinfo = VStructInfo(typedescr, 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)
@@ -132,16 +136,11 @@
raise NotImplementedError
-class VirtualInfo(AbstractVirtualInfo):
- def __init__(self, known_class, fielddescrs):
- self.known_class = known_class
+class AbstractVirtualStructInfo(AbstractVirtualInfo):
+ def __init__(self, fielddescrs):
self.fielddescrs = fielddescrs
#self.fieldnums = ...
- def allocate(self, metainterp):
- return metainterp.execute_and_record(rop.NEW_WITH_VTABLE,
- [self.known_class])
-
def setfields(self, metainterp, box, fn_decode_box):
for i in range(len(self.fielddescrs)):
fieldbox = fn_decode_box(self.fieldnums[i])
@@ -149,6 +148,24 @@
[box, fieldbox],
descr=self.fielddescrs[i])
+class VirtualInfo(AbstractVirtualStructInfo):
+ def __init__(self, known_class, fielddescrs):
+ AbstractVirtualStructInfo.__init__(self, fielddescrs)
+ self.known_class = known_class
+
+ def allocate(self, metainterp):
+ return metainterp.execute_and_record(rop.NEW_WITH_VTABLE,
+ [self.known_class])
+
+class VStructInfo(AbstractVirtualStructInfo):
+ def __init__(self, typedescr, fielddescrs):
+ AbstractVirtualStructInfo.__init__(self, fielddescrs)
+ self.typedescr = typedescr
+
+ def allocate(self, metainterp):
+ return metainterp.execute_and_record(rop.NEW, [],
+ descr=self.typedescr)
+
class VArrayInfo(AbstractVirtualInfo):
def __init__(self, arraydescr, length):
self.arraydescr = arraydescr
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 Thu Jul 30 13:15:49 2009
@@ -2,6 +2,7 @@
from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.jit.metainterp.resume import *
from pypy.jit.metainterp.history import BoxInt, BoxPtr, ConstInt, ConstAddr
+from pypy.jit.metainterp.history import ConstPtr
from pypy.jit.metainterp.test.test_optimizefindnode import LLtypeMixin
from pypy.jit.metainterp import executor
@@ -64,7 +65,8 @@
resbox = executor.execute(self.cpu, opnum, argboxes, descr)
self.trace.append((opnum,
[box.value for box in argboxes],
- resbox and resbox.value))
+ resbox and resbox.value,
+ descr))
return resbox
demo55 = lltype.malloc(LLtypeMixin.NODE)
@@ -138,13 +140,13 @@
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),
+ (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),
+ (rop.SETFIELD_GC, [b2t.value, c1s.value],None, LLtypeMixin.valuedescr),
+ (rop.SETFIELD_GC, [b4tx, b2t.value], None, LLtypeMixin.nextdescr),
+ (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()
@@ -226,9 +228,9 @@
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),
+ (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()
@@ -243,3 +245,52 @@
assert len(ptr) == 2
assert ptr[0] == 44
assert ptr[1] == 111
+
+
+def test_virtual_adder_make_vstruct():
+ storage = make_demo_storage()
+ b1s, b2s, b3s, b4s = [BoxInt(1), BoxPtr(), BoxInt(3), BoxPtr()]
+ 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_vstruct(b2s,
+ LLtypeMixin.ssize,
+ [LLtypeMixin.adescr, LLtypeMixin.bdescr],
+ [c1s, b4s]) # 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]
+ #
+ NULL = ConstPtr.value
+ b1t, b3t, b4t = [BoxInt(11), BoxInt(33), BoxPtr()]
+ 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, [], b2t.value, LLtypeMixin.ssize),
+ (rop.SETFIELD_GC, [b2t.value, 111], None, LLtypeMixin.adescr),
+ (rop.SETFIELD_GC, [b2t.value, NULL], None, LLtypeMixin.bdescr),
+ ]
+ 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.S)
+ assert ptr.a == 111
+ assert ptr.b == lltype.nullptr(LLtypeMixin.NODE)
More information about the Pypy-commit
mailing list