mirror of
https://github.com/python/cpython.git
synced 2025-11-03 19:34:08 +00:00
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.
This commit is contained in:
parent
3731142e19
commit
b0e1f8b38b
2 changed files with 46 additions and 10 deletions
|
|
@ -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)
|
||||||
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)
|
||||||
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
|
||||||
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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue