changeset 87631:b44dbf07732e

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.
author Alexandre Vassalotti <alexandre@peadrop.com>
date Thu, 28 Nov 2013 15:17:29 -0800
parents dd51b72cfb52
children d829111a27e5
files Modules/_pickle.c
diffstat 1 files changed, 6 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/Modules/_pickle.c	Thu Nov 28 14:56:09 2013 -0800
+++ b/Modules/_pickle.c	Thu Nov 28 15:17:29 2013 -0800
@@ -166,9 +166,6 @@
 
     /* 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 @@
     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 @@
     }
     Py_CLEAR(codecs);
 
-    st->empty_tuple = PyTuple_New(0);
-    if (st->empty_tuple == NULL)
-        goto error;
-
     return 0;
 
   error:
@@ -1137,8 +1129,9 @@
         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 @@
             /* 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 @@
     Py_VISIT(st->name_mapping_3to2);
     Py_VISIT(st->import_mapping_3to2);
     Py_VISIT(st->codecs_encode);
-    Py_VISIT(st->empty_tuple);
     return 0;
 }