[Python-3000-checkins] r64925 - python/branches/py3k/Modules/_pickle.c

alexandre.vassalotti python-3000-checkins at python.org
Sun Jul 13 20:48:30 CEST 2008


Author: alexandre.vassalotti
Date: Sun Jul 13 20:48:30 2008
New Revision: 64925

Log:
Fixed _pickle to use Py_EnterRecursiveCall().


Modified:
   python/branches/py3k/Modules/_pickle.c

Modified: python/branches/py3k/Modules/_pickle.c
==============================================================================
--- python/branches/py3k/Modules/_pickle.c	(original)
+++ python/branches/py3k/Modules/_pickle.c	Sun Jul 13 20:48:30 2008
@@ -304,9 +304,6 @@
     PyObject *arg;
     int proto;                  /* Pickle protocol number, >= 0 */
     int bin;                    /* Boolean, true if proto > 0 */
-    int nesting;                /* Current nesting level, this is to guard
-                                   save() from going into infinite recursion
-                                   and segfaulting. */
     int buf_size;               /* Size of the current buffered pickle data */
     char *write_buf;            /* Write buffer, this is to avoid calling the
                                    write() method of the output stream too
@@ -2075,12 +2072,8 @@
     PyObject *memo_key = NULL;
     int status = 0;
 
-    /* XXX: Use Py_EnterRecursiveCall()? */
-    if (++self->nesting > Py_GetRecursionLimit()) {
-        PyErr_SetString(PyExc_RuntimeError,
-                        "maximum recursion depth exceeded");
-        goto error;
-    }
+    if (Py_EnterRecursiveCall(" while pickling an object") < 0)
+        return -1;
 
     /* The extra pers_save argument is necessary to avoid calling save_pers()
        on its returned object. */
@@ -2273,7 +2266,7 @@
         status = -1;
     }
   done:
-    self->nesting--;
+    Py_LeaveRecursiveCall();
     Py_XDECREF(memo_key);
     Py_XDECREF(reduce_func);
     Py_XDECREF(reduce_value);
@@ -2440,7 +2433,6 @@
 	self->proto = proto;
 	self->bin = proto > 0;
 	self->arg = NULL;
-    self->nesting = 0;
 	self->fast = 0;
 	self->fast_nesting = 0;
 	self->fast_memo = NULL;


More information about the Python-3000-checkins mailing list