[Python-checkins] CVS: python/dist/src/Modules cPickle.c,2.73,2.73.2.1
Guido van Rossum
gvanrossum@users.sourceforge.net
Fri, 21 Dec 2001 07:26:08 -0800
Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv1502
Modified Files:
Tag: release22-branch
cPickle.c
Log Message:
We go down 2000 recursion levels before we start getting suspicious
about recursive data structures in 'fast' mode. Jack is reporting
mysterious crashes in test_cpickle that could easily be stack
overflows (and test_cpickle exercises the limit).
Let's make the limit 50, but configurable by defining
PY_CPICKLE_FAST_LIMIT when cPickle is compiled.
Note that even the most hairy nested data structures don't nest this
deep, *except* when you use Python object references to implement
linked lists. So this shouldn't slow down the performance of fast
pickling, I think.
Index: cPickle.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/cPickle.c,v
retrieving revision 2.73
retrieving revision 2.73.2.1
diff -C2 -d -r2.73 -r2.73.2.1
*** cPickle.c 2001/12/19 16:56:54 2.73
--- cPickle.c 2001/12/21 15:26:05 2.73.2.1
***************
*** 322,326 ****
} Picklerobject;
! #define FAST_LIMIT 2000
staticforward PyTypeObject Picklertype;
--- 322,328 ----
} Picklerobject;
! #ifndef PY_CPICKLE_FAST_LIMIT
! #define PY_CPICKLE_FAST_LIMIT 50
! #endif
staticforward PyTypeObject Picklertype;
***************
*** 892,896 ****
{
/* if fast_container < 0, we're doing an error exit. */
! if (++self->fast_container >= FAST_LIMIT) {
PyObject *key = NULL;
if (self->fast_memo == NULL) {
--- 894,898 ----
{
/* if fast_container < 0, we're doing an error exit. */
! if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
PyObject *key = NULL;
if (self->fast_memo == NULL) {
***************
*** 922,926 ****
fast_save_leave(Picklerobject *self, PyObject *obj)
{
! if (self->fast_container-- >= FAST_LIMIT) {
PyObject *key = PyLong_FromVoidPtr(obj);
if (key == NULL)
--- 924,928 ----
fast_save_leave(Picklerobject *self, PyObject *obj)
{
! if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
PyObject *key = PyLong_FromVoidPtr(obj);
if (key == NULL)