[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