[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