[pypy-svn] r69855 - in pypy/branch/listcopyop/pypy: rpython/lltypesystem rpython/memory/gctransform rpython/memory/test translator/c/test

fijal at codespeak.net fijal at codespeak.net
Wed Dec 2 20:47:22 CET 2009


Author: fijal
Date: Wed Dec  2 20:47:20 2009
New Revision: 69855

Modified:
   pypy/branch/listcopyop/pypy/rpython/lltypesystem/opimpl.py
   pypy/branch/listcopyop/pypy/rpython/memory/gctransform/transform.py
   pypy/branch/listcopyop/pypy/rpython/memory/test/test_transformed_gc.py
   pypy/branch/listcopyop/pypy/translator/c/test/test_newgc.py
Log:
Implement basic transformation by annotating stuff in opimpl. Probably not the
smartest idea


Modified: pypy/branch/listcopyop/pypy/rpython/lltypesystem/opimpl.py
==============================================================================
--- pypy/branch/listcopyop/pypy/rpython/lltypesystem/opimpl.py	(original)
+++ pypy/branch/listcopyop/pypy/rpython/lltypesystem/opimpl.py	Wed Dec  2 20:47:20 2009
@@ -395,8 +395,10 @@
     return addr1 - addr2
 
 def op_listcopy(source, dest, source_start, dest_start, length):
-    for i in range(length):
+    i = 0
+    while i < length:
         dest[i + dest_start] = source[i + source_start]
+        i += 1
 
 def op_getfield(p, name):
     checkptr(p)

Modified: pypy/branch/listcopyop/pypy/rpython/memory/gctransform/transform.py
==============================================================================
--- pypy/branch/listcopyop/pypy/rpython/memory/gctransform/transform.py	(original)
+++ pypy/branch/listcopyop/pypy/rpython/memory/gctransform/transform.py	Wed Dec  2 20:47:20 2009
@@ -12,7 +12,7 @@
 from pypy.translator.backendopt.ssa import DataFlowFamilyBuilder
 from pypy.translator.backendopt.constfold import constant_fold_graph
 from pypy.annotation import model as annmodel
-from pypy.rpython import rmodel, annlowlevel
+from pypy.rpython import rmodel
 from pypy.rpython.memory import gc
 from pypy.rpython.memory.gctransform.support import var_ispyobj
 from pypy.rpython.annlowlevel import MixLevelHelperAnnotator
@@ -380,6 +380,16 @@
     def gct_zero_gc_pointers_inside(self, hop):
         pass
 
+    def gct_listcopy(self, hop):
+        # by default, this becomes a raw memcopy
+        op = hop.spaceop
+        from pypy.rpython.lltypesystem import opimpl
+        llptr = self.annotate_helper(opimpl.op_listcopy,
+                                     [arg.concretetype for arg in op.args],
+                                     op.result.concretetype, inline=True)
+        c_func = rmodel.inputconst(lltype.Void, llptr)
+        hop.genop('direct_call', [c_func] + op.args)
+
     def gct_gc_identityhash(self, hop):
         # must be implemented in the various GCs
         raise NotImplementedError

Modified: pypy/branch/listcopyop/pypy/rpython/memory/test/test_transformed_gc.py
==============================================================================
--- pypy/branch/listcopyop/pypy/rpython/memory/test/test_transformed_gc.py	(original)
+++ pypy/branch/listcopyop/pypy/rpython/memory/test/test_transformed_gc.py	Wed Dec  2 20:47:20 2009
@@ -843,6 +843,25 @@
         assert (totsize - 26 * size_of_int) % 4 == 0
         # ^^^ a crude assumption that totsize - varsize would be dividable by 4
         #     (and give fixedsize)
+
+    
+    def define_listcopy(cls):
+        TP = lltype.GcArray(lltype.Signed)
+        def fn():
+            l = lltype.malloc(TP, 100)
+            for i in range(100):
+                l[i] = 1
+            l2 = lltype.malloc(TP, 50)
+            llop.listcopy(lltype.Void, l, l2, 50, 0, 50)
+            for i in range(50):
+                assert l2[i] == 1
+            return 0
+
+        return fn
+
+    def test_listcopy(self):
+        run = self.runner("listcopy")
+        run([])
         
 # ________________________________________________________________
 

Modified: pypy/branch/listcopyop/pypy/translator/c/test/test_newgc.py
==============================================================================
--- pypy/branch/listcopyop/pypy/translator/c/test/test_newgc.py	(original)
+++ pypy/branch/listcopyop/pypy/translator/c/test/test_newgc.py	Wed Dec  2 20:47:20 2009
@@ -1027,6 +1027,24 @@
         res = self.run("tagged")
         assert res == expected
 
+
+    def define_listcopy(cls):
+        TP = lltype.GcArray(lltype.Signed)
+        def fn():
+            l = lltype.malloc(TP, 100)
+            for i in range(100):
+                l[i] = 1
+            l2 = lltype.malloc(TP, 50)
+            llop.listcopy(lltype.Void, l, l2, 50, 0, 50)
+            for i in range(50):
+                assert l2[i] == 1
+            return 0
+
+        return fn
+
+    def test_listcopy(self):
+        self.run("listcopy")
+
 from pypy.rlib.objectmodel import UnboxedValue
 
 class TaggedBase(object):



More information about the Pypy-commit mailing list