[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