Real pickling for bytes.
Restore complex pickling.
Use cPickle in io.py.
diff --git a/Lib/copy_reg.py b/Lib/copy_reg.py
index 8760e62..f4661ed 100644
--- a/Lib/copy_reg.py
+++ b/Lib/copy_reg.py
@@ -23,12 +23,18 @@
if not callable(object):
raise TypeError("constructors must be callable")
-# Example: provide pickling support for bytes objects.
+# Example: provide pickling support for complex numbers.
-def _pickle_bytes(b):
- return bytes, (str(b),)
+try:
+ complex
+except NameError:
+ pass
+else:
-pickle(bytes, _pickle_bytes)
+ def pickle_complex(c):
+ return complex, (c.real, c.imag)
+
+ pickle(complex, pickle_complex, complex)
# Support for pickling new-style objects
diff --git a/Lib/io.py b/Lib/io.py
index b2860f4..fd39826 100644
--- a/Lib/io.py
+++ b/Lib/io.py
@@ -30,10 +30,14 @@
import os
import sys
import codecs
-import pickle
import _fileio
import warnings
+try:
+ import cPickle as pickle
+except ImportError:
+ import pickle
+
# XXX Shouldn't we use st_blksize whenever we can?
DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index d985fc7..be3da7a 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -2598,6 +2598,17 @@
return NULL;
}
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
+static PyObject *
+bytes_reduce(PyBytesObject *self)
+{
+ return Py_BuildValue("(O(s#))",
+ self->ob_type,
+ self->ob_bytes == NULL ? "" : self->ob_bytes,
+ self->ob_size);
+}
+
static PySequenceMethods bytes_as_sequence = {
(lenfunc)bytes_length, /* sq_length */
(binaryfunc)bytes_concat, /* sq_concat */
@@ -2650,8 +2661,10 @@
{"remove", (PyCFunction)bytes_remove, METH_O, remove__doc__},
{"decode", (PyCFunction)bytes_decode, METH_VARARGS, decode_doc},
{"__alloc__", (PyCFunction)bytes_alloc, METH_NOARGS, alloc_doc},
- {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS, fromhex_doc},
+ {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS,
+ fromhex_doc},
{"join", (PyCFunction)bytes_join, METH_O|METH_CLASS, join_doc},
+ {"__reduce__", (PyCFunction)bytes_reduce, METH_NOARGS, reduce_doc},
{NULL}
};