[pypy-svn] r76191 - in pypy/branch/interplevel-array/pypy/module/array: . test
hakanardo at codespeak.net
hakanardo at codespeak.net
Wed Jul 14 08:38:46 CEST 2010
Author: hakanardo
Date: Wed Jul 14 08:38:44 2010
New Revision: 76191
Modified:
pypy/branch/interplevel-array/pypy/module/array/__init__.py
pypy/branch/interplevel-array/pypy/module/array/interp_array.py
pypy/branch/interplevel-array/pypy/module/array/test/test_array.py
Log:
one more layer of wrapping
Modified: pypy/branch/interplevel-array/pypy/module/array/__init__.py
==============================================================================
--- pypy/branch/interplevel-array/pypy/module/array/__init__.py (original)
+++ pypy/branch/interplevel-array/pypy/module/array/__init__.py Wed Jul 14 08:38:44 2010
@@ -8,6 +8,7 @@
}
interpleveldefs = {
- 'array': 'interp_array.array',
+ 'array': 'interp_array.W_WrappedArray',
+ '_new_array': 'interp_array.new_array',
'simple_array': 'interp_simple.simple_array',
}
Modified: pypy/branch/interplevel-array/pypy/module/array/interp_array.py
==============================================================================
--- pypy/branch/interplevel-array/pypy/module/array/interp_array.py (original)
+++ pypy/branch/interplevel-array/pypy/module/array/interp_array.py Wed Jul 14 08:38:44 2010
@@ -7,6 +7,7 @@
from pypy.rlib import rgc
from pypy.rlib.unroll import unrolling_iterable
from pypy.rlib.rstruct.runpack import runpack
+from pypy.interpreter.argument import Arguments, Signature
import py
app_array = py.path.local(__file__).dirpath().join('app_array.py')
@@ -142,7 +143,7 @@
def setlen(self, size):
if size > self.allocated or size < self.allocated/2:
- if size > 0:
+ if size > 0: #FIXME: allways free 0
if size < 9:
some = 3
else:
@@ -180,7 +181,6 @@
else:
size = (stop - start) / step
if (stop - start) % step > 0: size += 1
- print size
if size < 0: size = 0
w_a=mytype.w_class(self.space)
w_a.setlen(size)
@@ -551,3 +551,170 @@
return a
array.unwrap_spec = (ObjSpace, str, W_Root)
+
+class W_WrappedArray(Wrappable):
+ def __init__(self, typecode, w_initializer=None):
+ pass
+ __init__.unwrap_spec = ['self', str, W_Root]
+
+ def descr_pop(self, i=-1):
+ return self._array.descr_pop(i)
+ descr_pop.unwrap_spec = ['self', int]
+
+ def descr_getitem(self, w_i):
+ w_item = self._array.descr_getitem(w_i)
+ if isinstance(w_item, W_ArrayBase):
+ return wrap_array(w_item)
+ return w_item
+ descr_getitem.unwrap_spec = ['self', W_Root]
+
+ def descr_iadd(self, w_i):
+ self._array.descr_iadd(w_i._array)
+ return self
+ descr_iadd.unwrap_spec = ['self', W_Root]
+
+ def descr_imul(self, i):
+ self._array.descr_imul(i)
+ return self
+ descr_imul.unwrap_spec = ['self', int]
+
+ def descr_reduce(self):
+ space=self._array.space
+ args=[space.wrap(self._array.typecode)]
+ if self._array.len>0:
+ args += [self._array.descr_tostring()]
+ from pypy.interpreter.mixedmodule import MixedModule
+ w_mod = space.getbuiltinmodule('array')
+ mod = space.interp_w(MixedModule, w_mod)
+ w_new_inst = mod.get('_new_array')
+ return space.newtuple([w_new_inst, space.newtuple(args)])
+
+
+def unwrap_array(w_a):
+ if isinstance(w_a, W_WrappedArray):
+ return w_a._array
+ return w_a
+
+def wrap_array(a):
+ w_a = W_WrappedArray(None, None)
+ w_a._array = a
+ return w_a
+
+def make_descr(fn, nargs, wrp):
+ if nargs == 0:
+ def descr(space, self):
+ ret = space.call_function(
+ space.getattr(self._array, space.wrap(fn)))
+ if (wrp): return wrap_array(ret)
+ return ret
+
+ elif nargs == 1:
+ def descr(space, self, w_a):
+ ret = space.call_function(
+ space.getattr(self._array, space.wrap(fn)),
+ unwrap_array(w_a))
+ if (wrp): return wrap_array(ret)
+ return ret
+
+ elif nargs == 2:
+ def descr(space, self, w_a, w_b):
+ ret = space.call_function(
+ space.getattr(self._array, space.wrap(fn)),
+ unwrap_array(w_a), unwrap_array(w_b))
+ if (wrp): return wrap_array(ret)
+ return ret
+
+ elif nargs == 3:
+ def descr(space, self, w_a, w_b, w_c):
+ ret = space.call_function(
+ space.getattr(self._array, space.wrap(fn)),
+ unwrap_array(w_a), unwrap_array(w_b), unwrap_array(w_c))
+ if (wrp): return wrap_array(ret)
+ return ret
+
+ else:
+ raise NotImplementedError
+
+ descr.unwrap_spec = (ObjSpace, W_WrappedArray) + (W_Root,) * nargs
+ descr.__name__ = 'W_WrappedArray_descr_' + fn
+ return interp2app(descr)
+
+typedefs={}
+for fn, nargs, wrp in (('append', 1, False),
+ ('__len__', 0, False),
+ ('__setitem__', 2, False),
+ ('__delitem__', 1, False),
+ ('__getslice__', 2, True),
+ ('__setslice__', 3, False),
+ ('__delslice__', 2, False),
+ ('extend', 1, False),
+ ('fromstring', 1, False),
+ ('fromunicode', 1, False),
+ ('fromfile', 2, False),
+ ('read', 2, False),
+ ('fromlist', 1, False),
+ ('tolist', 0, False),
+ ('tounicode', 0, False),
+ ('tofile', 1, False),
+ ('write', 1, False),
+ ('tostring', 0, False),
+ ('__buffer__', 0, False),
+ ('__repr__', 0, False),
+ ('count', 1, False),
+ ('index', 1, False),
+ ('remove', 1, False),
+ ('reverse', 0, False),
+ ('insert', 2, False),
+ ('__eq__', 1, False),
+ ('__ne__', 1, False),
+ ('__lt__', 1, False),
+ ('__gt__', 1, False),
+ ('__le__', 1, False),
+ ('__ge__', 1, False),
+ ('__copy__', 0, True),
+ ('__add__', 1, True),
+ ('__mul__', 1, True),
+ ('__rmul__', 1, True),
+ ('buffer_info', 0, False),
+ ('byteswap', 0, False),
+ ('__iter__', 0, False),
+ ('__contains__', 1, False),
+ ):
+ typedefs[fn] = make_descr(fn, nargs, wrp)
+
+def new_array(space, typecode, w_initializer=None):
+ w_a = W_WrappedArray(None, None)
+ w_a._array = array(space, typecode, w_initializer)
+ return w_a
+new_array.unwrap_spec = (ObjSpace, str, W_Root)
+
+def new_array_sub(space, w_cls, typecode, w_initializer=None, w_args=None):
+ w_array = space.allocate_instance(W_WrappedArray, w_cls)
+ w_array._array = array(space, typecode, w_initializer)
+ if len(w_args.arguments_w) > 0:
+ msg = 'array() takes at most 2 arguments'
+ raise OperationError(space.w_TypeError, space.wrap(msg))
+ return w_array
+new_array_sub.unwrap_spec = (ObjSpace, W_Root, str, W_Root, Arguments)
+
+def descr_wrapped_itemsize(space, self):
+ return space.wrap(self._array.itemsize)
+
+def descr_wrapped_typecode(space, self):
+ return space.wrap(self._array.typecode)
+
+
+W_WrappedArray.typedef = TypeDef(
+ 'array',
+ __new__ = interp2app(new_array_sub),
+ __init__ = interp2app(W_WrappedArray.__init__),
+ pop = interp2app(W_WrappedArray.descr_pop),
+ __getitem__ = interp2app(W_WrappedArray.descr_getitem),
+ __iadd__ = interp2app(W_WrappedArray.descr_iadd),
+ __imul__ = interp2app(W_WrappedArray.descr_imul),
+ __reduce__ = interp2app(W_WrappedArray.descr_reduce),
+ itemsize = GetSetProperty(descr_wrapped_itemsize, cls=W_WrappedArray),
+ typecode = GetSetProperty(descr_wrapped_typecode, cls=W_WrappedArray),
+
+ **typedefs
+)
Modified: pypy/branch/interplevel-array/pypy/module/array/test/test_array.py
==============================================================================
--- pypy/branch/interplevel-array/pypy/module/array/test/test_array.py (original)
+++ pypy/branch/interplevel-array/pypy/module/array/test/test_array.py Wed Jul 14 08:38:44 2010
@@ -532,12 +532,16 @@
assert repr(self.array('i') + self.array('i')) == "array('i')"
a = self.array('i', [1, 2])
+ assert type(a + a) is self.array
+ assert type(a * 2) is self.array
+ assert type(2 * a) is self.array
b = a
a += a
assert repr(b) == "array('i', [1, 2, 1, 2])"
b *= 3
assert repr(a) == "array('i', [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2])"
assert a == b
+ print "\nok: ", type(a)
a += self.array('i', (7,))
assert repr(a) == "array('i', [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 7])"
@@ -587,10 +591,26 @@
a = self.array('i', lier(5))
assert repr(a) == "array('i', [4, 3, 2, 1, 0])"
- #FIXME
- #def test_type(self):
- # for t in 'bBhHiIlLfdcu':
- # assert type(self.array(t)) is self.array
+ def test_type(self):
+ for t in 'bBhHiIlLfdcu':
+ assert type(self.array(t)) is self.array
+ assert isinstance(self.array(t), self.array)
+
+ def test_subclass(self):
+ assert len(self.array('b')) == 0
+
+ a=self.array('i')
+ a.append(7)
+ assert len(a) == 1
+
+ array=self.array
+ class adder(array):
+ def __getitem__(self, i):
+ return array.__getitem__(self, i) + 1
+
+ a=adder('i', (1,2,3))
+ assert len(a) == 3
+ assert a[0] == 2
class TestCPythonsOwnArray(BaseArrayTests):
More information about the Pypy-commit
mailing list