From 83addc7a0f7371ccb28c5fd3b090556b505d8a69 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 21 Apr 2000 20:49:36 +0000 Subject: [PATCH] Charles Waldman writes: """ Problem description: Run the following script: import test.test_cpickle for x in xrange(1000000): reload(test.test_cpickle) Watch Python's memory use go up up and away! In the course of debugging this I also saw that cPickle is inconsistent with pickle - if you attempt a pickle.load or pickle.dump on a closed file, you get a ValueError, whereas the corresponding cPickle operations give an IOError. Since cPickle is advertised as being compatible with pickle, I changed these exceptions to match. """ --- Modules/cPickle.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/Modules/cPickle.c b/Modules/cPickle.c index ecf941d195f..aa2c7cba08d 100644 --- a/Modules/cPickle.c +++ b/Modules/cPickle.c @@ -2151,19 +2151,18 @@ newPicklerobject(PyObject *file, int bin) { Py_INCREF(file); else file=Pdata_New(); + + UNLESS (self->file = file) + goto err; - self->file = file; - - UNLESS (self->memo = PyDict_New()) { - Py_XDECREF((PyObject *)self); - return NULL; - } + UNLESS (self->memo = PyDict_New()) + goto err; if (PyFile_Check(file)) { self->fp = PyFile_AsFile(file); if (self->fp == NULL) { - PyErr_SetString(PyExc_IOError, "output file closed"); - return NULL; + PyErr_SetString(PyExc_ValueError, "I/O operation on closed file"); + goto err; } self->write_func = write_file; } @@ -4054,10 +4053,8 @@ newUnpicklerobject(PyObject *f) { self->safe_constructors = NULL; self->find_class = NULL; - UNLESS (self->memo = PyDict_New()) { - Py_XDECREF((PyObject *)self); - return NULL; - } + UNLESS (self->memo = PyDict_New()) + goto err; Py_INCREF(f); self->file = f; @@ -4066,8 +4063,8 @@ newUnpicklerobject(PyObject *f) { if (PyFile_Check(f)) { self->fp = PyFile_AsFile(f); if (self->fp == NULL) { - PyErr_SetString(PyExc_IOError, "input file closed"); - return NULL; + PyErr_SetString(PyExc_ValueError, "I/O operation on closed file"); + goto err; } self->read_func = read_file; self->readline_func = readline_file;