[pypy-svn] r51260 - in pypy/branch/jit-refactoring/pypy/jit: rainbow rainbow/test timeshifter

cfbolz at codespeak.net cfbolz at codespeak.net
Mon Feb 4 16:47:15 CET 2008


Author: cfbolz
Date: Mon Feb  4 16:47:13 2008
New Revision: 51260

Modified:
   pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
   pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
   pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
   pypy/branch/jit-refactoring/pypy/jit/timeshifter/rcontainer.py
   pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py
Log:
the first very very simple struct test passes


Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py	Mon Feb  4 16:47:13 2008
@@ -3,7 +3,7 @@
 from pypy.rpython.lltypesystem import lltype
 from pypy.jit.hintannotator.model import originalconcretetype
 from pypy.jit.hintannotator import model as hintmodel
-from pypy.jit.timeshifter import rtimeshift, rvalue, exception
+from pypy.jit.timeshifter import rtimeshift, rvalue, rcontainer, exception
 from pypy.jit.timeshifter.greenkey import KeyDesc
 from pypy.jit.rainbow.interpreter import JitCode, JitInterpreter
 from pypy.translator.backendopt.removenoops import remove_same_as
@@ -40,6 +40,8 @@
         self.typekinds = []
         self.redboxclasses = []
         self.keydescs = []
+        self.structtypedescs = []
+        self.fielddescs = []
         self.called_bytecodes = []
         self.num_mergepoints = 0
         self.graph_color = self.graph_calling_color(graph)
@@ -57,8 +59,12 @@
         self.free_green = {}
         # mapping TYPE to index
         self.type_positions = {}
-        # mapping tuple of green TYPES to index
+        # mapping tuples of green TYPES to index
         self.keydesc_positions = {}
+        # mapping STRUCTS to index
+        self.structtypedesc_positions = {}
+        # mapping tuples of STRUCT, name to index
+        self.fielddesc_positions = {}
         # mapping graphs to index
         self.graph_positions = {}
         # mapping fnobjs to index
@@ -75,6 +81,8 @@
                           self.typekinds,
                           self.redboxclasses,
                           self.keydescs,
+                          self.structtypedescs,
+                          self.fielddescs,
                           self.called_bytecodes,
                           self.num_mergepoints,
                           self.graph_color,
@@ -179,7 +187,7 @@
                 result.append(self.serialize_oparg(color, v))
             self.emit("make_new_%svars" % (color, ))
             self.emit(len(args))
-            self.emit(result)
+            self.emit(*result)
 
     def serialize_op(self, op):
         specialcase = getattr(self, "serialize_op_%s" % (op.opname, ), None)
@@ -190,7 +198,7 @@
         for arg in op.args:
             args.append(self.serialize_oparg(color, arg))
         self.serialize_opcode(color, op)
-        self.emit(args)
+        self.emit(*args)
         if self.hannotator.binding(op.result).is_green():
             self.register_greenvar(op.result)
         else:
@@ -287,6 +295,28 @@
         self.type_positions[TYPE] = result
         return result
 
+    def structtypedesc_position(self, TYPE):
+        if TYPE in self.structtypedesc_positions:
+            return self.structtypedesc_positions[TYPE]
+        self.structtypedescs.append(
+            rcontainer.StructTypeDesc(self.RGenOp, TYPE))
+        result = len(self.structtypedesc_positions)
+        self.structtypedesc_positions[TYPE] = result
+        return result
+
+    def fielddesc_position(self, TYPE, fieldname):
+        if (fieldname, TYPE) in self.fielddesc_positions:
+            return self.fielddesc_positions[fieldname, TYPE]
+        structtypedesc = rcontainer.StructTypeDesc(self.RGenOp, TYPE)
+        fielddesc = structtypedesc.getfielddesc(fieldname)
+        if fielddesc is None:
+            self.fielddesc_positions[fieldname, TYPE] = -1
+            return -1
+        result = len(self.fielddescs)
+        self.fielddescs.append(fielddesc)
+        self.fielddesc_positions[fieldname, TYPE] = result
+        return result
+
     def graph_position(self, graph):
         if graph in self.graph_positions:
             return self.graph_positions[graph]
@@ -324,12 +354,11 @@
         self.nonrainbow_positions[fn] = result
         return result
         
-    def emit(self, stuff):
+    def emit(self, *stuff):
         assert stuff is not None
-        if isinstance(stuff, list):
-            self.assembler.extend(stuff)
-        else:
-            self.assembler.append(stuff)
+        for x in stuff:
+            assert not isinstance(x, list)
+            self.assembler.append(x)
 
     def sort_by_color(self, vars, by_color_of_vars=None):
         reds = []
@@ -417,7 +446,37 @@
         XXX
 
     def serialize_op_getfield(self, op):
-        XXX
+        assert self.opcolor(op) == "red"
+        args = op.args
+        if args[0] == self.exceptiondesc.cexcdata:
+            # reading one of the exception boxes (exc_type or exc_value)
+            fieldname = args[1].value
+            if fieldname == 'exc_type':
+                self.emit("read_exctype")
+            elif fieldname == 'exc_value':
+                self.emit("read_excvalue")
+            else:
+                raise Exception("getfield(exc_data, %r)" % (fieldname,))
+            self.register_redvar(op.result)
+            return
+
+        # virtualizable access read
+        PTRTYPE = args[0].concretetype
+        if PTRTYPE.TO._hints.get('virtualizable', False):
+            XXX
+
+        # non virtual case                
+        index = self.serialize_oparg("red", args[0])
+        fieldname = args[1].value
+        s_struct = self.hannotator.binding(args[0])
+        deepfrozen = s_struct.deepfrozen
+        
+        fielddescindex = self.fielddesc_position(PTRTYPE.TO, fieldname)
+        if fielddescindex == -1:   # Void field
+            return
+        self.emit("red_getfield", index, fielddescindex, deepfrozen)
+        self.register_redvar(op.result)
+
 
     # call handling
 
@@ -521,6 +580,8 @@
             opcode = interpreter.find_opcode(arg)
             assert opcode >= 0, "unknown opcode %s" % (arg, )
             emit_2byte(opcode)
+        elif isinstance(arg, bool):
+            result.append(chr(int(arg)))
         elif isinstance(arg, int):
             emit_2byte(arg)
         elif isinstance(arg, label):

Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py	Mon Feb  4 16:47:13 2008
@@ -18,7 +18,8 @@
     """
 
     def __init__(self, name, code, constants, typekinds, redboxclasses,
-                 keydescs, called_bytecodes, num_mergepoints, graph_color,
+                 keydescs, structtypedescs, fielddescs, called_bytecodes,
+                 num_mergepoints, graph_color,
                  nonrainbow_functions, is_portal):
         self.name = name
         self.code = code
@@ -26,6 +27,8 @@
         self.typekinds = typekinds
         self.redboxclasses = redboxclasses
         self.keydescs = keydescs
+        self.structtypedescs = structtypedescs
+        self.fielddescs = fielddescs
         self.called_bytecodes = called_bytecodes
         self.num_mergepoints = num_mergepoints
         self.graph_color = graph_color
@@ -103,6 +106,12 @@
             self.frame.pc = resumepoint
 
     # operation helper functions
+    def load_byte(self):
+        pc = self.frame.pc
+        assert pc >= 0
+        result = ord(self.frame.bytecode.code[pc])
+        self.frame.pc = pc + 1
+        return result
 
     def load_2byte(self):
         pc = self.frame.pc
@@ -122,6 +131,9 @@
         self.frame.pc = pc + 4
         return intmask(result)
 
+    def load_bool(self):
+        return bool(self.load_byte())
+
     def get_greenarg(self):
         i = self.load_2byte()
         if i < 0:
@@ -276,6 +288,25 @@
         self.green_result(self.jitstate.greens[0])
 
 
+    # exceptions
+
+    def opimpl_read_exctype(self):
+        XXX
+
+    def opimpl_read_excvalue(self):
+        XXX
+
+    # structs and arrays
+
+    def opimpl_red_getfield(self):
+        structbox = self.get_redarg()
+        fielddesc = self.frame.bytecode.fielddescs[self.load_2byte()]
+        deepfrozen = self.load_bool()
+        resbox = rtimeshift.gengetfield(self.jitstate, deepfrozen, fielddesc,
+                                        structbox)
+        self.red_result(resbox)
+
+
     # ____________________________________________________________
     # construction-time interface
 

Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py	Mon Feb  4 16:47:13 2008
@@ -46,10 +46,6 @@
         del cls._cache_order
 
     def serialize(self, func, values, backendoptimize=False):
-        if hasattr(func, 'convert_arguments'):
-            assert len(func.convert_arguments) == len(values)
-            values = [decoder(value) for decoder, value in zip(
-                                        func.convert_arguments, values)]
         key = func, backendoptimize
         try:
             cache, argtypes = self._cache[key]
@@ -115,7 +111,10 @@
         return writer, jitcode, argcolors
 
     def interpret(self, ll_function, values, opt_consts=[], *args, **kwds):
-        # XXX clean this mess up
+        if hasattr(ll_function, 'convert_arguments'):
+            assert len(ll_function.convert_arguments) == len(values)
+            values = [decoder(value) for decoder, value in zip(
+                                        ll_function.convert_arguments, values)]
         writer, jitcode, argcolors = self.serialize(ll_function, values)
         rgenop = writer.RGenOp()
         sigtoken = rgenop.sigToken(self.RESIDUAL_FUNCTYPE)
@@ -501,7 +500,6 @@
         
 
     def test_simple_struct(self):
-        py.test.skip("arrays and structs are not working")
         S = lltype.GcStruct('helloworld', ('hello', lltype.Signed),
                                           ('world', lltype.Signed),
                             hints={'immutable': True})

Modified: pypy/branch/jit-refactoring/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/timeshifter/rcontainer.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/timeshifter/rcontainer.py	Mon Feb  4 16:47:13 2008
@@ -70,14 +70,13 @@
     firstsubstructdesc = None
     materialize = None
 
-    def __new__(cls, hrtyper, TYPE):
+    def __new__(cls, RGenOp, TYPE):
         if TYPE._hints.get('virtualizable', False):
             return object.__new__(VirtualizableStructTypeDesc)
         else:
             return object.__new__(StructTypeDesc)
             
-    def __init__(self, hrtyper, TYPE):
-        RGenOp = hrtyper.RGenOp
+    def __init__(self, RGenOp, TYPE):
         self.TYPE = TYPE
         self.PTRTYPE = lltype.Ptr(TYPE)
         self.ptrkind = RGenOp.kindToken(self.PTRTYPE)
@@ -93,7 +92,7 @@
         self.null = self.PTRTYPE._defl()
         self.gv_null = RGenOp.constPrebuiltGlobal(self.null)
 
-        self._compute_fielddescs(hrtyper)
+        self._compute_fielddescs(RGenOp)
 
         if self.immutable and self.noidentity:
             self._define_materialize()
@@ -102,8 +101,7 @@
             self._define_devirtualize()
 
         
-    def _compute_fielddescs(self, hrtyper):
-        RGenOp = hrtyper.RGenOp
+    def _compute_fielddescs(self, RGenOp):
         TYPE = self.TYPE
         innermostdesc = self
         fielddescs = []
@@ -112,10 +110,10 @@
             FIELDTYPE = getattr(TYPE, name)
             if isinstance(FIELDTYPE, lltype.ContainerType):
                 if isinstance(FIELDTYPE, lltype.Array):
-                    self.arrayfielddesc = ArrayFieldDesc(hrtyper, FIELDTYPE)
+                    self.arrayfielddesc = ArrayFieldDesc(RGenOp, FIELDTYPE)
                     self.varsizealloctoken = RGenOp.varsizeAllocToken(TYPE)
                     continue
-                substructdesc = StructTypeDesc(hrtyper, FIELDTYPE)
+                substructdesc = StructTypeDesc(RGenOp, FIELDTYPE)
                 assert name == TYPE._names[0], (
                     "unsupported: inlined substructures not as first field")
                 fielddescs.extend(substructdesc.fielddescs)
@@ -126,7 +124,7 @@
                 if FIELDTYPE is lltype.Void:
                     desc = None
                 else:
-                    desc = StructFieldDesc(hrtyper, self.PTRTYPE, name, index)
+                    desc = StructFieldDesc(RGenOp, self.PTRTYPE, name, index)
                     fielddescs.append(desc)
                 fielddesc_by_name[name] = desc
 
@@ -212,8 +210,8 @@
                    get_rti set_rti
                 """.split()
 
-    def __init__(self, hrtyper, TYPE):
-        RGenOp = hrtyper.RGenOp
+    def __init__(self, RGenOp, TYPE):
+        XXX
         StructTypeDesc.__init__(self, hrtyper, TYPE)
         ACCESS = self.TYPE.ACCESS
         redirected_fields = ACCESS.redirected_fields
@@ -231,8 +229,6 @@
         TOPPTR = self.access_desc.PTRTYPE
         self.s_structtype = annmodel.lltype_to_annotation(TOPPTR)
 
-        annhelper = hrtyper.annhelper
-
         self.my_redirected_getsetters_untouched = {}
         self.my_redirected_getsetters_touched = {}        
         self.my_redirected_names = my_redirected_names = []
@@ -264,6 +260,7 @@
         pass
 
     def _define_getset_field_ptr(self, hrtyper, fielddesc, j):
+        XXX
         annhelper = hrtyper.annhelper
         s_lltype = annmodel.lltype_to_annotation(fielddesc.RESTYPE)
 
@@ -326,6 +323,7 @@
 
 
     def _define_access_is_null(self, hrtyper):
+        XXX
         RGenOp = hrtyper.RGenOp
         annhelper = hrtyper.annhelper        
         def access_is_null(struc):
@@ -353,7 +351,7 @@
 class InteriorDesc(object):
     __metaclass__ = cachedtype
 
-    def __init__(self, hrtyper, TOPCONTAINER, path):
+    def __init__(self, RGenOp, TOPCONTAINER, path):
         self.TOPCONTAINER = TOPCONTAINER
         self.path = path
         PTRTYPE = lltype.Ptr(TOPCONTAINER)
@@ -362,10 +360,10 @@
         for offset in path:
             LASTCONTAINER = TYPE
             if offset is None:           # array substruct
-                fielddescs.append(ArrayFieldDesc(hrtyper, TYPE))
+                fielddescs.append(ArrayFieldDesc(RGenOp, TYPE))
                 TYPE = TYPE.OF
             else:
-                fielddescs.append(NamedFieldDesc(hrtyper, lltype.Ptr(TYPE),
+                fielddescs.append(NamedFieldDesc(RGenOp, lltype.Ptr(TYPE),
                                                  offset))
                 TYPE = getattr(TYPE, offset)
         unroll_path = unrolling_iterable(path)
@@ -426,7 +424,7 @@
 
         else:
             assert isinstance(TYPE, lltype.Array)
-            arrayfielddesc = ArrayFieldDesc(hrtyper, TYPE)
+            arrayfielddesc = ArrayFieldDesc(RGenOp, TYPE)
             getinterior_all = make_interior_getter(fielddescs)
 
             def gengetinteriorarraysize(jitstate, argbox, *indexboxes):
@@ -504,8 +502,7 @@
     gcref = False
     fieldnonnull = False
 
-    def __init__(self, hrtyper, PTRTYPE, RESTYPE):
-        RGenOp = hrtyper.RGenOp
+    def __init__(self, RGenOp, PTRTYPE, RESTYPE):
         self.PTRTYPE = PTRTYPE
         T = None
         if isinstance(RESTYPE, lltype.ContainerType):
@@ -534,7 +531,7 @@
             pass   # no redboxcls at all
         else:
             if self.virtualizable:
-                self.structdesc = StructTypeDesc(hrtyper, T)
+                self.structdesc = StructTypeDesc(RGenOp, T)
             self.redboxcls = rvalue.ll_redboxcls(RESTYPE)
             
         self.immutable = PTRTYPE.TO._hints.get('immutable', False)
@@ -561,11 +558,17 @@
     
 class NamedFieldDesc(FieldDesc):
 
-    def __init__(self, hrtyper, PTRTYPE, name):
-        FieldDesc.__init__(self, hrtyper, PTRTYPE, getattr(PTRTYPE.TO, name))
+    def __init__(self, RGenOp, PTRTYPE, name):
+        FieldDesc.__init__(self, RGenOp, PTRTYPE, getattr(PTRTYPE.TO, name))
         T = self.PTRTYPE.TO
         self.fieldname = name
-        self.fieldtoken = hrtyper.RGenOp.fieldToken(T, name)
+        self.fieldtoken = RGenOp.fieldToken(T, name)
+        def getfield_if_non_null(jitstate, genvar):
+             ptr = genvar.revealconst(PTRTYPE)
+             if ptr:
+                 res = getattr(ptr, name)
+                 return rvalue.ll_gv_fromvalue(jitstate, res)
+        self.getfield_if_non_null = getfield_if_non_null
 
     def compact_repr(self): # goes in ll helper names
         return "Fld_%s_in_%s" % (self.fieldname, self.PTRTYPE._short_name())
@@ -586,17 +589,16 @@
 
 class StructFieldDesc(NamedFieldDesc):
 
-    def __init__(self, hrtyper, PTRTYPE, name, index):
-        NamedFieldDesc.__init__(self, hrtyper, PTRTYPE, name)
+    def __init__(self, RGenOp, PTRTYPE, name, index):
+        NamedFieldDesc.__init__(self, RGenOp, PTRTYPE, name)
         self.fieldindex = index
 
 class ArrayFieldDesc(FieldDesc):
     allow_void = True
 
-    def __init__(self, hrtyper, TYPE):
+    def __init__(self, RGenOp, TYPE):
         assert isinstance(TYPE, lltype.Array)
-        FieldDesc.__init__(self, hrtyper, lltype.Ptr(TYPE), TYPE.OF)
-        RGenOp = hrtyper.RGenOp
+        FieldDesc.__init__(self, RGenOp, lltype.Ptr(TYPE), TYPE.OF)
         self.arraytoken = RGenOp.arrayToken(TYPE)
         self.varsizealloctoken = RGenOp.varsizeAllocToken(TYPE)
         self.indexkind = RGenOp.kindToken(lltype.Signed)

Modified: pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py	Mon Feb  4 16:47:13 2008
@@ -140,15 +140,15 @@
     # XXX MemoryError handling
     return rvalue.PtrRedBox(contdesc.ptrkind, genvar, known_nonzero=True)
 
-def ll_gengetfield(jitstate, deepfrozen, fielddesc, argbox):
+def gengetfield(jitstate, deepfrozen, fielddesc, argbox):
     if (fielddesc.immutable or deepfrozen) and argbox.is_constant():
-        ptr = rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE)
-        if ptr:    # else don't constant-fold the segfault...
-            res = getattr(ptr, fielddesc.fieldname)
-            return rvalue.ll_fromvalue(jitstate, res)
+        resgv = fielddesc.getfield_if_non_null(
+                jitstate, argbox.getgenvar(jitstate))
+        if resgv is not None:
+            return fielddesc.makebox(jitstate, resgv)
     return argbox.op_getfield(jitstate, fielddesc)
 
-def ll_gensetfield(jitstate, fielddesc, destbox, valuebox):
+def gensetfield(jitstate, fielddesc, destbox, valuebox):
     destbox.op_setfield(jitstate, fielddesc, valuebox)
 
 def ll_gengetsubstruct(jitstate, fielddesc, argbox):



More information about the Pypy-commit mailing list