[pypy-svn] r76008 - pypy/branch/interplevel-array/pypy/module/array
hakanardo at codespeak.net
hakanardo at codespeak.net
Thu Jul 8 10:39:21 CEST 2010
Author: hakanardo
Date: Thu Jul 8 10:39:20 2010
New Revision: 76008
Modified:
pypy/branch/interplevel-array/pypy/module/array/interp_array.py
Log:
Passing rtyper
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 Thu Jul 8 10:39:20 2010
@@ -35,10 +35,7 @@
class TypeCode(object):
def __init__(self, itemtype, unwrap, canoverflow=False, signed=False):
self.itemtype = itemtype
- if itemtype is lltype.SingleFloat: # FUIXME
- self.bytes = 4
- else:
- self.bytes = rffi.sizeof(itemtype)
+ self.bytes = rffi.sizeof(itemtype)
self.arraytype = lltype.GcArray(itemtype)
self.unwrap = unwrap
self.signed = signed
@@ -53,67 +50,66 @@
types = {
'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), # FIXME: Won't compile
-# 'f': TypeCode(lltype.SingleFloat, 'float_w'),
-# 'd': TypeCode(lltype.Float, 'float_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'), # Overflow handled by rbigint.touint() which
+ # corresponds to the C-type unsigned long
+ 'f': TypeCode(lltype.SingleFloat, 'float_w'),
+ 'd': TypeCode(lltype.Float, 'float_w'),
}
for k, v in types.items(): v.typecode=k
unroll_typecodes = unrolling_iterable(types.keys())
-for thetypecode, thetype in types.items():
+def make_array(mytype):
class W_Array(W_ArrayBase):
- mytype = thetype
+ itemsize=mytype.bytes
+ typecode=mytype.typecode
def __init__(self, space):
self.space = space
self.len = 0
- self.buffer = lltype.nullptr(self.mytype.arraytype)
+ self.buffer = lltype.nullptr(mytype.arraytype)
def item_w(self, w_item):
space = self.space
- unwrap = getattr(space, self.mytype.unwrap)
+ unwrap = getattr(space, mytype.unwrap)
item = unwrap(w_item)
- if self.mytype.unwrap == 'bigint_w':
+ if mytype.unwrap == 'bigint_w':
try:
- if self.mytype.signed:
- item = item.tolonglong()
- else:
- item = item.toulonglong()
+ item = item.touint()
except (ValueError, OverflowError):
- msg = 'unsigned %d-byte integer out of range' % self.mytype.bytes
+ msg = 'unsigned %d-byte integer out of range' % mytype.bytes
raise OperationError(space.w_OverflowError, space.wrap(msg))
- elif self.mytype.unwrap == 'str_w' or self.mytype.unwrap == 'unicode_w':
+ elif mytype.unwrap == 'str_w' or mytype.unwrap == 'unicode_w':
if len(item) != 1:
msg = 'array item must be char'
raise OperationError(space.w_TypeError, space.wrap(msg))
item=item[0]
- if self.mytype.canoverflow:
+ if mytype.canoverflow:
msg = None
- if self.mytype.signed:
- if item < -1 << (self.mytype.bytes * 8 - 1):
- msg = 'signed %d-byte integer is less than minimum' % self.mytype.bytes
- elif item > (1 << (self.mytype.bytes * 8 - 1)) - 1:
- msg = 'signed %d-byte integer is greater than maximum' % self.mytype.bytes
+ if mytype.signed:
+ if item < -1 << (mytype.bytes * 8 - 1):
+ msg = 'signed %d-byte integer is less than minimum' % mytype.bytes
+ elif item > (1 << (mytype.bytes * 8 - 1)) - 1:
+ msg = 'signed %d-byte integer is greater than maximum' % mytype.bytes
else:
if item < 0:
- msg = 'unsigned %d-byte integer is less than minimum' % self.mytype.bytes
- elif item > (1 << (self.mytype.bytes * 8)) - 1:
- msg = 'unsigned %d-byte integer is greater than maximum' % self.mytype.bytes
+ msg = 'unsigned %d-byte integer is less than minimum' % mytype.bytes
+ elif item > (1 << (mytype.bytes * 8)) - 1:
+ msg = 'unsigned %d-byte integer is greater than maximum' % mytype.bytes
if msg is not None:
raise OperationError(space.w_OverflowError, space.wrap(msg))
- return rffi.cast(self.mytype.itemtype, item)
+ return rffi.cast(mytype.itemtype, item)
def setlen(self, size):
- new_buffer = lltype.malloc(self.mytype.arraytype, size)
+ new_buffer = lltype.malloc(mytype.arraytype, size)
for i in range(min(size,self.len)):
new_buffer[i] = self.buffer[i]
self.buffer = new_buffer
@@ -130,16 +126,16 @@
start, stop, step = space.decode_index(w_idx, self.len)
if step==0:
item = self.buffer[start]
- tc=self.mytype.typecode
+ 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)
- elif self.mytype.typecode == 'f':
+ elif mytype.typecode == 'f':
item = float(item)
return self.space.wrap(item)
else:
size = (stop - start) / step
if (stop - start) % step > 0: size += 1
- w_a=self.mytype.w_class(self.space)
+ w_a=mytype.w_class(self.space)
w_a.setlen(size)
j=0
for i in range(start, stop, step):
@@ -178,7 +174,7 @@
def descr_extend(self, w_iterable):
space=self.space
if isinstance(w_iterable, W_ArrayBase):
- if self.mytype.typecode != w_iterable.mytype.typecode:
+ if mytype.typecode != w_iterable.typecode:
msg = "can only extend with array of same kind"
raise OperationError(space.w_TypeError, space.wrap(msg))
w_iterator = space.iter(w_iterable)
@@ -199,36 +195,35 @@
item = self.item_w(w_item)
self.buffer[start] = item
else:
- if isinstance(w_item, W_ArrayBase):
- if self.mytype.typecode == w_item.mytype.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
- return
+ 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
+ return
msg='can only assign array to array slice'
raise OperationError(self.space.w_TypeError, self.space.wrap(msg))
descr_setitem.unwrap_spec = ['self', W_Root, W_Root]
def descr_fromstring(self, s):
- if len(s)%self.mytype.bytes !=0:
+ if len(s)%mytype.bytes !=0:
msg = 'string length not a multiple of item size'
raise OperationError(self.space.w_ValueError, self.space.wrap(msg))
oldlen = self.len
- new = len(s) / self.mytype.bytes
+ new = len(s) / mytype.bytes
self.setlen(oldlen + new)
for i in range(new):
- p = i * self.mytype.bytes
- item=runpack(self.mytype.typecode, s[p:p + self.mytype.bytes])
+ p = i * mytype.bytes
+ item=runpack(mytype.typecode, s[p:p + mytype.bytes])
#self.buffer[oldlen + i]=self.item_w(self.space.wrap(item))
- self.buffer[oldlen + i]=rffi.cast(self.mytype.itemtype, item)
+ self.buffer[oldlen + i]=rffi.cast(mytype.itemtype, item)
descr_fromstring.unwrap_spec = ['self', str]
def descr_tolist(self):
@@ -242,13 +237,13 @@
def descr_itemsize(space, self):
- return space.wrap(self.mytype.bytes)
+ return space.wrap(self.itemsize)
def descr_typecode(space, self):
- return space.wrap(self.mytype.typecode)
+ return space.wrap(self.typecode)
- W_Array.__name__ = 'W_ArrayType_'+thetypecode
+ W_Array.__name__ = 'W_ArrayType_'+mytype.typecode
W_Array.typedef = TypeDef(
- 'ArrayType_'+thetypecode,
+ 'ArrayType_'+mytype.typecode,
append = interp2app(W_Array.descr_append),
__len__ = interp2app(W_Array.descr_len),
__getitem__ = interp2app(W_Array.descr_getitem),
@@ -258,7 +253,7 @@
typecode = GetSetProperty(descr_typecode, cls=W_Array),
extend = interp2app(W_Array.descr_extend),
- _fromsequence = interp2app(W_Array.descr_fromsequence),
+ _fromsequence= interp2app(W_Array.descr_fromsequence),
fromstring = interp2app(W_Array.descr_fromstring),
fromunicode = appmethod('fromunicode'),
fromfile = appmethod('fromfile'),
@@ -273,8 +268,10 @@
_setlen = interp2app(W_Array.setlen),
)
- thetype.w_class = W_Array
+ mytype.w_class = W_Array
+for mytype in types.values():
+ make_array(mytype)
initiate=app.interphook('initiate')
def array(space, typecode, w_initializer=None):
More information about the Pypy-commit
mailing list