[pypy-svn] r74671 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test

arigo at codespeak.net arigo at codespeak.net
Sat May 22 12:45:29 CEST 2010


Author: arigo
Date: Sat May 22 12:45:28 2010
New Revision: 74671

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py
Log:
Complete and test array operations in the codewriter.


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	Sat May 22 12:45:28 2010
@@ -386,25 +386,35 @@
             return SpaceOperation('new_array', [arraydescr, op.args[2]],
                                   op.result)
 
+    def rewrite_op_getarrayitem(self, op):
+        ARRAY = op.args[0].concretetype.TO
+        assert ARRAY._gckind == 'gc'
+        if self._array_of_voids(ARRAY):
+            return []
+        arraydescr = self.cpu.arraydescrof(ARRAY)
+        kind = getkind(op.result.concretetype)
+        return SpaceOperation('getarrayitem_gc_%s' % kind[0],
+                              [op.args[0], arraydescr, op.args[1]],
+                              op.result)
+
     def rewrite_op_setarrayitem(self, op):
         ARRAY = op.args[0].concretetype.TO
         assert ARRAY._gckind == 'gc'
         if self._array_of_voids(ARRAY):
-            return
-##        if op.args[0] in self.vable_array_vars:     # for virtualizables
-##            (v_base, arrayindex) = self.vable_array_vars[op.args[0]]
-##            self.emit('setarrayitem_vable',
-##                      self.var_position(v_base),
-##                      arrayindex,
-##                      self.var_position(op.args[1]),
-##                      self.var_position(op.args[2]))
-##            return
+            return []
         arraydescr = self.cpu.arraydescrof(ARRAY)
         kind = getkind(op.args[2].concretetype)
         return SpaceOperation('setarrayitem_gc_%s' % kind[0],
                               [op.args[0], arraydescr, op.args[1], op.args[2]],
                               None)
 
+    def rewrite_op_getarraysize(self, op):
+        ARRAY = op.args[0].concretetype.TO
+        assert ARRAY._gckind == 'gc'
+        arraydescr = self.cpu.arraydescrof(ARRAY)
+        return SpaceOperation('arraylen_gc', [op.args[0], arraydescr],
+                              op.result)
+
     def _array_of_voids(self, ARRAY):
         #if isinstance(ARRAY, ootype.Array):
         #    return ARRAY.ITEM == ootype.Void
@@ -835,7 +845,7 @@
                                   itemsdescr, structdescr):
         v_index, extraop = self._prepare_list_getset(op, lengthdescr, args,
                                                  'check_resizable_neg_index')
-        kind = getkind(op.args[2].concretetype)[0]
+        kind = getkind(args[2].concretetype)[0]
         op = SpaceOperation('setlistitem_gc_%s' % kind,
                             [args[0], itemsdescr, arraydescr,
                              v_index, args[2]], None)

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py	Sat May 22 12:45:28 2010
@@ -50,6 +50,8 @@
         return FakeDescr()
     def sizeof(self, STRUCT):
         return FakeDescr()
+    def arraydescrof(self, ARRAY):
+        return FakeDescr()
 
 class FakeCallControl:
     _descr_cannot_raise = FakeDescr()
@@ -605,3 +607,46 @@
             residual_call_r_r $<* fn jit_force_virtual>, <Descr>, R[%r1] -> %r2
             ref_return %r2
         """, transform=True, cc=FakeCallControlWithVRefInfo())
+
+    def test_array_operations(self):
+        A = lltype.GcArray(lltype.Signed)
+        def f():
+            array = lltype.malloc(A, 5)
+            array[2] = 5
+            return array[2] + len(array)
+        self.encoding_test(f, [], """
+            new_array <Descr>, $5 -> %r0
+            setarrayitem_gc_i %r0, <Descr>, $2, $5
+            getarrayitem_gc_i %r0, <Descr>, $2 -> %i0
+            arraylen_gc %r0, <Descr> -> %i1
+            int_add %i0, %i1 -> %i2
+            int_return %i2
+        """, transform=True)
+
+    def test_void_array_operations(self):
+        A = lltype.GcArray(lltype.Void)
+        def f():
+            array = lltype.malloc(A, 5)
+            array[2] = None
+            x = array[2]
+            return len(array)
+        self.encoding_test(f, [], """
+            new_array <Descr>, $5 -> %r0
+            arraylen_gc %r0, <Descr> -> %i0
+            int_return %i0
+        """, transform=True)
+
+    def test_string_operations(self):
+        from pypy.rpython.lltypesystem import rstr
+        def f(n):
+            s = lltype.malloc(rstr.STR, 2)
+            s.chars[1] = chr(n)
+            return ord(s.chars[1]) + len(s.chars)
+        self.encoding_test(f, [512], """
+            newstr $2 -> %r0
+            strsetitem %r0, $1, %i0
+            strgetitem %r0, $1 -> %i1
+            strlen %r0 -> %i2
+            int_add %i1, %i2 -> %i3
+            int_return %i3
+        """, transform=True)



More information about the Pypy-commit mailing list