def descr__new__(space, w_stringtype, w_object=''): # NB. the default value of w_object is really a *wrapped* empty string: # there is gateway magic at work from pypy.objspace.std.stringobject import W_StringObject w_obj = space.str(w_object) if space.is_w(w_stringtype, space.w_str): return w_obj # XXX might be reworked when space.str() typechecks value = space.str_w(w_obj) if space.config.objspace.std.withrope: from pypy.objspace.std.ropeobject import rope, W_RopeObject w_obj = space.allocate_instance(W_RopeObject, w_stringtype) W_RopeObject.__init__(w_obj, rope.LiteralStringNode(value)) return w_obj else: w_obj = space.allocate_instance(W_StringObject, w_stringtype) W_StringObject.__init__(w_obj, value) return w_obj
def encode_unicode(space, w_unistr, encoding, errors): from pypy.objspace.std.unicodetype import getdefaultencoding, \ _get_encoding_and_errors, encode_object from pypy.objspace.std.ropeobject import W_RopeObject if errors is None or errors == "strict": node = w_unistr._node if encoding == 'ascii': result = rope.unicode_encode_ascii(node) if result is not None: return W_RopeObject(result) elif encoding == 'latin-1': result = rope.unicode_encode_latin1(node) if result is not None: return W_RopeObject(result) elif encoding == "utf-8": result = rope.unicode_encode_utf8(node) if result is not None: return W_RopeObject(result) return encode_object(space, w_unistr, encoding, errors)
def wrapchar(space, c): from pypy.objspace.std.stringobject import W_StringObject from pypy.objspace.std.ropeobject import rope, W_RopeObject if space.config.objspace.std.withprebuiltchar: if space.config.objspace.std.withrope: return W_RopeObject.PREBUILT[ord(c)] return W_StringObject.PREBUILT[ord(c)] else: if space.config.objspace.std.withrope: return W_RopeObject(rope.LiteralStringNode(c)) return W_StringObject(c)
def wrapstr(space, s): from pypy.objspace.std.stringobject import W_StringObject from pypy.objspace.std.ropeobject import rope, W_RopeObject if space.config.objspace.std.sharesmallstr: if space.config.objspace.std.withprebuiltchar: # share characters and empty string if len(s) <= 1: if len(s) == 0: if space.config.objspace.std.withrope: return W_RopeObject.EMPTY return W_StringObject.EMPTY else: s = s[0] # annotator hint: a single char return wrapchar(space, s) else: # only share the empty string if len(s) == 0: if space.config.objspace.std.withrope: return W_RopeObject.EMPTY return W_StringObject.EMPTY if space.config.objspace.std.withrope: return W_RopeObject(rope.LiteralStringNode(s)) return W_StringObject(s)
def repr__RopeUnicode(space, w_unicode): hexdigits = "0123456789abcdef" node = w_unicode._node size = node.length() singlequote = doublequote = False iter = rope.ItemIterator(node) for i in range(size): c = iter.nextunichar() if singlequote and doublequote: break if c == u'\'': singlequote = True elif c == u'"': doublequote = True if singlequote and not doublequote: quote = '"' else: quote = '\'' result = ['u', quote] iter = rope.ItemIterator(node) j = 0 while j < size: code = iter.nextint() if code >= 0x10000: result.extend([ '\\', "U", hexdigits[(code >> 28) & 0xf], hexdigits[(code >> 24) & 0xf], hexdigits[(code >> 20) & 0xf], hexdigits[(code >> 16) & 0xf], hexdigits[(code >> 12) & 0xf], hexdigits[(code >> 8) & 0xf], hexdigits[(code >> 4) & 0xf], hexdigits[(code >> 0) & 0xf], ]) j += 1 continue if code >= 0xD800 and code < 0xDC00: if j < size - 1: code2 = iter.nextint() # XXX this is wrong: if the next if is false, # code2 is lost if code2 >= 0xDC00 and code2 <= 0xDFFF: code = (((code & 0x03FF) << 10) | (code2 & 0x03FF)) + 0x00010000 result.extend([ '\\', "U", hexdigits[(code >> 28) & 0xf], hexdigits[(code >> 24) & 0xf], hexdigits[(code >> 20) & 0xf], hexdigits[(code >> 16) & 0xf], hexdigits[(code >> 12) & 0xf], hexdigits[(code >> 8) & 0xf], hexdigits[(code >> 4) & 0xf], hexdigits[(code >> 0) & 0xf], ]) j += 2 continue if code >= 0x100: result.extend([ '\\', "u", hexdigits[(code >> 12) & 0xf], hexdigits[(code >> 8) & 0xf], hexdigits[(code >> 4) & 0xf], hexdigits[(code >> 0) & 0xf], ]) j += 1 continue if code == ord('\\') or code == ord(quote): result.append('\\') result.append(chr(code)) j += 1 continue if code == ord('\t'): result.append('\\') result.append('t') j += 1 continue if code == ord('\r'): result.append('\\') result.append('r') j += 1 continue if code == ord('\n'): result.append('\\') result.append('n') j += 1 continue if code < ord(' ') or code >= 0x7f: result.extend([ '\\', "x", hexdigits[(code >> 4) & 0xf], hexdigits[(code >> 0) & 0xf], ]) j += 1 continue result.append(chr(code)) j += 1 result.append(quote) return W_RopeObject(rope.rope_from_charlist(result))