diff -r 42f3be6cf29e Lib/pickle.py --- a/Lib/pickle.py Tue May 12 00:15:05 2015 -0400 +++ b/Lib/pickle.py Tue May 12 12:07:23 2015 +0300 @@ -691,7 +691,28 @@ class _Pickler: self.memoize(obj) dispatch[bytes] = save_bytes + def save_oldstr(self, obj): + if self.bin: + n = len(obj) + if n < 256: + self.write(SHORT_BINSTRING + pack("bin) { + const char string_op = STRING; + + if (!(repr = PyObject_ASCII(obj))) + return -1; + assert(PyUnicode_Check(repr)); + assert(PyUnicode_IS_ASCII(repr)); + + data = PyUnicode_AsUTF8AndSize(repr, &size); + if (data == NULL) + goto err; + if (_Pickler_Write(self, &string_op, 1) < 0) + goto err; + if (_Pickler_Write(self, data, size) < 0) + goto err; + if (_Pickler_Write(self, "\n", 1) < 0) + goto err; + + Py_DECREF(repr); + } + else { + Py_ssize_t len; + char header[5]; + + data = PyUnicode_AsUTF8AndSize(obj, &size); + if (size < 256) { + header[0] = SHORT_BINSTRING; + header[1] = size; + len = 2; + } + else { + assert(size <= 0x7fffffffL); + header[0] = BINSTRING; + header[1] = (unsigned char)(size & 0xff); + header[2] = (unsigned char)((size >> 8) & 0xff); + header[3] = (unsigned char)((size >> 16) & 0xff); + header[4] = (unsigned char)((size >> 24) & 0xff); + len = 5; + } + + if (_Pickler_Write(self, header, len) < 0) + return -1; + if (_Pickler_Write(self, data, size) < 0) + return -1; + } + + return 0; + + err: + Py_XDECREF(repr); + return -1; +} + +static int save_unicode(PicklerObject *self, PyObject *obj) { - if (self->bin) { + if (self->fix_imports && self->proto < 3 && + PyUnicode_IS_ASCII(obj) && PyUnicode_GET_LENGTH(obj) <= 0x7fffffffL) { + if (save_oldstr(self, obj) < 0) + return -1; + } + else if (self->bin) { if (write_unicode_binary(self, obj) < 0) return -1; }