[pypy-svn] r76159 - pypy/branch/interplevel-array/pypy/module/array
hakanardo at codespeak.net
hakanardo at codespeak.net
Mon Jul 12 20:11:08 CEST 2010
Author: hakanardo
Date: Mon Jul 12 20:11:06 2010
New Revision: 76159
Modified:
pypy/branch/interplevel-array/pypy/module/array/interp_array.py
Log:
Speedups for lists and tuples
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 20:11:06 2010
@@ -3,6 +3,8 @@
from pypy.interpreter.typedef import TypeDef, GetSetProperty
from pypy.rpython.lltypesystem import lltype, rffi
from pypy.interpreter.gateway import interp2app, ObjSpace, W_Root, ApplevelClass
+from pypy.objspace.std.listobject import W_ListObject
+from pypy.objspace.std.tupleobject import W_TupleObject
from pypy.rlib.jit import dont_look_inside
from pypy.rlib import rgc
from pypy.rlib.unroll import unrolling_iterable
@@ -43,11 +45,12 @@
self.canoverflow = canoverflow
self.w_class = None
- assert self.bytes <= rffi.sizeof(rffi.ULONG)
- if self.bytes == rffi.sizeof(rffi.ULONG) and not signed and self.unwrap == 'int_w':
- # Treat this type as a ULONG
- self.unwrap = 'bigint_w'
- self.canoverflow = False
+ if self.canoverflow:
+ assert self.bytes <= rffi.sizeof(rffi.ULONG)
+ if self.bytes == rffi.sizeof(rffi.ULONG) and not signed and self.unwrap == 'int_w':
+ # Treat this type as a ULONG
+ self.unwrap = 'bigint_w'
+ self.canoverflow = False
def _freeze_(self):
@@ -209,16 +212,23 @@
new = space.int_w(w_new)
oldlen = self.len
self.setlen(self.len + new)
- for i in range(new):
- w_item = space.call_function(
- space.getattr(w_seq, space.wrap('__getitem__')),
- space.wrap(i))
- try:
- item=self.item_w(w_item)
- except OperationError:
- self.setlen(oldlen + i)
- raise
- self.buffer[oldlen + i ] = item
+
+ try:
+ if (isinstance(w_seq, W_ListObject) or
+ isinstance(w_seq, W_TupleObject)):
+ for i in range(new):
+ item = self.item_w(w_seq.wrappeditems[i])
+ self.buffer[oldlen + i ] = item
+ else:
+ getitem = space.getattr(w_seq, space.wrap('__getitem__'))
+ for i in range(new):
+ w_item = space.call_function(getitem, space.wrap(i))
+ item=self.item_w(w_item)
+ self.buffer[oldlen + i ] = item
+ except OperationError:
+ self.setlen(oldlen + i)
+ raise
+
descr_fromsequence.unwrap_spec = ['self', W_Root]
@@ -340,12 +350,12 @@
if i < 0 or i >= self.len:
msg = 'pop index out of range'
raise OperationError(self.space.w_IndexError, self.space.wrap(msg))
- val = self.buffer[i]
+ val = self.descr_getitem(self.space.wrap(i))
while i < self.len - 1:
self.buffer[i] = self.buffer[i + 1]
i += 1
self.setlen(self.len-1)
- return self.space.wrap(val)
+ return val
descr_pop.unwrap_spec = ['self', int]
@@ -467,7 +477,6 @@
tounicode = appmethod('tounicode'),
tofile = appmethod('tofile'),
write = appmethod('tofile'),
- #tostring = appmethod('tostring'),
tostring = interp2app(W_Array.descr_tostring),
_setlen = interp2app(W_Array.setlen),
More information about the Pypy-commit
mailing list