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

cfbolz at codespeak.net cfbolz at codespeak.net
Tue Feb 5 01:47:50 CET 2008


Author: cfbolz
Date: Tue Feb  5 01:47:50 2008
New Revision: 51282

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/hrtyper.py
   pypy/branch/jit-refactoring/pypy/jit/timeshifter/rcontainer.py
   pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py
Log:
support for getarraysize


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	Tue Feb  5 01:47:50 2008
@@ -43,6 +43,7 @@
         self.structtypedescs = []
         self.fielddescs = []
         self.arrayfielddescs = []
+        self.interiordescs = []
         self.called_bytecodes = []
         self.num_mergepoints = 0
         self.graph_color = self.graph_calling_color(graph)
@@ -87,6 +88,7 @@
                           self.structtypedescs,
                           self.fielddescs,
                           self.arrayfielddescs,
+                          self.interiordescs,
                           self.called_bytecodes,
                           self.num_mergepoints,
                           self.graph_color,
@@ -384,6 +386,33 @@
         self.nonrainbow_functions.append(call_normal_function)
         self.nonrainbow_positions[fn] = result
         return result
+
+    def interiordesc(self, op, PTRTYPE, nb_offsets):
+        path = []
+        CONTAINER = PTRTYPE.TO
+        indices_v = []
+        for i in range(1, 1 + nb_offsets):
+            varg = op.args[i]
+            T = varg.concretetype
+            if T is lltype.Void:
+                fieldname = varg.value
+                CONTAINER = getattr(CONTAINER, fieldname)
+                path.append(fieldname)
+            else:
+                assert T is lltype.Signed
+                CONTAINER = CONTAINER.OF
+                path.append(None)    # placeholder for 'array index'
+                indices_v.append(varg)
+        if CONTAINER is lltype.Void:     # Void field
+            return -1, None
+        else:
+            key = (PTRTYPE.TO, tuple(path))
+            if key in self.interiordesc_positions:
+                return self.interiordesc_positions[key]
+            desc = rcontainer.InteriorDesc(self.RGenOp, PTRTYPE.TO, tuple(path)),
+            result = len(self.interiordescs)
+            self.interiordescs.append(desc)
+            return (result, indices_v)
         
     def emit(self, *stuff):
         assert stuff is not None
@@ -482,7 +511,6 @@
         self.register_redvar(op.result)
 
     def serialize_op_malloc_varsize(self, op):
-
         PTRTYPE = op.result.concretetype
         TYPE = PTRTYPE.TO
         v_size = op.args[2]
@@ -598,6 +626,16 @@
         self.emit("red_setarrayitem", destboxindex, fielddescindex,
                   indexboxindex, valboxindex)
 
+    def serialize_op_getarraysize(self, op):
+        arrayvar, = op.args
+        PTRTYPE = arrayvar.concretetype
+        if PTRTYPE.TO.OF is lltype.Void:
+            return
+        fielddescindex = self.arrayfielddesc_position(PTRTYPE.TO)
+        arrayindex = self.serialize_oparg("red", arrayvar)
+        self.emit("red_getarraysize", arrayindex, fielddescindex)
+        self.register_redvar(op.result)
+
     # call handling
 
     def graphs_from(self, spaceop):

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	Tue Feb  5 01:47:50 2008
@@ -19,7 +19,7 @@
 
     def __init__(self, name, code, constants, typekinds, redboxclasses,
                  keydescs, structtypedescs, fielddescs, arrayfielddescs,
-                 called_bytecodes, num_mergepoints, graph_color,
+                 interiordescs, called_bytecodes, num_mergepoints, graph_color,
                  nonrainbow_functions, is_portal):
         self.name = name
         self.code = code
@@ -30,6 +30,7 @@
         self.structtypedescs = structtypedescs
         self.fielddescs = fielddescs
         self.arrayfielddescs = arrayfielddescs
+        self.interiordescs = interiordescs
         self.called_bytecodes = called_bytecodes
         self.num_mergepoints = num_mergepoints
         self.graph_color = graph_color
@@ -387,6 +388,12 @@
         resbox = rtimeshift.gensetarrayitem(self.jitstate, fielddesc, destbox,
                 indexbox, valuebox)
 
+    def opimpl_red_getarraysize(self):
+        arraybox = self.get_redarg()
+        fielddesc = self.frame.bytecode.arrayfielddescs[self.load_2byte()]
+        resbox = rtimeshift.gengetarraysize(self.jitstate, fielddesc, arraybox)
+        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	Tue Feb  5 01:47:50 2008
@@ -546,6 +546,28 @@
         assert res == 24
         self.check_insns({})
 
+    def test_arraysize(self):
+        A = lltype.GcArray(lltype.Signed)
+        def ll_function(a):
+            return len(a)
+
+        def int_array(string):
+            items = [int(x) for x in string.split(',')]
+            n = len(items)
+            a1 = lltype.malloc(A, n)
+            for i in range(n):
+                a1[i] = items[i]
+            return a1
+        ll_function.convert_arguments = [int_array]
+
+        res = self.interpret(ll_function, ["6,7"], [])
+        assert res == 2
+        self.check_insns({'getarraysize': 1})
+        res = self.interpret(ll_function, ["8,3,3,4,5"], [0])
+        assert res == 5
+        self.check_insns({})
+
+
     def test_simple_struct_malloc(self):
         py.test.skip("blue containers: to be reimplemented")
         S = lltype.GcStruct('helloworld', ('hello', lltype.Signed),

Modified: pypy/branch/jit-refactoring/pypy/jit/timeshifter/hrtyper.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/timeshifter/hrtyper.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/timeshifter/hrtyper.py	Tue Feb  5 01:47:50 2008
@@ -880,27 +880,6 @@
             ts.s_RedBox)
 
 
-    def _getinteriordesc(self, hop, PTRTYPE, nb_offsets):
-        path = []
-        CONTAINER = PTRTYPE.TO
-        indices_v = []
-        for i in range(1, 1 + nb_offsets):
-            T = originalconcretetype(hop.args_s[i])
-            if T is lltype.Void:
-                fieldname = hop.args_v[i].value
-                CONTAINER = getattr(CONTAINER, fieldname)
-                path.append(fieldname)
-            else:
-                assert T is lltype.Signed
-                CONTAINER = CONTAINER.OF
-                path.append(None)    # placeholder for 'array index'
-                v_index = hop.inputarg(self.getredrepr(lltype.Signed), arg=i)
-                indices_v.append(v_index)
-        if CONTAINER is lltype.Void:     # Void field
-            return None, None
-        else:
-            return (rcontainer.InteriorDesc(self, PTRTYPE.TO, tuple(path)),
-                    indices_v)
 
     def translate_op_getinteriorfield(self, hop):
         ts = self

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	Tue Feb  5 01:47:50 2008
@@ -610,6 +610,12 @@
                 res = array[index]
                 return rvalue.ll_gv_fromvalue(jitstate, res)
         self.getarrayitem_if_non_null = getarrayitem_if_non_null
+        def getarraysize_if_non_null(jitstate, genvar):
+            array = genvar.revealconst(self.PTRTYPE)
+            if array:  # else don't constant-fold
+                res = len(array)
+                return rvalue.ll_gv_fromvalue(jitstate, res)
+        self.getarraysize_if_non_null = getarraysize_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	Tue Feb  5 01:47:50 2008
@@ -199,10 +199,10 @@
 
 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...
-            res = len(array)
-            return rvalue.ll_fromvalue(jitstate, res)
+        resgv = fielddesc.getarraysize_if_non_null(
+                jitstate, argbox.getgenvar(jitstate))
+        if resgv is not None:
+            return fielddesc.makebox(jitstate, resgv)
     genvar = jitstate.curbuilder.genop_getarraysize(
         fielddesc.arraytoken,
         argbox.getgenvar(jitstate))



More information about the Pypy-commit mailing list