[pypy-svn] r25032 - pypy/dist/pypy/jit
arigo at codespeak.net
arigo at codespeak.net
Mon Mar 27 14:52:06 CEST 2006
Author: arigo
Date: Mon Mar 27 14:52:05 2006
New Revision: 25032
Modified:
pypy/dist/pypy/jit/hintcontainer.py
pypy/dist/pypy/jit/hintmodel.py
pypy/dist/pypy/jit/hintrtyper.py
pypy/dist/pypy/jit/rtimeshift.py
Log:
* VirtualRedBox.getgenvar() support.
* fix the colors in pygame: use red for degenerated virtual
structs too.
Modified: pypy/dist/pypy/jit/hintcontainer.py
==============================================================================
--- pypy/dist/pypy/jit/hintcontainer.py (original)
+++ pypy/dist/pypy/jit/hintcontainer.py Mon Mar 27 14:52:05 2006
@@ -28,7 +28,11 @@
items = AbstractContainerDef.__cache[self.__class__, self.T].items()
keys = [key for key, containerdef in items if containerdef.same_as(self)]
tag = min(keys)
- return "<%s #%d>" % (self.__class__.__name__, tag)
+ if self.degenerated:
+ degen = 'degen '
+ else:
+ degen = ''
+ return "<%s%s #%d>" % (degen, self.__class__.__name__, tag)
# ____________________________________________________________
Modified: pypy/dist/pypy/jit/hintmodel.py
==============================================================================
--- pypy/dist/pypy/jit/hintmodel.py (original)
+++ pypy/dist/pypy/jit/hintmodel.py Mon Mar 27 14:52:05 2006
@@ -101,12 +101,21 @@
pass
class SomeLLAbstractContainer(SomeLLAbstractValue):
- annotationcolor = (0,60,160) # blue
def __init__(self, contentdef):
self.contentdef = contentdef
self.concretetype = lltype.Ptr(contentdef.T)
+ def annotationcolor(self):
+ """Compute the color of the variables with this annotation
+ for the pygame viewer
+ """
+ if getattr(self.contentdef, 'degenerated', False):
+ return None
+ else:
+ return (0,60,160) # blue
+ annotationcolor = property(annotationcolor)
+
setunion = annmodel.setunion
Modified: pypy/dist/pypy/jit/hintrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/hintrtyper.py (original)
+++ pypy/dist/pypy/jit/hintrtyper.py Mon Mar 27 14:52:05 2006
@@ -55,6 +55,7 @@
try:
return self.red_reprs[lowleveltype]
except KeyError:
+ assert not isinstance(lowleveltype, lltype.ContainerType)
redreprcls = RedRepr
if isinstance(lowleveltype, lltype.Ptr):
if isinstance(lowleveltype.TO, lltype.Struct):
@@ -123,15 +124,13 @@
fielddesc = rtimeshift.make_fielddesc(PTRTYPE, c_fieldname.value)
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
- gv_fieldname = rgenop.constFieldName(c_fieldname.value)
gv_resulttype = rgenop.constTYPE(RESTYPE)
- c_fieldname = hop.inputconst(rgenop.CONSTORVAR, gv_fieldname)
c_resulttype = hop.inputconst(rgenop.CONSTORVAR, gv_resulttype)
v_jitstate = hop.llops.getjitstate()
s_CONSTORVAR = annmodel.SomePtr(rgenop.CONSTORVAR)
return hop.llops.genmixlevelhelpercall(rtimeshift.ll_generate_getfield,
- [ts.s_JITState, s_fielddesc, ts.s_RedBox, s_CONSTORVAR, s_CONSTORVAR],
- [v_jitstate, c_fielddesc, v_argbox, c_fieldname, c_resulttype],
+ [ts.s_JITState, s_fielddesc, ts.s_RedBox, s_CONSTORVAR],
+ [v_jitstate, c_fielddesc, v_argbox, c_resulttype],
ts.s_RedBox)
def translate_op_getarrayitem(self, hop):
@@ -171,13 +170,11 @@
fielddesc = rtimeshift.make_fielddesc(PTRTYPE, c_fieldname.value)
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
- gv_fieldname = rgenop.constFieldName(c_fieldname.value)
- c_fieldname = hop.inputconst(rgenop.CONSTORVAR, gv_fieldname)
v_jitstate = hop.llops.getjitstate()
s_CONSTORVAR = annmodel.SomePtr(rgenop.CONSTORVAR)
return hop.llops.genmixlevelhelpercall(rtimeshift.ll_generate_setfield,
- [ts.s_JITState, s_fielddesc, ts.s_RedBox, s_CONSTORVAR, ts.s_RedBox],
- [v_jitstate, c_fielddesc, v_destbox, c_fieldname, v_valuebox],
+ [ts.s_JITState, s_fielddesc, ts.s_RedBox, ts.s_RedBox],
+ [v_jitstate, c_fielddesc, v_destbox, v_valuebox],
annmodel.s_None)
def translate_op_getsubstruct(self, hop):
@@ -192,15 +189,13 @@
fielddesc = rtimeshift.make_fielddesc(PTRTYPE, c_fieldname.value)
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
- gv_fieldname = rgenop.constFieldName(c_fieldname.value)
gv_resulttype = rgenop.constTYPE(RESTYPE)
- c_fieldname = hop.inputconst(rgenop.CONSTORVAR, gv_fieldname)
c_resulttype = hop.inputconst(rgenop.CONSTORVAR, gv_resulttype)
v_jitstate = hop.llops.getjitstate()
s_CONSTORVAR = annmodel.SomePtr(rgenop.CONSTORVAR)
return hop.llops.genmixlevelhelpercall(rtimeshift.ll_generate_getsubstruct,
- [ts.s_JITState, s_fielddesc, ts.s_RedBox, s_CONSTORVAR, s_CONSTORVAR],
- [v_jitstate, c_fielddesc, v_argbox, c_fieldname, c_resulttype],
+ [ts.s_JITState, s_fielddesc, ts.s_RedBox, s_CONSTORVAR],
+ [v_jitstate, c_fielddesc, v_argbox, c_resulttype],
ts.s_RedBox)
@@ -314,10 +309,12 @@
self.timeshifter = timeshifter
def get_genop_var(self, v, llops):
+ ts = self.timeshifter
+ v_jitstate = hop.llops.getjitstate()
return llops.genmixlevelhelpercall(rtimeshift.ll_gvar_from_redbox,
- [llops.timeshifter.s_RedBox],
- [v],
- annmodel.SomePtr(rgenop.CONSTORVAR))
+ [ts.s_JITState, llops.timeshifter.s_RedBox],
+ [v_jitstate, v],
+ annmodel.SomePtr(rgenop.CONSTORVAR))
def convert_const(self, ll_value):
redbox = rtimeshift.ConstRedBox.ll_fromvalue(ll_value)
Modified: pypy/dist/pypy/jit/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/rtimeshift.py (original)
+++ pypy/dist/pypy/jit/rtimeshift.py Mon Mar 27 14:52:05 2006
@@ -33,19 +33,19 @@
return False
# generic implementation of some operations
- def op_getfield(self, jitstate, fielddesc, gv_fieldname, gv_resulttype):
+ def op_getfield(self, jitstate, fielddesc, gv_resulttype):
op_args = lltype.malloc(VARLIST.TO, 2)
- op_args[0] = self.getgenvar()
- op_args[1] = gv_fieldname
+ op_args[0] = self.getgenvar(jitstate)
+ op_args[1] = fielddesc.gv_fieldname
genvar = rgenop.genop(jitstate.curblock, 'getfield', op_args,
gv_resulttype)
return VarRedBox(genvar)
- def op_setfield(self, jitstate, fielddesc, gv_fieldname, valuebox):
+ def op_setfield(self, jitstate, fielddesc, valuebox):
op_args = lltype.malloc(VARLIST.TO, 3)
- op_args[0] = self.getgenvar()
- op_args[1] = gv_fieldname
- op_args[2] = valuebox.getgenvar()
+ 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)
@@ -56,7 +56,7 @@
def __init__(self, genvar):
self.genvar = genvar
- def getgenvar(self):
+ def getgenvar(self, jitstate):
return self.genvar
VCONTAINER = lltype.GcStruct("vcontainer")
@@ -66,7 +66,7 @@
self.envelope = envelope
self.content_addr = content_addr
- def getgenvar(self): # not support at the moment
+ def getgenvar(self, jitstate): # no support at the moment
raise RuntimeError("cannot force virtual containers")
def ll_make_container_box(envelope, content_addr):
@@ -90,17 +90,37 @@
class VirtualRedBox(RedBox):
"A red box that contains (for now) a virtual Struct."
- def __init__(self, content_boxes):
- self.content_boxes = content_boxes[:]
-
- def getgenvar(self): # no support at the moment
- raise RuntimeError("cannot force virtual containers")
+ def __init__(self, typedesc):
+ # XXX pass a TypeDesc instead of these arguments
+ self.content_boxes = typedesc.content_boxes[:]
+ self.typedesc = typedesc
+ self.genvar = rgenop.nullvar
+
+ def getgenvar(self, jitstate):
+ if not self.genvar:
+ typedesc = self.typedesc
+ boxes = self.content_boxes
+ self.content_boxes = None
+ op_args = lltype.malloc(VARLIST.TO, 1)
+ op_args[0] = typedesc.gv_type
+ self.genvar = rgenop.genop(jitstate.curblock, 'malloc', op_args,
+ typedesc.gv_ptrtype)
+ for i in range(len(boxes)):
+ RedBox.op_setfield(self, jitstate, typedesc.fielddescs[i],
+ boxes[i])
+ return self.genvar
- def op_getfield(self, jitstate, fielddesc, gv_fieldname, gv_returntype):
- return self.content_boxes[fielddesc.fieldindex]
+ def op_getfield(self, jitstate, fielddesc, gv_returntype):
+ if self.content_boxes is None:
+ return RedBox.op_getfield(self, jitstate, fielddesc, gv_returntype)
+ else:
+ return self.content_boxes[fielddesc.fieldindex]
- def op_setfield(self, jitstate, fielddesc, gv_fieldname, valuebox):
- self.content_boxes[fielddesc.fieldindex] = valuebox
+ def op_setfield(self, jitstate, fielddesc, valuebox):
+ if self.content_boxes is None:
+ RedBox.op_setfield(self, jitstate, fielddesc, valuebox)
+ else:
+ self.content_boxes[fielddesc.fieldindex] = valuebox
def make_virtualredbox_factory_for_struct(T):
defls = []
@@ -109,8 +129,10 @@
defaultvalue = FIELDTYPE._defl()
defaultbox = ConstRedBox.ll_fromvalue(defaultvalue)
defls.append(defaultbox)
+ desc = ContainerTypeDesc(T)
+ desc.content_boxes = defls
def ll_factory():
- return VirtualRedBox(defls)
+ return VirtualRedBox(desc)
return ll_factory
class ConstRedBox(RedBox):
@@ -119,7 +141,7 @@
def __init__(self, genvar):
self.genvar = genvar
- def getgenvar(self):
+ def getgenvar(self, jitstate):
return self.genvar
def ll_fromvalue(value):
@@ -130,6 +152,7 @@
elif T is lltype.Float:
return DoubleRedBox(gv)
else:
+ assert isinstance(T, lltype.Primitive)
assert T is not lltype.Void, "cannot make red boxes of voids"
# XXX what about long longs?
return IntRedBox(gv)
@@ -222,7 +245,7 @@
res = opdesc.llop(RESULT, arg)
return ConstRedBox.ll_fromvalue(res)
op_args = lltype.malloc(VARLIST.TO, 1)
- op_args[0] = argbox.getgenvar()
+ op_args[0] = argbox.getgenvar(jitstate)
genvar = rgenop.genop(jitstate.curblock, opdesc.opname, op_args,
rgenop.constTYPE(RESULT))
return VarRedBox(genvar)
@@ -240,17 +263,34 @@
res = opdesc.llop(RESULT, arg0, arg1)
return ConstRedBox.ll_fromvalue(res)
op_args = lltype.malloc(VARLIST.TO, 2)
- op_args[0] = argbox0.getgenvar()
- op_args[1] = argbox1.getgenvar()
+ op_args[0] = argbox0.getgenvar(jitstate)
+ op_args[1] = argbox1.getgenvar(jitstate)
genvar = rgenop.genop(jitstate.curblock, opdesc.opname, op_args,
rgenop.constTYPE(RESULT))
return VarRedBox(genvar)
+class ContainerTypeDesc(object):
+ def __init__(self, TYPE):
+ self.TYPE = TYPE
+ self.PTRTYPE = lltype.Ptr(TYPE)
+ self.gv_type = rgenop.constTYPE(self.TYPE)
+ self.gv_ptrtype = rgenop.constTYPE(self.PTRTYPE)
+ # XXX only for Struct so far
+ self.fielddescs = [make_fielddesc(self.PTRTYPE, name)
+ for name in TYPE._names]
+
+ def _freeze_(self):
+ return True
+
+ def compact_repr(self): # goes in ll helper names
+ return "Desc_%s" % (self.TYPE._short_name(),)
+
class FieldDesc(object): # xxx should we use offsets instead
def __init__(self, PTRTYPE, fieldname):
self.PTRTYPE = PTRTYPE
self.immutable = PTRTYPE.TO._hints.get('immutable', False)
self.fieldname = fieldname
+ self.gv_fieldname = rgenop.constFieldName(fieldname)
if isinstance(PTRTYPE.TO, lltype.Struct):
try:
self.fieldindex = operator.indexOf(PTRTYPE.TO._names, fieldname)
@@ -273,28 +313,25 @@
fdesc = _fielddesc_cache[PTRTYPE, fieldname] = FieldDesc(PTRTYPE, fieldname)
return fdesc
-def ll_generate_getfield(jitstate, fielddesc, argbox,
- gv_fieldname, gv_resulttype):
+def ll_generate_getfield(jitstate, fielddesc, argbox, gv_resulttype):
if fielddesc.immutable and isinstance(argbox, ConstRedBox):
res = getattr(argbox.ll_getvalue(fielddesc.PTRTYPE), fielddesc.fieldname)
return ConstRedBox.ll_fromvalue(res)
- return argbox.op_getfield(jitstate, fielddesc, gv_fieldname, gv_resulttype)
+ return argbox.op_getfield(jitstate, fielddesc, gv_resulttype)
gv_Void = rgenop.constTYPE(lltype.Void)
-def ll_generate_setfield(jitstate, fielddesc, destbox,
- gv_fieldname, valuebox):
- destbox.op_setfield(jitstate, fielddesc, gv_fieldname, valuebox)
+def ll_generate_setfield(jitstate, fielddesc, destbox, valuebox):
+ destbox.op_setfield(jitstate, fielddesc, valuebox)
-def ll_generate_getsubstruct(jitstate, fielddesc, argbox,
- gv_fieldname, gv_resulttype):
+def ll_generate_getsubstruct(jitstate, fielddesc, argbox, gv_resulttype):
if isinstance(argbox, ConstRedBox):
res = getattr(argbox.ll_getvalue(fielddesc.PTRTYPE), fielddesc.fieldname)
return ConstRedBox.ll_fromvalue(res)
op_args = lltype.malloc(VARLIST.TO, 2)
- op_args[0] = argbox.getgenvar()
- op_args[1] = gv_fieldname
+ op_args[0] = argbox.getgenvar(jitstate)
+ op_args[1] = fielddesc.gv_fieldname
genvar = rgenop.genop(jitstate.curblock, 'getsubstruct', op_args,
gv_resulttype)
return VarRedBox(genvar)
@@ -307,8 +344,8 @@
res = argbox.ll_getvalue(fielddesc.PTRTYPE)[indexbox.ll_getvalue(lltype.Signed)]
return ConstRedBox.ll_fromvalue(res)
op_args = lltype.malloc(VARLIST.TO, 2)
- op_args[0] = argbox.getgenvar()
- op_args[1] = indexbox.getgenvar()
+ op_args[0] = argbox.getgenvar(jitstate)
+ op_args[1] = indexbox.getgenvar(jitstate)
genvar = rgenop.genop(jitstate.curblock, 'getarrayitem', op_args,
gv_resulttype)
return VarRedBox(genvar)
@@ -336,7 +373,7 @@
oldbox = oldboxes[i]
newbox = redboxes[i]
if isinstance(oldbox, VarRedBox): # Always a match
- incoming.append(newbox.getgenvar())
+ incoming.append(newbox.getgenvar(jitstate))
continue
if oldbox.same_constant(newbox):
continue
@@ -353,7 +390,7 @@
oldbox = oldboxes[i]
newbox = redboxes[i]
if not oldbox.same_constant(newbox):
- incoming.append(newbox.getgenvar())
+ incoming.append(newbox.getgenvar(jitstate))
newgenvar = rgenop.geninputarg(newblock, TYPES[i])
redboxes[i] = VarRedBox(newgenvar)
@@ -387,7 +424,7 @@
jitstate.curoutgoinglink = rgenop.closeblock1(jitstate.curblock)
return switchredbox.ll_getvalue(lltype.Bool)
else:
- exitgvar = switchredbox.getgenvar()
+ exitgvar = switchredbox.getgenvar(jitstate)
linkpair = rgenop.closeblock2(jitstate.curblock, exitgvar)
false_link, true_link = linkpair.item0, linkpair.item1
later_jitstate = jitstate.copystate()
@@ -429,15 +466,15 @@
finalvar = rgenop.geninputarg(finalblock, RETURN_TYPE)
for link, redbox in return_queue:
- genvar = redbox.getgenvar()
+ genvar = redbox.getgenvar(jitstate)
rgenop.closelink(link, [genvar], finalblock)
finallink = rgenop.closeblock1(finalblock)
jitstate.curoutgoinglink = finallink
jitstate.curvalue = VarRedBox(finalvar)
return -1
-def ll_gvar_from_redbox(redbox):
- return redbox.getgenvar()
+def ll_gvar_from_redbox(jitstate, redbox):
+ return redbox.getgenvar(jitstate)
def ll_gvar_from_constant(ll_value):
return rgenop.genconst(ll_value)
@@ -491,5 +528,5 @@
return jitstate.curblock
def ll_close_jitstate(jitstate):
- result_genvar = jitstate.curvalue.getgenvar()
+ result_genvar = jitstate.curvalue.getgenvar(jitstate)
jitstate.close(result_genvar)
More information about the Pypy-commit
mailing list