[pypy-svn] r25263 - in pypy/branch/jit-timeshifter-refactoring/timeshifter: . test
arigo at codespeak.net
arigo at codespeak.net
Mon Apr 3 17:36:13 CEST 2006
Author: arigo
Date: Mon Apr 3 17:36:12 2006
New Revision: 25263
Modified:
pypy/branch/jit-timeshifter-refactoring/timeshifter/rcontainer.py
pypy/branch/jit-timeshifter-refactoring/timeshifter/rvalue.py
pypy/branch/jit-timeshifter-refactoring/timeshifter/test/test_timeshift.py
Log:
(pedronis, arigo)
A quick fix. (insert smiley here)
Modified: pypy/branch/jit-timeshifter-refactoring/timeshifter/rcontainer.py
==============================================================================
--- pypy/branch/jit-timeshifter-refactoring/timeshifter/rcontainer.py (original)
+++ pypy/branch/jit-timeshifter-refactoring/timeshifter/rcontainer.py Mon Apr 3 17:36:12 2006
@@ -28,6 +28,7 @@
class StructTypeDesc(object):
__metaclass__ = cachedtype
+ firstsubstructdesc = None
def __init__(self, TYPE):
self.TYPE = TYPE
@@ -40,6 +41,9 @@
FIELDTYPE = getattr(self.TYPE, name)
if isinstance(FIELDTYPE, lltype.ContainerType):
substructdesc = StructTypeDesc(FIELDTYPE)
+ assert name == self.TYPE._names[0], (
+ "unsupported: inlined substructures not as first field")
+ self.firstsubstructdesc = substructdesc
for subfielddesc in substructdesc.fielddescs:
dottedname = '%s.%s' % (name, subfielddesc.fieldname)
index = len(fielddescs)
@@ -55,7 +59,15 @@
return self.fielddescs[index]
def ll_factory(self):
- return rvalue.PtrRedBox(self.gv_ptrtype, content=VirtualStruct(self))
+ vstruct = VirtualStruct(self)
+ vstruct.substruct_boxes = []
+ typedesc = self
+ while typedesc is not None:
+ box = rvalue.PtrRedBox(typedesc.gv_ptrtype,
+ content=vstruct)
+ vstruct.substruct_boxes.append(box)
+ typedesc = typedesc.firstsubstructdesc
+ return vstruct.substruct_boxes[0]
def _freeze_(self):
return True
@@ -83,6 +95,12 @@
def __init__(self, PTRTYPE, name):
FieldDesc.__init__(self, PTRTYPE, getattr(PTRTYPE.TO, name))
+ self.structdepth = 0
+ T = self.PTRTYPE.TO
+ while (T._names and
+ isinstance(getattr(T, T._names[0]), lltype.ContainerType)):
+ self.structdepth += 1
+ T = getattr(T, T._names[0])
self.fieldname = name
self.gv_fieldname = rgenop.constFieldName(name)
@@ -144,23 +162,22 @@
self.typedesc = typedesc
#self.fz_content initialized later
- def exactmatch(self, box, outgoingvarboxes, memo):
- vstruct = box.content
+ def exactmatch(self, vstruct, outgoingvarboxes, memo):
contmemo = memo.containers
if self in contmemo:
ok = vstruct is contmemo[self]
if not ok:
- outgoingvarboxes.append(box)
+ outgoingvarboxes.extend(vstruct.substruct_boxes)
return ok
if vstruct in contmemo:
assert contmemo[vstruct] is not self
- outgoingvarboxes.append(box)
+ outgoingvarboxes.extend(vstruct.substruct_boxes)
return False
- contmemo[self] = vstruct
- contmemo[vstruct] = self
if self.typedesc is not vstruct.typedesc:
- outgoingvarboxes.append(box)
+ outgoingvarboxes.extend(vstruct.substruct_boxes)
return False
+ contmemo[self] = vstruct
+ contmemo[vstruct] = self
self_boxes = self.fz_content_boxes
vstruct_boxes = vstruct.content_boxes
fullmatch = True
@@ -180,7 +197,7 @@
self.content_boxes = [desc.redboxcls(desc.gv_resulttype,
desc.gv_default)
for desc in typedesc.fielddescs]
- self.genvar = rgenop.nullvar
+ #self.substruct_boxes = ...
def enter_block(self, newblock, incoming, memo):
contmemo = memo.containers
@@ -189,9 +206,7 @@
for box in self.content_boxes:
box.enter_block(newblock, incoming, memo)
- def build_runtime_container(self, jitstate):
- if self.genvar:
- return self.genvar
+ def force_runtime_container(self, jitstate):
typedesc = self.typedesc
boxes = self.content_boxes
self.content_boxes = None
@@ -199,7 +214,15 @@
op_args[0] = typedesc.gv_type
genvar = rgenop.genop(jitstate.curblock, 'malloc', op_args,
typedesc.gv_ptrtype)
- self.genvar = genvar
+ # force all the boxes pointing to this VirtualStruct
+ for box in self.substruct_boxes:
+ # XXX using getsubstruct would be nicer
+ op_args = lltype.malloc(rgenop.VARLIST.TO, 1)
+ op_args[0] = genvar
+ box.genvar = rgenop.genop(jitstate.curblock, 'cast_pointer',
+ op_args, box.gv_type)
+ box.content = None
+ self.substruct_boxes = None
fielddescs = typedesc.fielddescs
for i in range(len(fielddescs)):
fielddesc = fielddescs[i]
@@ -207,8 +230,6 @@
# xxx a bit inefficient
fielddesc.generate_set(jitstate, genvar, box)
- return genvar
-
def freeze(self, memo):
contmemo = memo.containers
try:
@@ -225,10 +246,10 @@
return contmemo[self]
except KeyError:
result = contmemo[self] = VirtualStruct(self.typedesc)
- boxcopies = []
- for box in self.content_boxes:
- boxcopies.append(box.copy(memo))
- result.content_boxes = boxcopies
+ result.content_boxes = [box.copy(memo)
+ for box in self.content_boxes]
+ result.substruct_boxes = [box.copy(memo)
+ for box in self.substruct_boxes]
return result
def op_getfield(self, jitstate, fielddesc):
@@ -239,4 +260,4 @@
def op_getsubstruct(self, jitstate, fielddesc):
#assert fielddesc.fieldindex == 0
- return rvalue.PtrRedBox(fielddesc.gv_resulttype, content=self)
+ return self.substruct_boxes[-fielddesc.structdepth]
Modified: pypy/branch/jit-timeshifter-refactoring/timeshifter/rvalue.py
==============================================================================
--- pypy/branch/jit-timeshifter-refactoring/timeshifter/rvalue.py (original)
+++ pypy/branch/jit-timeshifter-refactoring/timeshifter/rvalue.py Mon Apr 3 17:36:12 2006
@@ -161,13 +161,8 @@
def getgenvar(self, jitstate):
if not self.genvar:
assert self.content
- genvar = self.content.build_runtime_container(jitstate)
- op_args = lltype.malloc(rgenop.VARLIST.TO, 1)
- op_args[0] = genvar
- genvar = rgenop.genop(jitstate.curblock, 'cast_pointer', op_args,
- self.gv_type)
- self.genvar = genvar
- self.content = None
+ self.content.force_runtime_container(jitstate)
+ assert self.genvar
return self.genvar
def enter_block(self, newblock, incoming, memo):
@@ -334,4 +329,5 @@
outgoingvarboxes.append(box)
return False
else:
- return self.fz_content.exactmatch(box, outgoingvarboxes, memo)
+ return self.fz_content.exactmatch(box.content, outgoingvarboxes,
+ memo)
Modified: pypy/branch/jit-timeshifter-refactoring/timeshifter/test/test_timeshift.py
==============================================================================
--- pypy/branch/jit-timeshifter-refactoring/timeshifter/test/test_timeshift.py (original)
+++ pypy/branch/jit-timeshifter-refactoring/timeshifter/test/test_timeshift.py Mon Apr 3 17:36:12 2006
@@ -436,6 +436,26 @@
assert parentindex == 's'
assert parent.n == 3.25
+def test_degenerated_via_substructure():
+ S = lltype.GcStruct('S', ('n', lltype.Signed))
+ T = lltype.GcStruct('T', ('s', S), ('n', lltype.Float))
+
+ def ll_function(flag):
+ t = lltype.malloc(T)
+ t.s.n = 3
+ s = lltype.malloc(S)
+ s.n = 7
+ if flag:
+ pass
+ else:
+ s = t.s
+ t.s.n += 1
+ return s.n * t.s.n
+ insns, res = timeshift(ll_function, [1], [])
+ assert res == 7 * 4
+ insns, res = timeshift(ll_function, [0], [])
+ assert res == 4 * 4
+
def test_plus_minus_all_inlined():
def ll_plus_minus(s, x, y):
acc = x
More information about the Pypy-commit
mailing list