From 6bf41e54a42fbe3deee70b8d786096bd6d1d133d Mon Sep 17 00:00:00 2001 From: Alexandre Vassalotti Date: Thu, 28 Nov 2013 15:17:29 -0800 Subject: [PATCH] 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. --- Modules/_pickle.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index bb101186d29..399ad47391f 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; }