[pypy-svn] r75774 - in pypy/trunk/pypy/jit/codewriter: . test

fijal at codespeak.net fijal at codespeak.net
Fri Jul 2 17:10:50 CEST 2010


Author: fijal
Date: Fri Jul  2 17:10:48 2010
New Revision: 75774

Modified:
   pypy/trunk/pypy/jit/codewriter/jtransform.py
   pypy/trunk/pypy/jit/codewriter/support.py
   pypy/trunk/pypy/jit/codewriter/test/test_codewriter.py
Log:
Support more raw operations: getitem, setitem, malloc and free


Modified: pypy/trunk/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/trunk/pypy/jit/codewriter/jtransform.py	(original)
+++ pypy/trunk/pypy/jit/codewriter/jtransform.py	Fri Jul  2 17:10:48 2010
@@ -420,9 +420,14 @@
             return SpaceOperation('new_array', [arraydescr, op.args[2]],
                                   op.result)
 
+    def rewrite_op_free(self, op):
+        assert op.args[1].value == 'raw'
+        ARRAY = op.args[0].concretetype.TO
+        return self._do_builtin_call(op, 'raw_free', [op.args[0]],
+                                     extra = (ARRAY,), extrakey = ARRAY)
+
     def rewrite_op_getarrayitem(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
@@ -436,13 +441,12 @@
         # normal case follows
         arraydescr = self.cpu.arraydescrof(ARRAY)
         kind = getkind(op.result.concretetype)
-        return SpaceOperation('getarrayitem_gc_%s' % kind[0],
+        return SpaceOperation('getarrayitem_%s_%s' % (ARRAY._gckind, 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
@@ -455,7 +459,7 @@
                                     op.args[1], op.args[2]], None)]
         arraydescr = self.cpu.arraydescrof(ARRAY)
         kind = getkind(op.args[2].concretetype)
-        return SpaceOperation('setarrayitem_gc_%s' % kind[0],
+        return SpaceOperation('setarrayitem_%s_%s' % (ARRAY._gckind, kind[0]),
                               [op.args[0], arraydescr, op.args[1], op.args[2]],
                               None)
 

Modified: pypy/trunk/pypy/jit/codewriter/support.py
==============================================================================
--- pypy/trunk/pypy/jit/codewriter/support.py	(original)
+++ pypy/trunk/pypy/jit/codewriter/support.py	Fri Jul  2 17:10:48 2010
@@ -297,6 +297,11 @@
             return lltype.malloc(ARRAY, n, flavor='raw')
         return _ll_1_raw_malloc
 
+    def build_ll_1_raw_free(ARRAY):
+        def _ll_1_raw_free(p):
+            lltype.free(p, flavor='raw')
+        return _ll_1_raw_free
+
 class OOtypeHelpers:
 
     # ---------- dict ----------

Modified: pypy/trunk/pypy/jit/codewriter/test/test_codewriter.py
==============================================================================
--- pypy/trunk/pypy/jit/codewriter/test/test_codewriter.py	(original)
+++ pypy/trunk/pypy/jit/codewriter/test/test_codewriter.py	Fri Jul  2 17:10:48 2010
@@ -24,12 +24,17 @@
     def as_vtable_size_descr(self):
         return self
 
+class FakeArrayDescr(AbstractDescr):
+    def __init__(self, ARRAY):
+        self.ARRAY = ARRAY
+
 class FakeCPU:
     def __init__(self, rtyper):
         self.rtyper = rtyper
     calldescrof = FakeCallDescr
     fielddescrof = FakeFieldDescr
     sizeof = FakeSizeDescr
+    arraydescrof = FakeArrayDescr
 
 class FakePolicy:
     def look_inside_graph(self, graph):
@@ -163,10 +168,10 @@
     
     def f(n):
         a = lltype.malloc(TP, n, flavor='raw')
-        #a[0] = n
-        #res = a[0]
-        #lltype.free(a, flavor='raw')
-        #return res
+        a[0] = n
+        res = a[0]
+        lltype.free(a, flavor='raw')
+        return res
 
     rtyper = support.annotate(f, [35])
     jitdriver_sd = FakeJitDriverSD(rtyper.annotator.translator.graphs[0])
@@ -176,3 +181,6 @@
     #
     s = jitdriver_sd.mainjitcode.dump()
     assert 'residual_call_ir_i $<* fn _ll_1_raw_malloc__Signed>' in s
+    assert 'setarrayitem_raw_i' in s
+    assert 'getarrayitem_raw_i' in s
+    assert 'residual_call_ir_v $<* fn _ll_1_raw_free__arrayPtr>' in s



More information about the Pypy-commit mailing list