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

cfbolz at codespeak.net cfbolz at codespeak.net
Mon Feb 4 23:51:26 CET 2008


Author: cfbolz
Date: Mon Feb  4 23:51:25 2008
New Revision: 51277

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:
first getarrayitem test passing


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 23:51:25 2008
@@ -42,6 +42,7 @@
         self.keydescs = []
         self.structtypedescs = []
         self.fielddescs = []
+        self.arrayfielddescs = []
         self.called_bytecodes = []
         self.num_mergepoints = 0
         self.graph_color = self.graph_calling_color(graph)
@@ -65,6 +66,8 @@
         self.structtypedesc_positions = {}
         # mapping tuples of STRUCT, name to index
         self.fielddesc_positions = {}
+        # mapping ARRAYS to index
+        self.arrayfielddesc_positions = {}
         # mapping graphs to index
         self.graph_positions = {}
         # mapping fnobjs to index
@@ -83,6 +86,7 @@
                           self.keydescs,
                           self.structtypedescs,
                           self.fielddescs,
+                          self.arrayfielddescs,
                           self.called_bytecodes,
                           self.num_mergepoints,
                           self.graph_color,
@@ -335,6 +339,15 @@
         self.fielddesc_positions[fieldname, TYPE] = result
         return result
 
+    def arrayfielddesc_position(self, TYPE):
+        if TYPE in self.fielddesc_positions:
+            return self.fielddesc_positions[TYPE]
+        arrayfielddesc = rcontainer.ArrayFieldDesc(self.RGenOp, TYPE)
+        result = len(self.arrayfielddescs)
+        self.arrayfielddescs.append(arrayfielddesc)
+        self.arrayfielddesc_positions[TYPE] = result
+        return result
+
     def graph_position(self, graph):
         if graph in self.graph_positions:
             return self.graph_positions[graph]
@@ -541,6 +554,18 @@
             return
         self.emit("red_setfield", destboxindex, fielddescindex, valboxindex)
 
+    def serialize_op_getarrayitem(self, op):
+        arrayvar, indexvar = op.args
+        PTRTYPE = arrayvar.concretetype
+        if PTRTYPE.TO.OF is lltype.Void:
+            return
+        deepfrozen = self.hannotator.binding(arrayvar).deepfrozen
+        fielddescindex = self.arrayfielddesc_position(PTRTYPE.TO)
+        arrayindex = self.serialize_oparg("red", arrayvar)
+        index = self.serialize_oparg("red", indexvar)
+        self.emit("red_getarrayitem", arrayindex, fielddescindex, index,
+                  deepfrozen)
+        self.register_redvar(op.result)
 
     # call handling
 

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 23:51:25 2008
@@ -18,8 +18,8 @@
     """
 
     def __init__(self, name, code, constants, typekinds, redboxclasses,
-                 keydescs, structtypedescs, fielddescs, called_bytecodes,
-                 num_mergepoints, graph_color,
+                 keydescs, structtypedescs, fielddescs, arrayfielddescs,
+                 called_bytecodes, num_mergepoints, graph_color,
                  nonrainbow_functions, is_portal):
         self.name = name
         self.code = code
@@ -29,6 +29,7 @@
         self.keydescs = keydescs
         self.structtypedescs = structtypedescs
         self.fielddescs = fielddescs
+        self.arrayfielddescs = arrayfielddescs
         self.called_bytecodes = called_bytecodes
         self.num_mergepoints = num_mergepoints
         self.graph_color = graph_color
@@ -355,6 +356,14 @@
         resbox = rtimeshift.gensetfield(self.jitstate, fielddesc, destbox,
                 valuebox)
 
+    def opimpl_red_getarrayitem(self):
+        arraybox = self.get_redarg()
+        fielddesc = self.frame.bytecode.arrayfielddescs[self.load_2byte()]
+        indexbox = self.get_redarg()
+        deepfrozen = self.load_bool()
+        resbox = rtimeshift.gengetarrayitem(self.jitstate, deepfrozen, fielddesc,
+                                        arraybox, indexbox)
+        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 23:51:25 2008
@@ -525,7 +525,6 @@
         self.check_insns({})
 
     def test_simple_array(self):
-        py.test.skip("arrays and structs are not working")
         A = lltype.GcArray(lltype.Signed, 
                             hints={'immutable': True})
         def ll_function(a):

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 23:51:25 2008
@@ -603,6 +603,13 @@
         self.varsizealloctoken = RGenOp.varsizeAllocToken(TYPE)
         self.indexkind = RGenOp.kindToken(lltype.Signed)
 
+        def getarrayitem_if_non_null(jitstate, genvar, gv_index):
+            array = genvar.revealconst(self.PTRTYPE)
+            index = gv_index.revealconst(lltype.Signed)
+            if array and 0 <= index < len(array):  # else don't constant-fold
+                res = array[index]
+                return rvalue.ll_gv_fromvalue(jitstate, res)
+        self.getarrayitem_if_non_null = getarrayitem_if_non_null
 # ____________________________________________________________
 
 class FrozenVirtualStruct(FrozenContainer):

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 23:51:25 2008
@@ -159,14 +159,14 @@
             return rvalue.ll_fromvalue(jitstate, res)
     return argbox.op_getsubstruct(jitstate, fielddesc)
 
-def ll_gengetarrayitem(jitstate, deepfrozen, fielddesc, argbox, indexbox):
+def gengetarrayitem(jitstate, deepfrozen, fielddesc, argbox, indexbox):
     if ((fielddesc.immutable or deepfrozen) and argbox.is_constant()
                                             and indexbox.is_constant()):
-        array = rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE)
-        index = rvalue.ll_getvalue(indexbox, lltype.Signed)
-        if array and 0 <= index < len(array):  # else don't constant-fold
-            res = array[index]
-            return rvalue.ll_fromvalue(jitstate, res)
+        resgv = fielddesc.getarrayitem_if_non_null(
+                jitstate, argbox.getgenvar(jitstate),
+                indexbox.getgenvar(jitstate))
+        if resgv is not None:
+            return fielddesc.makebox(jitstate, resgv)
     genvar = jitstate.curbuilder.genop_getarrayitem(
         fielddesc.arraytoken,
         argbox.getgenvar(jitstate),
@@ -197,7 +197,7 @@
         valuebox.getgenvar(jitstate)
         )
 
-def ll_gengetarraysize(jitstate, fielddesc, argbox):
+def gengetarraysize(jitstate, fielddesc, argbox):
     if argbox.is_constant():
         array = rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE)
         if array:    # else don't constant-fold the segfault...



More information about the Pypy-commit mailing list