Commit 0dd32e24 authored by Guido van Rossum's avatar Guido van Rossum

Real pickling for bytes.

Restore complex pickling.
Use cPickle in io.py.
parent 0ad0812e
...@@ -23,12 +23,18 @@ def constructor(object): ...@@ -23,12 +23,18 @@ def constructor(object):
if not callable(object): if not callable(object):
raise TypeError("constructors must be callable") raise TypeError("constructors must be callable")
# Example: provide pickling support for bytes objects. # Example: provide pickling support for complex numbers.
def _pickle_bytes(b): try:
return bytes, (str(b),) 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 # Support for pickling new-style objects
......
...@@ -30,10 +30,14 @@ __all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO", ...@@ -30,10 +30,14 @@ __all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO",
import os import os
import sys import sys
import codecs import codecs
import pickle
import _fileio import _fileio
import warnings import warnings
try:
import cPickle as pickle
except ImportError:
import pickle
# XXX Shouldn't we use st_blksize whenever we can? # XXX Shouldn't we use st_blksize whenever we can?
DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes
......
...@@ -2598,6 +2598,17 @@ bytes_fromhex(PyObject *cls, PyObject *args) ...@@ -2598,6 +2598,17 @@ bytes_fromhex(PyObject *cls, PyObject *args)
return NULL; 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 = { static PySequenceMethods bytes_as_sequence = {
(lenfunc)bytes_length, /* sq_length */ (lenfunc)bytes_length, /* sq_length */
(binaryfunc)bytes_concat, /* sq_concat */ (binaryfunc)bytes_concat, /* sq_concat */
...@@ -2650,8 +2661,10 @@ bytes_methods[] = { ...@@ -2650,8 +2661,10 @@ bytes_methods[] = {
{"remove", (PyCFunction)bytes_remove, METH_O, remove__doc__}, {"remove", (PyCFunction)bytes_remove, METH_O, remove__doc__},
{"decode", (PyCFunction)bytes_decode, METH_VARARGS, decode_doc}, {"decode", (PyCFunction)bytes_decode, METH_VARARGS, decode_doc},
{"__alloc__", (PyCFunction)bytes_alloc, METH_NOARGS, alloc_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}, {"join", (PyCFunction)bytes_join, METH_O|METH_CLASS, join_doc},
{"__reduce__", (PyCFunction)bytes_reduce, METH_NOARGS, reduce_doc},
{NULL} {NULL}
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment