Author: Maciej Fijalkowski <[email protected]>
Branch: remove-array-smm
Changeset: r64011:2b3d8b334946
Date: 2013-05-12 16:24 +0200
http://bitbucket.org/pypy/pypy/changeset/2b3d8b334946/
Log: work some more on array smm removal
diff --git a/pypy/module/array/interp_array.py
b/pypy/module/array/interp_array.py
--- a/pypy/module/array/interp_array.py
+++ b/pypy/module/array/interp_array.py
@@ -51,11 +51,6 @@
return a
-array_reverse = SMM('reverse', 1)
-array_remove = SMM('remove', 2)
-array_pop = SMM('pop', 2, defaults=(-1,))
-array_insert = SMM('insert', 3)
-
array_tolist = SMM('tolist', 1)
array_fromlist = SMM('fromlist', 2)
array_tostring = SMM('tostring', 1)
@@ -108,6 +103,36 @@
"""
raise NotImplementedError
+ def descr_reverse(self, space):
+ """ reverse()
+
+ Reverse the order of the items in the array.
+ """
+ raise NotImplementedError
+
+ def descr_remove(self, space, w_val):
+ """ remove(x)
+
+ Remove the first occurrence of x in the array.
+ """
+ raise NotImplementedError
+
+ @unwrap_spec(i=int)
+ def descr_pop(self, space, i=-1):
+ """ pop([i])
+
+ Return the i-th element and delete it from the array. i defaults to -1.
+ """
+ raise NotImplementedError
+
+ @unwrap_spec(idx=int)
+ def descr_insert(self, space, idx, w_val):
+ """ insert(i,x)
+
+ Insert a new item x into the array before position i.
+ """
+ raise NotImplementedError
+
@staticmethod
def register(typeorder):
typeorder[W_ArrayBase] = []
@@ -123,6 +148,10 @@
extend = interp2app(W_ArrayBase.descr_extend),
count = interpindirect2app(W_ArrayBase.descr_count),
index = interpindirect2app(W_ArrayBase.descr_index),
+ reverse = interpindirect2app(W_ArrayBase.descr_reverse),
+ remove = interpindirect2app(W_ArrayBase.descr_remove),
+ pop = interpindirect2app(W_ArrayBase.descr_pop),
+ insert = interpindirect2app(W_ArrayBase.descr_insert),
)
W_ArrayBase.typedef.registermethods(globals())
@@ -394,6 +423,44 @@
msg = 'array.index(x): x not in list'
raise OperationError(space.w_ValueError, space.wrap(msg))
+ def descr_reverse(self, space):
+ b = self.buffer
+ for i in range(self.len / 2):
+ b[i], b[self.len - i - 1] = b[self.len - i - 1], b[i]
+
+ def descr_pop(self, space, i):
+ if i < 0:
+ i += self.len
+ if i < 0 or i >= self.len:
+ msg = 'pop index out of range'
+ raise OperationError(space.w_IndexError, space.wrap(msg))
+ w_val = self.w_getitem(space, i)
+ while i < self.len - 1:
+ self.buffer[i] = self.buffer[i + 1]
+ i += 1
+ self.setlen(self.len - 1)
+ return w_val
+
+ def descr_remove(self, space, w_val):
+ w_idx = self.descr_index(space, w_val)
+ self.descr_pop(space, space.int_w(w_idx))
+
+ def descr_insert(self, space, idx, w_val):
+ if idx < 0:
+ idx += self.len
+ if idx < 0:
+ idx = 0
+ if idx > self.len:
+ idx = self.len
+
+ val = self.item_w(w_val)
+ self.setlen(self.len + 1)
+ i = self.len - 1
+ while i > idx:
+ self.buffer[i] = self.buffer[i - 1]
+ i -= 1
+ self.buffer[i] = val
+
# Basic get/set/append/extend methods
def len__Array(space, self):
@@ -445,46 +512,6 @@
def setslice__Array_ANY_ANY_ANY(space, self, w_i, w_j, w_x):
space.setitem(self, space.newslice(w_i, w_j, space.w_None), w_x)
- def array_reverse__Array(space, self):
- b = self.buffer
- for i in range(self.len / 2):
- b[i], b[self.len - i - 1] = b[self.len - i - 1], b[i]
-
- def array_pop__Array_ANY(space, self, w_idx):
- i = space.int_w(w_idx)
- if i < 0:
- i += self.len
- if i < 0 or i >= self.len:
- msg = 'pop index out of range'
- raise OperationError(space.w_IndexError, space.wrap(msg))
- w_val = self.w_getitem(space, i)
- while i < self.len - 1:
- self.buffer[i] = self.buffer[i + 1]
- i += 1
- self.setlen(self.len - 1)
- return w_val
-
- def array_remove__Array_ANY(space, self, w_val):
- w_idx = self.descr_index(space, w_val)
- array_pop__Array_ANY(space, self, w_idx)
-
- def array_insert__Array_ANY_ANY(space, self, w_idx, w_val):
- idx = space.int_w(w_idx)
- if idx < 0:
- idx += self.len
- if idx < 0:
- idx = 0
- if idx > self.len:
- idx = self.len
-
- val = self.item_w(w_val)
- self.setlen(self.len + 1)
- i = self.len - 1
- while i > idx:
- self.buffer[i] = self.buffer[i - 1]
- i -= 1
- self.buffer[i] = val
-
def delitem__Array_ANY(space, self, w_idx):
# XXX this is a giant slow hack
w_lst = array_tolist__Array(space, self)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit