mirror of https://github.com/python/cpython
Fix test_pickle, by reverting the string opcodes (S, T, U) to returning
strings, in Latin-1. Bytes are once more pickled through bytes.__reduce__, but now it returns "latin-1" as the second parameter. Unfortunately this breaks datetime pickling. I'll have to investigate further; reverting Martin's changes doesn't seem to help.
This commit is contained in:
parent
00058aa28c
commit
f93254d299
|
@ -506,20 +506,6 @@ class Pickler:
|
||||||
self.memoize(obj)
|
self.memoize(obj)
|
||||||
dispatch[str8] = save_string
|
dispatch[str8] = save_string
|
||||||
|
|
||||||
def save_bytes(self, obj):
|
|
||||||
# Like save_string
|
|
||||||
if self.bin:
|
|
||||||
n = len(obj)
|
|
||||||
if n < 256:
|
|
||||||
self.write(SHORT_BINSTRING + bytes([n]) + bytes(obj))
|
|
||||||
else:
|
|
||||||
self.write(BINSTRING + pack("<i", n) + bytes(obj))
|
|
||||||
else:
|
|
||||||
# Strip leading 'b'
|
|
||||||
self.write(STRING + bytes(repr(obj).lstrip("b")) + b'\n')
|
|
||||||
self.memoize(obj)
|
|
||||||
dispatch[bytes] = save_bytes
|
|
||||||
|
|
||||||
def save_unicode(self, obj, pack=struct.pack):
|
def save_unicode(self, obj, pack=struct.pack):
|
||||||
if self.bin:
|
if self.bin:
|
||||||
encoded = obj.encode('utf-8')
|
encoded = obj.encode('utf-8')
|
||||||
|
@ -945,12 +931,12 @@ class Unpickler:
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
raise ValueError, "insecure string pickle"
|
raise ValueError, "insecure string pickle"
|
||||||
self.append(bytes(codecs.escape_decode(rep)[0]))
|
self.append(str(codecs.escape_decode(rep)[0], "latin-1"))
|
||||||
dispatch[STRING[0]] = load_string
|
dispatch[STRING[0]] = load_string
|
||||||
|
|
||||||
def load_binstring(self):
|
def load_binstring(self):
|
||||||
len = mloads(b'i' + self.read(4))
|
len = mloads(b'i' + self.read(4))
|
||||||
self.append(self.read(len))
|
self.append(str(self.read(len), "latin-1"))
|
||||||
dispatch[BINSTRING[0]] = load_binstring
|
dispatch[BINSTRING[0]] = load_binstring
|
||||||
|
|
||||||
def load_unicode(self):
|
def load_unicode(self):
|
||||||
|
@ -964,7 +950,7 @@ class Unpickler:
|
||||||
|
|
||||||
def load_short_binstring(self):
|
def load_short_binstring(self):
|
||||||
len = ord(self.read(1))
|
len = ord(self.read(1))
|
||||||
self.append(self.read(len))
|
self.append(str(self.read(len), "latin-1"))
|
||||||
dispatch[SHORT_BINSTRING[0]] = load_short_binstring
|
dispatch[SHORT_BINSTRING[0]] = load_short_binstring
|
||||||
|
|
||||||
def load_tuple(self):
|
def load_tuple(self):
|
||||||
|
|
|
@ -2724,13 +2724,11 @@ PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
|
||||||
static PyObject *
|
static PyObject *
|
||||||
bytes_reduce(PyBytesObject *self)
|
bytes_reduce(PyBytesObject *self)
|
||||||
{
|
{
|
||||||
/* XXX: This currently returns a Py_UNICODE-widened string
|
return Py_BuildValue("(O(s#s))",
|
||||||
in the tuple which is completely useless. Pickle stopped
|
|
||||||
using it for that reason. */
|
|
||||||
return Py_BuildValue("(O(s#))",
|
|
||||||
self->ob_type,
|
self->ob_type,
|
||||||
self->ob_bytes == NULL ? "" : self->ob_bytes,
|
self->ob_bytes == NULL ? "" : self->ob_bytes,
|
||||||
self->ob_size);
|
self->ob_size,
|
||||||
|
"latin-1");
|
||||||
}
|
}
|
||||||
|
|
||||||
static PySequenceMethods bytes_as_sequence = {
|
static PySequenceMethods bytes_as_sequence = {
|
||||||
|
|
Loading…
Reference in New Issue