Re: [pypy-dev] [pypy-svn] r75824 - in pypy/branch/interplevel-array/pypy/module/array: . test

+ + def item_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) +
Hey. This looks a bit ugly, you can definitely do it with some constant dict or something (we have special support for iterating over constants and unrolling the iteration, look for unrolling_iterable). Also, annotator can fold a bunch of ifs into a switch, but not if "in" operator is used (or is fine though).
participants (1)
-
Maciej Fijalkowski