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 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) # convoluted logic for the case when unicode subclass has a __unicode__ # method, we need to call this method if space.is_w(space.type(w_obj), space.w_unicode) or ( space.is_true(space.isinstance(w_obj, space.w_unicode)) and space.findattr(w_obj, space.wrap("__unicode__")) is None ): 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: 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 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) # convoluted logic for the case when unicode subclass has a __unicode__ # method, we need to call this method if (space.is_w(space.type(w_obj), space.w_unicode) or (space.isinstance_w(w_obj, space.w_unicode) and space.findattr(w_obj, space.wrap('__unicode__')) is None)): 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: 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