[pypy-svn] r75829 - in pypy/branch/interplevel-array/pypy/module/array: . test
hakanardo at codespeak.net
hakanardo at codespeak.net
Mon Jul 5 12:23:06 CEST 2010
Author: hakanardo
Date: Mon Jul 5 12:23:04 2010
New Revision: 75829
Modified:
pypy/branch/interplevel-array/pypy/module/array/interp_array.py
pypy/branch/interplevel-array/pypy/module/array/test/test_array.py
Log:
all types now properly sized
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 5 12:23:04 2010
@@ -1,10 +1,11 @@
from pypy.interpreter.baseobjspace import Wrappable
from pypy.interpreter.error import OperationError
-from pypy.interpreter.typedef import TypeDef
+from pypy.interpreter.typedef import TypeDef, GetSetProperty
from pypy.rpython.lltypesystem import lltype, rffi
from pypy.interpreter.gateway import interp2app, ObjSpace, W_Root
from pypy.rlib.jit import dont_look_inside
from pypy.rlib import rgc
+from pypy.rlib.rbigint import rbigint
FloatArray=lltype.GcArray(lltype.Float)
@@ -43,9 +44,12 @@
class TypeCode(object):
- def __init__(self, itemtype, unwrap, bytes, canoverflow=False, signed=False):
+ def __init__(self, itemtype, unwrap, canoverflow=False, signed=False):
self.itemtype=itemtype
- self.bytes = bytes
+ if itemtype is lltype.SingleFloat:
+ self.bytes=4
+ else:
+ self.bytes = rffi.sizeof(itemtype)
self.unwrap=unwrap
self.signed = signed
self.canoverflow = canoverflow
@@ -53,27 +57,19 @@
types = {
- 'c': TypeCode(lltype.Char, 'str_w', 1),
- 'u': TypeCode(lltype.UniChar, 'unicode_w', 4), # FIXME: is unicode always 4 bytes?
- 'b': TypeCode(rffi.SIGNEDCHAR, 'int_w', 1, True, True),
- 'B': TypeCode(rffi.UCHAR, 'int_w', 1, True),
- 'h': TypeCode(rffi.SHORT, 'int_w', 2, True, True),
- 'H': TypeCode(rffi.USHORT, 'int_w', 2, True),
- 'i': TypeCode(lltype.Signed, 'int_w', 4, True, True),
- 'I': TypeCode(lltype.Unsigned, 'int_w', 4, True),
- 'l': TypeCode(lltype.Signed, 'int_w', 8, True, True),
- 'L': TypeCode(lltype.Unsigned, 'int_w', 8, True),
- 'f': TypeCode(lltype.SingleFloat, 'float_w', 4),
- 'd': TypeCode(lltype.Float, 'float_w', 8),
+ 'c': TypeCode(lltype.Char, 'str_w'),
+ 'u': TypeCode(lltype.UniChar, 'unicode_w'),
+ 'b': TypeCode(rffi.SIGNEDCHAR, 'int_w', True, True),
+ 'B': TypeCode(rffi.UCHAR, 'int_w', True),
+ 'h': TypeCode(rffi.SHORT, 'int_w', True, True),
+ 'H': TypeCode(rffi.USHORT, 'int_w', True),
+ 'i': TypeCode(rffi.INT, 'int_w', True, True),
+ 'I': TypeCode(rffi.UINT, 'int_w', True),
+ 'l': TypeCode(rffi.LONG, 'int_w', True, True),
+ 'L': TypeCode(rffi.ULONG, 'bigint_w', True),
+ 'f': TypeCode(lltype.SingleFloat, 'float_w'),
+ 'd': TypeCode(lltype.Float, 'float_w'),
}
-## def array(space, typecode, w_initializer=None):
-## if
-## self.len=0
-## self.buffer=None
-## if w_initializer is not None and not space.is_w(w_size, space.w_None):
-## self.extend(w_initializer) #FIXME: use fromlist, fromstring, ...
-
-## return W_SizedFloatArray(space, size)
class W_Array(Wrappable):
def __init__(self, space, typecode):
@@ -87,12 +83,21 @@
self.typecode=typecode
self.len=0
self.buffer=None
+ self.itemsize = types[typecode].bytes
def item_w(self, w_item):
space=self.space
tc=types[self.typecode]
unwrap=getattr(space, tc.unwrap)
item=unwrap(w_item)
+ if tc.unwrap=='bigint_w':
+ try:
+ if tc.signed: item=item.tolonglong()
+ else: item=item.toulonglong()
+ except (ValueError, OverflowError):
+ msg='unsigned %d-byte integer out of range'%tc.bytes
+ raise OperationError(space.w_OverflowError, space.wrap(msg))
+
if tc.canoverflow:
msg=None
if tc.signed:
@@ -109,77 +114,6 @@
raise OperationError(space.w_OverflowError, space.wrap(msg))
return rffi.cast(tc.itemtype, item)
-
- def olditem_w(self, w_item):
- space=self.space
- if self.typecode == 'c':
- return self.space.str_w(w_item)
- elif self.typecode == 'u':
- return self.space.unicode_w(w_item)
-
- elif self.typecode == 'b':
- item=self.space.int_w(w_item)
- if item<-128:
- msg='signed char is less than minimum'
- raise OperationError(space.w_OverflowError, space.wrap(msg))
- elif item>127:
- msg='signed char is greater than maximum'
- raise OperationError(space.w_OverflowError, space.wrap(msg))
- return rffi.cast(rffi.SIGNEDCHAR, item)
- elif self.typecode == 'B':
- item=self.space.int_w(w_item)
- if item<0:
- msg='unsigned byte integer is less than minimum'
- raise OperationError(space.w_OverflowError, space.wrap(msg))
- elif item>255:
- msg='unsigned byte integer is greater than maximum'
- raise OperationError(space.w_OverflowError, space.wrap(msg))
- return rffi.cast(rffi.UCHAR, item)
-
- elif self.typecode == 'h':
- item=self.space.int_w(w_item)
- if item<-32768:
- msg='signed short integer is less than minimum'
- raise OperationError(space.w_OverflowError, space.wrap(msg))
- elif item>32767:
- msg='signed short integer is greater than maximum'
- raise OperationError(space.w_OverflowError, space.wrap(msg))
- return rffi.cast(rffi.SHORT, item)
- elif self.typecode == 'H':
- item=self.space.int_w(w_item)
- if item<0:
- msg='unsigned short integer is less than minimum'
- raise OperationError(space.w_OverflowError, space.wrap(msg))
- elif item>65535:
- msg='unsigned short integer is greater than maximum'
- raise OperationError(space.w_OverflowError, space.wrap(msg))
- return rffi.cast(rffi.USHORT, item)
-
- elif self.typecode in ('i', 'l'):
- item=self.space.int_w(w_item)
- if item<-2147483648:
- msg='signed integer is less than minimum'
- raise OperationError(space.w_OverflowError, space.wrap(msg))
- elif item>2147483647:
- msg='signed integer is greater than maximum'
- raise OperationError(space.w_OverflowError, space.wrap(msg))
- return rffi.cast(lltype.Signed, item)
- elif self.typecode in ('I', 'L'):
- item=self.space.int_w(w_item)
- if item<0:
- msg='unsigned integer is less than minimum'
- raise OperationError(space.w_OverflowError, space.wrap(msg))
- elif item>4294967295:
- msg='unsigned integer is greater than maximum'
- raise OperationError(space.w_OverflowError, space.wrap(msg))
- return rffi.cast(lltype.Unsigned, item)
-
- elif self.typecode == 'f':
- item=self.space.float_w(w_item)
- return rffi.cast(lltype.SingleFloat, item)
- elif self.typecode == 'd':
- return self.space.float_w(w_item)
-
def setlen(self, size):
new_buffer=lltype.malloc(lltype.GcArray(types[self.typecode].itemtype), size)
for i in range(self.len):
@@ -225,6 +159,13 @@
return self.space.wrap(self.len)
descr_len.unwrap_spec = ['self']
+ def descr_fromstring(self, s):
+ import struct
+
+
+def descr_itemsize(space, self):
+ return space.wrap(self.itemsize)
+
W_Array.typedef=TypeDef(
'Array',
append = interp2app(W_Array.descr_append),
@@ -232,6 +173,7 @@
__len__ = interp2app(W_Array.descr_len),
__getitem__ = interp2app(W_Array.descr_getitem),
__setitem__ = interp2app(W_Array.descr_setitem),
+ itemsize = GetSetProperty(descr_itemsize, cls=W_Array)
)
def array(space, typecode, w_initializer=None):
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 5 12:23:04 2010
@@ -51,6 +51,10 @@
-32768, 32767, -32769, 32768, 65535, 65536,
-2147483647, -2147483648, 2147483647, 4294967295, 4294967296,
)
+ for bb in (8, 16, 32, 64, 128, 256, 512, 1024):
+ for b in (bb-1, bb, bb+1):
+ values += ( 2**b, 2**b+1, 2**b-1, -2**b, -2**b+1, -2**b-1)
+
for tc,ok,pt in (('b',( -128, 34, 127), int),
('B',( 0, 23, 255), int),
('h',(-32768, 30535, 32767), int),
@@ -96,6 +100,31 @@
assert a[2]==2.5
assert len(a)==len(values)
+ def test_itemsize(self):
+ for t in 'cbB': assert(self.array(t).itemsize>=1)
+ for t in 'uhHiI': assert(self.array(t).itemsize>=2)
+ for t in 'lLf': assert(self.array(t).itemsize>=4)
+ for t in 'd': assert(self.array(t).itemsize>=8)
+
+ inttypes='bhil'
+ for t in inttypes:
+ a=self.array(t, [1,2,3])
+ b=a.itemsize
+ for v in (-2**(8*b)/2, 2**(8*b)/2-1):
+ a[1]=v
+ assert a[0]==1 and a[1]==v and a[2]==3
+ raises(OverflowError, a.append, -2**(8*b)/2-1)
+ raises(OverflowError, a.append, 2**(8*b)/2)
+
+ a=self.array(t.upper(), [1,2,3])
+ b=a.itemsize
+ for v in (0, 2**(8*b)-1):
+ print b, v
+ a[1]=v
+ assert a[0]==1 and a[1]==v and a[2]==3
+ raises(OverflowError, a.append, -1)
+ raises(OverflowError, a.append, 2**(8*b))
+
## space.sys.get('modules')
More information about the Pypy-commit
mailing list