def convert_to_object(self, cdata): if self.value_fits_ulong: value = misc.read_raw_ulong_data(cdata, self.size) if self.value_fits_long: return self.space.wrap(intmask(value)) else: return self.space.wrap(value) # r_uint => 'long' object else: return self._convert_to_object_longlong(cdata)
def cast_to_int(self, cdata): if self.is_signed_wchar: value = misc.read_raw_long_data(cdata, self.size) return self.space.newint(value) else: value = misc.read_raw_ulong_data(cdata, self.size) if self.size < rffi.sizeof(lltype.Signed): return self.space.newint(intmask(value)) else: return self.space.newint(value) # r_uint => 'long' object
def convert_to_object(self, cdata): value = misc.read_raw_ulong_data(cdata, self.size) # r_uint try: utf8 = rutf8.unichr_as_utf8(value, allow_surrogates=True) except rutf8.OutOfRange: if self.is_signed_wchar: s = hex(intmask(value)) else: s = hex(value) raise oefmt(self.space.w_ValueError, "%s out of range for conversion to unicode: %s", self.name, s) return self.space.newutf8(utf8, 1)
def convert_to_object(self, cdata): if self.is_signed_wchar: unichardata = rffi.cast(rffi.CWCHARP, cdata) return self.space.newunicode(unichardata[0]) else: value = misc.read_raw_ulong_data(cdata, self.size) # r_uint try: u = wchar_helper.ordinal_to_unicode(value) except wchar_helper.OutOfRange as e: raise oefmt( self.space.w_ValueError, "char32_t out of range for " "conversion to unicode: %s", hex(e.ordinal)) return self.space.newunicode(u)
def _convert_to_charN_t(self, w_ob): # returns a r_uint. If self.size == 2, it is smaller than 0x10000 space = self.space if space.isinstance_w(w_ob, space.w_unicode): w_u = space.convert_arg_to_w_unicode(w_ob) if w_u._len() != 1: raise self._convert_error("single character", w_ob) ordinal = rutf8.codepoint_at_pos(w_u._utf8, 0) if self.size == 2 and ordinal > 0xFFFF: raise self._convert_error("single character <= 0xFFFF", w_ob) return r_uint(ordinal) elif (isinstance(w_ob, cdataobj.W_CData) and isinstance(w_ob.ctype, W_CTypePrimitiveUniChar) and w_ob.ctype.size == self.size): with w_ob as ptr: return misc.read_raw_ulong_data(ptr, self.size) raise self._convert_error("unicode string of length 1", w_ob)
def convert_bitfield_to_object(self, cdata): ctype = self.ctype space = ctype.space # if isinstance(ctype, ctypeprim.W_CTypePrimitiveSigned): if ctype.value_fits_long: value = r_uint(misc.read_raw_long_data(cdata, ctype.size)) valuemask = (r_uint(1) << self.bitsize) - 1 shiftforsign = r_uint(1) << (self.bitsize - 1) value = ((value >> self.bitshift) + shiftforsign) & valuemask result = intmask(value) - intmask(shiftforsign) return space.wrap(result) else: value = misc.read_raw_unsigned_data(cdata, ctype.size) valuemask = (r_ulonglong(1) << self.bitsize) - 1 shiftforsign = r_ulonglong(1) << (self.bitsize - 1) value = ((value >> self.bitshift) + shiftforsign) & valuemask result = r_longlong(value) - r_longlong(shiftforsign) return space.wrap(result) # if isinstance(ctype, ctypeprim.W_CTypePrimitiveUnsigned): value_fits_long = ctype.value_fits_long value_fits_ulong = ctype.value_fits_ulong elif isinstance(ctype, ctypeprim.W_CTypePrimitiveCharOrUniChar): value_fits_long = True value_fits_ulong = True else: raise NotImplementedError # if value_fits_ulong: value = misc.read_raw_ulong_data(cdata, ctype.size) valuemask = (r_uint(1) << self.bitsize) - 1 value = (value >> self.bitshift) & valuemask if value_fits_long: return space.wrap(intmask(value)) else: return space.wrap(value) # uint => wrapped long object else: value = misc.read_raw_unsigned_data(cdata, ctype.size) valuemask = (r_ulonglong(1) << self.bitsize) - 1 value = (value >> self.bitshift) & valuemask return space.wrap(value) # ulonglong => wrapped long object
def _convert_to_charN_t(self, w_ob): # returns a r_uint. If self.size == 2, it is smaller than 0x10000 space = self.space if space.isinstance_w(w_ob, space.w_unicode): u = space.unicode_w(w_ob) try: ordinal = wchar_helper.unicode_to_ordinal(u) except ValueError: pass else: if self.size == 2 and ordinal > 0xffff: raise self._convert_error("single character <= 0xFFFF", w_ob) return ordinal elif (isinstance(w_ob, cdataobj.W_CData) and isinstance(w_ob.ctype, W_CTypePrimitiveUniChar) and w_ob.ctype.size == self.size): with w_ob as ptr: return misc.read_raw_ulong_data(ptr, self.size) raise self._convert_error("unicode string of length 1", w_ob)
def _get_value(self, cdata): # returns an unsigned long assert self.value_fits_ulong return misc.read_raw_ulong_data(cdata, self.size)