Kaydet (Commit) b0e1f8b3 authored tarafından Antoine Pitrou's avatar Antoine Pitrou

Issue #13503: Use a more efficient reduction format for bytearrays with

pickle protocol >= 3.  The old reduction format is kept with older
protocols in order to allow unpickling under Python 2.

Patch by Irmen de Jong.
üst 3731142e
...@@ -10,6 +10,10 @@ What's New in Python 3.3 Alpha 1? ...@@ -10,6 +10,10 @@ What's New in Python 3.3 Alpha 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #13503: Use a more efficient reduction format for bytearrays with
pickle protocol >= 3. The old reduction format is kept with older protocols
in order to allow unpickling under Python 2. Patch by Irmen de Jong.
- Issue #7111: Python can now be run without a stdin, stdout or stderr - Issue #7111: Python can now be run without a stdin, stdout or stderr
stream. It was already the case with Python 2. However, the corresponding stream. It was already the case with Python 2. However, the corresponding
sys module entries are now set to None (instead of an unusable file object). sys module entries are now set to None (instead of an unusable file object).
......
...@@ -2725,20 +2725,13 @@ bytearray_fromhex(PyObject *cls, PyObject *args) ...@@ -2725,20 +2725,13 @@ bytearray_fromhex(PyObject *cls, PyObject *args)
return NULL; return NULL;
} }
PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
static PyObject * static PyObject *
bytearray_reduce(PyByteArrayObject *self) _common_reduce(PyByteArrayObject *self, int proto)
{ {
PyObject *latin1, *dict; PyObject *dict;
_Py_IDENTIFIER(__dict__); _Py_IDENTIFIER(__dict__);
if (self->ob_bytes)
latin1 = PyUnicode_DecodeLatin1(self->ob_bytes,
Py_SIZE(self), NULL);
else
latin1 = PyUnicode_FromString("");
dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__); dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
if (dict == NULL) { if (dict == NULL) {
PyErr_Clear(); PyErr_Clear();
...@@ -2746,7 +2739,45 @@ bytearray_reduce(PyByteArrayObject *self) ...@@ -2746,7 +2739,45 @@ bytearray_reduce(PyByteArrayObject *self)
Py_INCREF(dict); Py_INCREF(dict);
} }
return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict); if (proto < 3) {
/* use str based reduction for backwards compatibility with Python 2.x */
PyObject *latin1;
if (self->ob_bytes)
latin1 = PyUnicode_DecodeLatin1(self->ob_bytes, Py_SIZE(self), NULL);
else
latin1 = PyUnicode_FromString("");
return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
}
else {
/* use more efficient byte based reduction */
if (self->ob_bytes) {
return Py_BuildValue("(O(y#)N)", Py_TYPE(self), self->ob_bytes, Py_SIZE(self), dict);
}
else {
return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
}
}
}
PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
static PyObject *
bytearray_reduce(PyByteArrayObject *self)
{
return _common_reduce(self, 2);
}
PyDoc_STRVAR(reduce_ex_doc, "Return state information for pickling.");
static PyObject *
bytearray_reduce_ex(PyByteArrayObject *self, PyObject *args)
{
int proto = 0;
if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
return NULL;
return _common_reduce(self, proto);
} }
PyDoc_STRVAR(sizeof_doc, PyDoc_STRVAR(sizeof_doc,
...@@ -2790,6 +2821,7 @@ static PyMethodDef ...@@ -2790,6 +2821,7 @@ static PyMethodDef
bytearray_methods[] = { bytearray_methods[] = {
{"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc}, {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
{"__reduce__", (PyCFunction)bytearray_reduce, METH_NOARGS, reduce_doc}, {"__reduce__", (PyCFunction)bytearray_reduce, METH_NOARGS, reduce_doc},
{"__reduce_ex__", (PyCFunction)bytearray_reduce_ex, METH_VARARGS, reduce_ex_doc},
{"__sizeof__", (PyCFunction)bytearray_sizeof, METH_NOARGS, sizeof_doc}, {"__sizeof__", (PyCFunction)bytearray_sizeof, METH_NOARGS, sizeof_doc},
{"append", (PyCFunction)bytearray_append, METH_O, append__doc__}, {"append", (PyCFunction)bytearray_append, METH_O, append__doc__},
{"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS, {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
......
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