def descr__new__(space, w_unicodetype, w_string='', w_encoding=None, w_errors=None): # NB. the default value of w_obj is really a *wrapped* empty string: # there is gateway magic at work from pypy.objspace.std.unicodeobject import W_UnicodeObject from pypy.objspace.std.ropeunicodeobject import W_RopeUnicodeObject w_obj = w_string w_obj_type = space.type(w_obj) encoding, errors = _get_encoding_and_errors(space, w_encoding, w_errors) if space.is_w(w_obj_type, space.w_unicode): if encoding is not None or errors is not None: raise OperationError(space.w_TypeError, space.wrap('decoding Unicode is not supported')) if space.is_w(w_unicodetype, space.w_unicode): return w_obj w_value = w_obj elif encoding is None and errors is None: if space.is_true(space.isinstance(w_obj, space.w_str)): w_value = unicode_from_string(space, w_obj) elif space.is_true(space.isinstance(w_obj, space.w_unicode)): w_value = w_obj else: w_value = unicode_from_object(space, w_obj) else: w_value = unicode_from_encoded_object(space, w_obj, encoding, errors) if space.config.objspace.std.withropeunicode: assert isinstance(w_value, W_RopeUnicodeObject) w_newobj = space.allocate_instance(W_RopeUnicodeObject, w_unicodetype) W_RopeUnicodeObject.__init__(w_newobj, w_value._node) return w_newobj assert isinstance(w_value, W_UnicodeObject) w_newobj = space.allocate_instance(W_UnicodeObject, w_unicodetype) W_UnicodeObject.__init__(w_newobj, w_value._value) return w_newobj
def descr_new_(space, w_unicodetype, w_string='', w_encoding=None, w_errors=None): # NB. the default value of w_obj is really a *wrapped* empty string: # there is gateway magic at work from pypy.objspace.std.unicodeobject import W_UnicodeObject from pypy.objspace.std.ropeunicodeobject import W_RopeUnicodeObject w_obj = w_string encoding, errors = _get_encoding_and_errors(space, w_encoding, w_errors) if space.is_true(space.isinstance(w_obj, space.w_unicode)): if encoding is not None or errors is not None: raise OperationError(space.w_TypeError, space.wrap('decoding Unicode is not supported')) w_value = w_obj else: if encoding is None and errors is None: if space.is_true(space.isinstance(w_obj, space.w_str)): w_value = unicode_from_string(space, w_obj) else: w_value = unicode_from_object(space, w_obj) else: w_value = unicode_from_encoded_object(space, w_obj, encoding, errors) if space.is_w(w_unicodetype, space.w_unicode): return w_value if space.config.objspace.std.withropeunicode: assert isinstance(w_value, W_RopeUnicodeObject) w_newobj = space.allocate_instance(W_RopeUnicodeObject, w_unicodetype) W_RopeUnicodeObject.__init__(w_newobj, w_value._node) return w_newobj assert isinstance(w_value, W_UnicodeObject) w_newobj = space.allocate_instance(W_UnicodeObject, w_unicodetype) W_UnicodeObject.__init__(w_newobj, w_value._value) return w_newobj
def unicode_from_string(space, w_str): # this is a performance and bootstrapping hack if space.config.objspace.std.withropeunicode: from pypy.objspace.std.ropeunicodeobject import unicode_from_string return unicode_from_string(space, w_str) encoding = getdefaultencoding(space) from pypy.objspace.std.unicodeobject import W_UnicodeObject if encoding != 'ascii': return unicode_from_encoded_object(space, w_str, encoding, "strict") s = space.str_w(w_str) try: return W_UnicodeObject(s.decode("ascii")) except UnicodeDecodeError: # raising UnicodeDecodeError is messy, "please crash for me" return unicode_from_encoded_object(space, w_str, "ascii", "strict")