[pypy-svn] r25230 - pypy/branch/jit-timeshifter-refactoring/timeshifter
pedronis at codespeak.net
pedronis at codespeak.net
Sun Apr 2 19:03:30 CEST 2006
Author: pedronis
Date: Sun Apr 2 19:03:28 2006
New Revision: 25230
Modified:
pypy/branch/jit-timeshifter-refactoring/timeshifter/rcontainer.py
pypy/branch/jit-timeshifter-refactoring/timeshifter/rtimeshift.py
pypy/branch/jit-timeshifter-refactoring/timeshifter/rtyper.py
pypy/branch/jit-timeshifter-refactoring/timeshifter/rvalue.py
pypy/branch/jit-timeshifter-refactoring/timeshifter/timeshift.py
Log:
(arre, pedronis)
fixed red repr create and added enter_block, op_get/setfield, and build_runtime_container to VirtualStruct.
Some small fixes and using of constants moved to rgenop too.
More tests pass again.
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 Sun Apr 2 19:03:28 2006
@@ -3,8 +3,7 @@
from pypy.rpython import rgenop
from pypy.jit.timeshifter import rvalue
-
-class AbstractContainer(object):
+class AbstractContainer(rvalue.Memoizable):
pass
# ____________________________________________________________
@@ -55,6 +54,9 @@
index = operator.indexOf(self.TYPE._names, name)
return self.fielddescs[index]
+ def ll_factory(self):
+ return rvalue.PtrRedBox(self.gv_type, content=VirtualStruct(self))
+
def _freeze_(self):
return True
@@ -97,8 +99,10 @@
def __init__(self, PTRTYPE, fieldname, index):
assert isinstance(PTRTYPE.TO, lltype.Struct)
RES1 = PTRTYPE.TO
+ accessptrtype_gv = self.accessptrtype_gv = []
for component in fieldname.split('.'):
LASTSTRUCT = RES1
+ accessptrtype_gv.append(rgenop.constTYPE(lltype.Ptr(LASTSTRUCT)))
RES1 = getattr(RES1, component)
assert not isinstance(RES1, lltype.ContainerType)
self.PTRTYPE = PTRTYPE
@@ -119,6 +123,20 @@
return "Fld_%s_in_%s" % (self.fieldname.replace('.','_'),
self.PTRTYPE._short_name())
+ def generate_set(self, jitstate, genvar, box):
+ gv_sub = genvar
+ for i in range(len(self.accessptrtype_gv)-1):
+ op_args = lltype.malloc(rgenop.VARLIST.TO, 2)
+ op_args[0] = gv_sub
+ op_args[1] = self.fieldname_gv[i]
+ gv_sub = rgenop.genop(jitstate.curblock, 'getsubstruct',
+ op_args, self.accessptrtype_gv[i+1])
+ op_args = lltype.malloc(rgenop.VARLIST.TO, 3)
+ op_args[0] = gv_sub
+ op_args[1] = self.fieldname_gv[-1]
+ op_args[2] = box.getgenvar(jitstate)
+ rgenop.genop(jitstate.curblock, 'setfield', op_args,
+ rgenop.gv_Void)
class VirtualStruct(AbstractContainer):
@@ -127,3 +145,32 @@
self.content_boxes = [desc.redboxcls(desc.gv_resulttype,
desc.gv_default)
for desc in typedesc.fielddescs]
+
+ def enter_block(self, newblock, incoming, memo):
+ if self not in memo:
+ memo[self] = None
+ for box in self.content_boxes:
+ box.enter_block(newblock, incoming, memo)
+
+ def op_getfield(self, jitstate, fielddesc):
+ return self.content_boxes[fielddesc.fieldindex]
+
+ def op_setfield(self, jitstate, fielddesc, valuebox):
+ self.content_boxes[fielddesc.fieldindex] = valuebox
+
+ def build_runtime_container(self, jitstate):
+ typedesc = self.typedesc
+ boxes = self.content_boxes
+ self.content_boxes = None
+ op_args = lltype.malloc(rgenop.VARLIST.TO, 1)
+ op_args[0] = typedesc.gv_type
+ genvar = rgenop.genop(jitstate.curblock, 'malloc', op_args,
+ typedesc.gv_ptrtype)
+ fielddescs = typedesc.fielddescs
+ for i in range(len(fielddescs)):
+ fielddesc = fielddescs[i]
+ box = boxes[i]
+ # xxx a bit inefficient
+ fielddesc.generate_set(jitstate, genvar, box)
+
+ return genvar
Modified: pypy/branch/jit-timeshifter-refactoring/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/jit-timeshifter-refactoring/timeshifter/rtimeshift.py (original)
+++ pypy/branch/jit-timeshifter-refactoring/timeshifter/rtimeshift.py Sun Apr 2 19:03:28 2006
@@ -5,24 +5,10 @@
FOLDABLE_OPS = dict.fromkeys(lloperation.enum_foldable_ops())
-# ____________________________________________________________
-# types and adtmeths
-
-def ll_fixed_items(l):
- return l
-
-def ll_fixed_length(l):
- return len(l)
-
-VARLIST = lltype.Ptr(lltype.GcArray(rgenop.CONSTORVAR,
- adtmeths = {
- "ll_items": ll_fixed_items,
- "ll_length": ll_fixed_length
- }))
##def make_types_const(TYPES):
## n = len(TYPES)
-## l = lltype.malloc(VARLIST.TO, n)
+## l = lltype.malloc(rgenop.VARLIST.TO, n)
## for i in range(n):
## l[i] = rgenop.constTYPE(TYPES[i])
## return l
@@ -61,7 +47,7 @@
## # generic implementation of some operations
## def op_getfield(self, jitstate, fielddesc):
-## op_args = lltype.malloc(VARLIST.TO, 2)
+## op_args = lltype.malloc(rgenop.VARLIST.TO, 2)
## op_args[0] = self.getgenvar(jitstate)
## op_args[1] = fielddesc.gv_fieldname
## genvar = rgenop.genop(jitstate.curblock, 'getfield', op_args,
@@ -69,15 +55,15 @@
## return VarRedBox(genvar)
## def op_setfield(self, jitstate, fielddesc, valuebox):
-## op_args = lltype.malloc(VARLIST.TO, 3)
+## op_args = lltype.malloc(rgenop.VARLIST.TO, 3)
## op_args[0] = self.getgenvar(jitstate)
## op_args[1] = fielddesc.gv_fieldname
## op_args[2] = valuebox.getgenvar(jitstate)
## rgenop.genop(jitstate.curblock, 'setfield', op_args,
-## gv_Void)
+## rgenop.gv_Void)
## def op_getsubstruct(self, jitstate, fielddesc):
-## op_args = lltype.malloc(VARLIST.TO, 2)
+## op_args = lltype.malloc(rgenop.VARLIST.TO, 2)
## op_args[0] = self.getgenvar(jitstate)
## op_args[1] = fielddesc.gv_fieldname
## genvar = rgenop.genop(jitstate.curblock, 'getsubstruct', op_args,
@@ -185,7 +171,7 @@
## typedesc = self.typedesc
## boxes = self.content_boxes
## self.content_boxes = None
-## op_args = lltype.malloc(VARLIST.TO, 1)
+## op_args = lltype.malloc(rgenop.VARLIST.TO, 1)
## op_args[0] = typedesc.gv_type
## self.genvar = rgenop.genop(jitstate.curblock, 'malloc', op_args,
## typedesc.gv_ptrtype)
@@ -269,7 +255,7 @@
## def getgenvar(self, jitstate):
## gv = self.parentbox.getgenvar(jitstate)
-## op_args = lltype.malloc(VARLIST.TO, 2)
+## op_args = lltype.malloc(rgenop.VARLIST.TO, 2)
## op_args[0] = gv
## op_args[1] = self.fielddesc.gv_fieldname
## genvar = rgenop.genop(jitstate.curblock, 'getsubstruct', op_args,
@@ -491,7 +477,7 @@
arg = rvalue.ll_getvalue(argbox, ARG0)
res = opdesc.llop(RESULT, arg)
return rvalue.ll_fromvalue(res)
- op_args = lltype.malloc(VARLIST.TO, 1)
+ op_args = lltype.malloc(rgenop.VARLIST.TO, 1)
op_args[0] = argbox.getgenvar(jitstate)
genvar = rgenop.genop(jitstate.curblock, opdesc.opname, op_args,
opdesc.gv_RESULT)
@@ -508,7 +494,7 @@
arg1 = rvalue.ll_getvalue(argbox1, ARG1)
res = opdesc.llop(RESULT, arg0, arg1)
return rvalue.ll_fromvalue(res)
- op_args = lltype.malloc(VARLIST.TO, 2)
+ op_args = lltype.malloc(rgenop.VARLIST.TO, 2)
op_args[0] = argbox0.getgenvar(jitstate)
op_args[1] = argbox1.getgenvar(jitstate)
genvar = rgenop.genop(jitstate.curblock, opdesc.opname, op_args,
@@ -569,7 +555,7 @@
## smallbox = boxes[i]
## fielddesc = self.fielddescs[i]
## if fielddesc.inlined_typedesc:
-## op_args = lltype.malloc(VARLIST.TO, 2)
+## op_args = lltype.malloc(rgenop.VARLIST.TO, 2)
## op_args[0] = gv
## op_args[1] = fielddesc.gv_fieldname
## gv_sub = rgenop.genop(jitstate.curblock, 'getsubstruct',
@@ -581,12 +567,12 @@
## gv_sub,
## subboxes)
## else:
-## op_args = lltype.malloc(VARLIST.TO, 3)
+## op_args = lltype.malloc(rgenop.VARLIST.TO, 3)
## op_args[0] = gv
## op_args[1] = fielddesc.gv_fieldname
## op_args[2] = smallbox.getgenvar(jitstate)
## rgenop.genop(jitstate.curblock, 'setfield', op_args,
-## gv_Void)
+## rgenop.gv_Void)
## def make(T):
## try:
@@ -669,7 +655,7 @@
return rvalue.ll_fromvalue(res)
assert isinstance(argbox, rvalue.PtrRedBox)
if argbox.content is None:
- op_args = lltype.malloc(VARLIST.TO, 2)
+ op_args = lltype.malloc(rgenop.VARLIST.TO, 2)
op_args[0] = argbox.getgenvar(jitstate)
op_args[1] = fielddesc.fieldname_gv[-1]
genvar = rgenop.genop(jitstate.curblock, 'getfield', op_args,
@@ -678,11 +664,17 @@
else:
return argbox.content.op_getfield(jitstate, fielddesc)
-gv_Void = rgenop.constTYPE(lltype.Void)
-
def ll_generate_setfield(jitstate, fielddesc, destbox, valuebox):
- destbox.op_setfield(jitstate, fielddesc, valuebox)
-
+ assert isinstance(destbox, rvalue.PtrRedBox)
+ if destbox.content is None:
+ op_args = lltype.malloc(rgenop.VARLIST.TO, 3)
+ op_args[0] = destbox.getgenvar(jitstate)
+ op_args[1] = fielddesc.fieldname_gv[-1]
+ op_args[2] = valuebox.getgenvar(jitstate)
+ rgenop.genop(jitstate.curblock, 'setfield', op_args,
+ rgenop.gv_Void)
+ else:
+ destbox.content.op_setfield(jitstate, fielddesc, valuebox)
def ll_generate_getsubstruct(jitstate, fielddesc, argbox):
if argbox.is_constant():
@@ -691,7 +683,7 @@
return rvalue.ll_fromvalue(res)
assert isinstance(argbox, rvalue.PtrRedBox)
if argbox.content is None:
- op_args = lltype.malloc(VARLIST.TO, 2)
+ op_args = lltype.malloc(rgenop.VARLIST.TO, 2)
op_args[0] = argbox.getgenvar(jitstate)
op_args[1] = fielddesc.gv_fieldname
genvar = rgenop.genop(jitstate.curblock, 'getsubstruct', op_args,
@@ -706,7 +698,7 @@
array = rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE)
res = array[rvalue.ll_getvalue(indexbox, lltype.Signed)]
return rvalue.ll_fromvalue(res)
- op_args = lltype.malloc(VARLIST.TO, 2)
+ op_args = lltype.malloc(rgenop.VARLIST.TO, 2)
op_args[0] = argbox.getgenvar(jitstate)
op_args[1] = indexbox.getgenvar(jitstate)
genvar = rgenop.genop(jitstate.curblock, 'getarrayitem', op_args,
@@ -714,7 +706,7 @@
return fielddesc.redboxcls(fielddesc.gv_resulttype, genvar)
##def ll_generate_malloc(jitstate, gv_type, gv_resulttype):
-## op_args = lltype.malloc(VARLIST.TO, 1)
+## op_args = lltype.malloc(rgenop.VARLIST.TO, 1)
## op_args[0] = gv_type
## genvar = rgenop.genop(jitstate.curblock, 'malloc', op_args,
## gv_resulttype)
@@ -843,7 +835,7 @@
def schedule_return(jitstate, redbox):
jitstate.return_queue.append((jitstate.curoutgoinglink, redbox))
-novars = lltype.malloc(VARLIST.TO, 0)
+novars = lltype.malloc(rgenop.VARLIST.TO, 0)
def dispatch_next(jitstate, outredboxes, gv_return_type):
split_queue = jitstate.split_queue
Modified: pypy/branch/jit-timeshifter-refactoring/timeshifter/rtyper.py
==============================================================================
--- pypy/branch/jit-timeshifter-refactoring/timeshifter/rtyper.py (original)
+++ pypy/branch/jit-timeshifter-refactoring/timeshifter/rtyper.py Sun Apr 2 19:03:28 2006
@@ -336,7 +336,7 @@
def create(self, hop):
if self.typedesc is None:
T = self.original_concretetype.TO
- self.typedesc = rtimeshift.StructTypeDesc.make(T)
+ self.typedesc = rcontainer.StructTypeDesc(T)
ts = self.timeshifter
return hop.llops.genmixlevelhelpercall(self.typedesc.ll_factory,
[], [], ts.s_RedBox)
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 Sun Apr 2 19:03:28 2006
@@ -1,8 +1,10 @@
from pypy.rpython import rgenop
from pypy.rpython.lltypesystem import lltype, llmemory
+class Memoizable(object):
+ pass
-class RedBox(object):
+class RedBox(Memoizable):
def __init__(self, gv_type, genvar=rgenop.nullvar):
assert rgenop.isconst(gv_type) # temporary?
@@ -138,6 +140,7 @@
if not self.genvar:
assert self.content
self.genvar = self.content.build_runtime_container(jitstate)
+ self.content = None
return self.genvar
def enter_block(self, newblock, incoming, memo):
@@ -211,8 +214,8 @@
def exactmatch(self, box, outgoingvarboxes, memo):
if (box.is_constant() and
- rgenop.revealconst(lltype.Double, self.gv_const) ==
- rgenop.revealconst(lltype.Double, box.genvar)):
+ rgenop.revealconst(lltype.Float, self.gv_const) ==
+ rgenop.revealconst(lltype.Float, box.genvar)):
return True
else:
outgoingvarboxes.append(box)
Modified: pypy/branch/jit-timeshifter-refactoring/timeshifter/timeshift.py
==============================================================================
--- pypy/branch/jit-timeshifter-refactoring/timeshifter/timeshift.py (original)
+++ pypy/branch/jit-timeshifter-refactoring/timeshifter/timeshift.py Sun Apr 2 19:03:28 2006
@@ -4,7 +4,7 @@
from pypy.annotation import model as annmodel
from pypy.annotation import listdef, dictdef
from pypy.jit.timeshifter import rvalue
-from pypy.jit.timeshifter.rtimeshift import VARLIST, JITState
+from pypy.jit.timeshifter.rtimeshift import JITState
from pypy.rpython import rmodel, rlist, rdict, rgenop, annlowlevel
from pypy.rpython.lltypesystem import rtuple
from pypy.jit.timeshifter import rtimeshift
More information about the Pypy-commit
mailing list