[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