summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandre Vassalotti <alexandre@peadrop.com>2013-11-28 23:17:29 (GMT)
committerAlexandre Vassalotti <alexandre@peadrop.com>2013-11-28 23:17:29 (GMT)
commit6bf41e54a42fbe3deee70b8d786096bd6d1d133d (patch)
tree83ffa377600c2d0e71b54d68d7d5fee71b29c534
parentb13e6bcbd851c61af22c44dbe6f156653f54baae (diff)
downloadcpython-6bf41e54a42fbe3deee70b8d786096bd6d1d133d.zip
cpython-6bf41e54a42fbe3deee70b8d786096bd6d1d133d.tar.gz
cpython-6bf41e54a42fbe3deee70b8d786096bd6d1d133d.tar.bz2
Remove explicit empty tuple reuse in cpickle.
PyTuple_New(0) always returns the same empty tuple from its free list anyway, so we are not saving much here. Plus, the code where this was used is on uncommon run paths.
-rw-r--r--Modules/_pickle.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index bb10118..399ad47 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -166,9 +166,6 @@ typedef struct {
/* codecs.encode, used for saving bytes in older protocols */
PyObject *codecs_encode;
-
- /* As the name says, an empty tuple. */
- PyObject *empty_tuple;
} PickleState;
/* Forward declaration of the _pickle module definition. */
@@ -205,7 +202,6 @@ _Pickle_ClearState(PickleState *st)
Py_CLEAR(st->name_mapping_3to2);
Py_CLEAR(st->import_mapping_3to2);
Py_CLEAR(st->codecs_encode);
- Py_CLEAR(st->empty_tuple);
}
/* Initialize the given pickle module state. */
@@ -321,10 +317,6 @@ _Pickle_InitState(PickleState *st)
}
Py_CLEAR(codecs);
- st->empty_tuple = PyTuple_New(0);
- if (st->empty_tuple == NULL)
- goto error;
-
return 0;
error:
@@ -1137,8 +1129,9 @@ _Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
return -1;
if (n == READ_WHOLE_LINE) {
- PickleState *st = _Pickle_GetGlobalState();
- data = PyObject_Call(self->readline, st->empty_tuple, NULL);
+ PyObject *empty_tuple = PyTuple_New(0);
+ data = PyObject_Call(self->readline, empty_tuple, NULL);
+ Py_DECREF(empty_tuple);
}
else {
PyObject *len = PyLong_FromSsize_t(n);
@@ -3774,8 +3767,10 @@ save(PicklerObject *self, PyObject *obj, int pers_save)
/* Check for a __reduce__ method. */
reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
if (reduce_func != NULL) {
- reduce_value = PyObject_Call(reduce_func, st->empty_tuple,
+ PyObject *empty_tuple = PyTuple_New(0);
+ reduce_value = PyObject_Call(reduce_func, empty_tuple,
NULL);
+ Py_DECREF(empty_tuple);
}
else {
PyErr_Format(st->PicklingError,
@@ -7412,7 +7407,6 @@ pickle_traverse(PyObject *m, visitproc visit, void *arg)
Py_VISIT(st->name_mapping_3to2);
Py_VISIT(st->import_mapping_3to2);
Py_VISIT(st->codecs_encode);
- Py_VISIT(st->empty_tuple);
return 0;
}