[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