[pypy-svn] r76125 - in pypy/branch/interplevel-array/pypy/module/array: . test
hakanardo at codespeak.net
hakanardo at codespeak.net
Mon Jul 12 08:01:58 CEST 2010
Author: hakanardo
Date: Mon Jul 12 08:01:56 2010
New Revision: 76125
Modified:
pypy/branch/interplevel-array/pypy/module/array/app_array.py
pypy/branch/interplevel-array/pypy/module/array/interp_array.py
pypy/branch/interplevel-array/pypy/module/array/test/test_array.py
Log:
list protocol
Modified: pypy/branch/interplevel-array/pypy/module/array/app_array.py
==============================================================================
--- pypy/branch/interplevel-array/pypy/module/array/app_array.py (original)
+++ pypy/branch/interplevel-array/pypy/module/array/app_array.py Mon Jul 12 08:01:56 2010
@@ -170,3 +170,10 @@
else:
return self.tolist() >= other.tolist()
+ ##### list protocol
+
+ def __getslice__(self, i, j):
+ return self.__getitem__(slice(i, j))
+
+ def __setslice__(self, i, j, x):
+ self.__setitem__(slice(i, j), x)
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 Mon Jul 12 08:01:56 2010
@@ -126,6 +126,7 @@
for i in range(min(size,self.len)):
new_buffer[i] = self.buffer[i]
else:
+ assert size == 0
new_buffer = lltype.nullptr(mytype.arraytype)
if self.buffer != lltype.nullptr(mytype.arraytype):
lltype.free(self.buffer, flavor='raw')
@@ -138,22 +139,36 @@
descr_len.unwrap_spec = ['self']
- def descr_getslice(self, start, stop, step):
- size = (stop - start) / step
- if (stop - start) % step > 0: size += 1
- w_a=mytype.w_class(self.space)
- w_a.setlen(size)
- j=0
- for i in range(start, stop, step):
- w_a.buffer[j]=self.buffer[i]
- j+=1
+ def descr_getslice(self, w_idx):
+ space = self.space
+ start, stop, step = space.decode_index(w_idx, self.len)
+ if step < 0:
+ w_lst = space.call_function(
+ space.getattr(self, space.wrap('tolist')))
+ w_lst = space.call_function(
+ space.getattr(w_lst, space.wrap('__getitem__')),
+ w_idx)
+ w_a=mytype.w_class(self.space)
+ w_a.descr_fromsequence(w_lst)
+ 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)
+ j=0
+ for i in range(start, stop, step):
+ w_a.buffer[j]=self.buffer[i]
+ j+=1
return w_a
def descr_getitem(self, w_idx):
space=self.space
start, stop, step = space.decode_index(w_idx, self.len)
- if step==0:
- item = self.buffer[start]
+ if step == 0:
+ idx = start
+ item = self.buffer[idx]
tc=mytype.typecode
if tc == 'b' or tc == 'B' or tc == 'h' or tc == 'H' or tc == 'i' or tc == 'l':
item = rffi.cast(lltype.Signed, item)
@@ -161,7 +176,7 @@
item = float(item)
return self.space.wrap(item)
else:
- return self.descr_getslice(start, stop, step)
+ return self.descr_getslice(w_idx)
descr_getitem.unwrap_spec = ['self', W_Root]
@@ -208,30 +223,39 @@
self.descr_append(w_item)
descr_extend.unwrap_spec = ['self', W_Root]
- def descr_setslice(self, start, stop, step, w_item):
+ def descr_setslice(self, w_idx, w_item):
+ space=self.space
+ start, stop, step = self.space.decode_index(w_idx, self.len)
if isinstance(w_item, W_Array): # Implies mytype.typecode == w_item.typecode
size = (stop - start) / step
if (stop - start) % step > 0: size += 1
- if w_item.len != size: # FIXME: Support for step=1
- msg = ('attempt to assign array of size %d to ' +
- 'slice of size %d') % (w_item.len, size)
- raise OperationError(self.space.w_ValueError,
- self.space.wrap(msg))
- j=0
- for i in range(start, stop, step):
- self.buffer[i]=w_item.buffer[j]
- j+=1
+ if w_item.len != size or step < 0:
+ w_lst = space.call_function(
+ space.getattr(self, space.wrap('tolist')))
+ w_item = space.call_function(
+ space.getattr(w_item, space.wrap('tolist')))
+ space.call_function(
+ space.getattr(w_lst, space.wrap('__setitem__')),
+ w_idx, w_item)
+ self.setlen(0)
+ self.descr_fromsequence(w_lst)
+ else:
+ j=0
+ for i in range(start, stop, step):
+ self.buffer[i]=w_item.buffer[j]
+ j+=1
return
msg='can only assign array to array slice'
raise OperationError(self.space.w_TypeError, self.space.wrap(msg))
def descr_setitem(self, w_idx, w_item):
start, stop, step = self.space.decode_index(w_idx, self.len)
- if step==0:
+ if step == 0:
+ idx = start
item = self.item_w(w_item)
- self.buffer[start] = item
+ self.buffer[idx] = item
else:
- self.descr_setslice(start, stop, step, w_item)
+ self.descr_setslice(w_idx, w_item)
descr_setitem.unwrap_spec = ['self', W_Root, W_Root]
def charbuf(self):
@@ -310,7 +334,7 @@
def descr_copy(self):
- w_a=mytype.w_class(self.space)
+ w_a = mytype.w_class(self.space)
w_a.descr_fromsequence(self)
return w_a
@@ -333,6 +357,44 @@
for i in range(mytype.bytes):
bytes[stop - i] = tmp[i]
+ def descr_add(self, w_other):
+ other = self.space.interp_w(W_Array, w_other)
+ w_a = mytype.w_class(self.space)
+ w_a.setlen(self.len + other.len)
+ for i in range(self.len):
+ w_a.buffer[i] = self.buffer[i]
+ for i in range(other.len):
+ w_a.buffer[i + self.len] = other.buffer[i]
+ return w_a
+ descr_add.unwrap_spec = ['self', W_Root]
+
+ def descr_iadd(self, w_other):
+ other = self.space.interp_w(W_Array, w_other)
+ oldlen = self.len
+ otherlen = other.len
+ self.setlen(oldlen + otherlen)
+ for i in range(otherlen):
+ self.buffer[oldlen + i] = other.buffer[i]
+ return self
+ descr_add.unwrap_spec = ['self', W_Root]
+
+ def descr_mul(self, repeat):
+ w_a = mytype.w_class(self.space)
+ w_a.setlen(self.len * repeat)
+ for r in range(repeat):
+ for i in range(self.len):
+ w_a.buffer[r * self.len + i] = self.buffer[i]
+ return w_a
+ descr_mul.unwrap_spec = ['self', int]
+
+ def descr_imul(self, repeat):
+ oldlen=self.len
+ self.setlen(self.len * repeat)
+ for r in range(1,repeat):
+ for i in range(oldlen):
+ self.buffer[r * oldlen + i] = self.buffer[i]
+ return self
+ descr_imul.unwrap_spec = ['self', int]
@@ -348,6 +410,8 @@
__len__ = interp2app(W_Array.descr_len),
__getitem__ = interp2app(W_Array.descr_getitem),
__setitem__ = interp2app(W_Array.descr_setitem),
+ __getslice__ = appmethod('__getslice__'),
+ __setslice__ = appmethod('__setslice__'),
itemsize = GetSetProperty(descr_itemsize, cls=W_Array),
typecode = GetSetProperty(descr_typecode, cls=W_Array),
@@ -390,6 +454,12 @@
__reduce__ = interp2app(W_Array.descr_reduce),
__copy__ = interp2app(W_Array.descr_copy),
+ __add__ = interp2app(W_Array.descr_add),
+ __iadd__ = interp2app(W_Array.descr_iadd),
+ __mul__ = interp2app(W_Array.descr_mul),
+ __rmul__ = interp2app(W_Array.descr_mul),
+ __imul__ = interp2app(W_Array.descr_imul),
+
buffer_info = interp2app(W_Array.descr_buffer_info),
byteswap = interp2app(W_Array.descr_byteswap),
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 Mon Jul 12 08:01:56 2010
@@ -289,6 +289,64 @@
except TypeError:
pass
+ a=self.array('i', [1,2,3])
+ assert a.__getslice__(1,2) == a[1:2]
+ a.__setslice__(1,2, self.array('i',(7,)))
+ assert a[0] == 1 and a[1] == 7 and a[2] == 3
+
+ def test_resizingslice(self):
+ a=self.array('i', [1, 2, 3])
+ a[1:2] = self.array('i', [7, 8, 9])
+ assert repr(a) == "array('i', [1, 7, 8, 9, 3])"
+ a[1:2] = self.array('i', [10])
+ assert repr(a) == "array('i', [1, 10, 8, 9, 3])"
+ a[1:2] = self.array('i')
+ assert repr(a) == "array('i', [1, 8, 9, 3])"
+
+ a[1:3] = self.array('i', [11, 12, 13])
+ assert repr(a) == "array('i', [1, 11, 12, 13, 3])"
+ a[1:3] = self.array('i', [14])
+ assert repr(a) == "array('i', [1, 14, 13, 3])"
+ a[1:3] = self.array('i')
+ assert repr(a) == "array('i', [1, 3])"
+
+ a[1:1] = self.array('i', [15, 16, 17])
+ assert repr(a) == "array('i', [1, 15, 16, 17, 3])"
+ a[1:1] = self.array('i', [18])
+ assert repr(a) == "array('i', [1, 18, 15, 16, 17, 3])"
+ a[1:1] = self.array('i')
+ assert repr(a) == "array('i', [1, 18, 15, 16, 17, 3])"
+
+ a[:] = self.array('i', [20, 21, 22])
+ assert repr(a) == "array('i', [20, 21, 22])"
+
+ def test_reversingslice(self):
+ a = self.array('i', [22, 21, 20])
+ assert repr(a[::-1]) == "array('i', [20, 21, 22])"
+ assert repr(a[2:1:-1]) == "array('i', [20])"
+ assert repr(a[2:-1:-1]) == "array('i')"
+ assert repr(a[-1:0:-1]) == "array('i', [20, 21])"
+
+ for a in range(-4,5):
+ for b in range(-4,5):
+ for c in [-4, -3, -2, -1, 1, 2, 3, 4]:
+ lst = [1, 2, 3]
+ arr=self.array('i', lst)
+ assert repr(arr[a:b:c]) == repr(self.array('i', lst[a:b:c]))
+ for vals in ([4,5], [6], []):
+ try:
+ ok = False
+ lst[a:b:c]=vals
+ ok = True
+ arr[a:b:c]=self.array('i', vals)
+ assert repr(arr) == repr(self.array('i', lst))
+ except ValueError:
+ assert not ok
+ raises(ValueError,
+ "arr[a:b:c]=self.array('i', vals)")
+
+
+
def test_toxxx(self):
a = self.array('i', [1,2,3])
l = a.tolist()
@@ -458,7 +516,30 @@
assert a[0] == 1
assert a[1] == 2
assert a[2] == 3
-
+
+ def test_addmul(self):
+ a = self.array('i', [1, 2, 3])
+ assert repr(a + a) == "array('i', [1, 2, 3, 1, 2, 3])"
+ assert 2 * a == a + a
+ assert a * 2 == a + a
+ b = self.array('i', [4, 5, 6, 7])
+ assert repr(a + b) == "array('i', [1, 2, 3, 4, 5, 6, 7])"
+ assert repr(2 * self.array('i')) == "array('i')"
+ assert repr(self.array('i') + self.array('i')) == "array('i')"
+
+ a = self.array('i', [1, 2])
+ 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
+ a += self.array('i', (7,))
+ assert repr(a) == "array('i', [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 7])"
+
+ raises(TypeError, self.array('i').__add__, (2,))
+ raises(TypeError, self.array('i').__add__, self.array('b'))
+
#FIXME
#def test_type(self):
More information about the Pypy-commit
mailing list