]> granicus.if.org Git - python/commitdiff
Charles Waldman writes:
authorGuido van Rossum <guido@python.org>
Fri, 21 Apr 2000 20:49:36 +0000 (20:49 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 21 Apr 2000 20:49:36 +0000 (20:49 +0000)
"""
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

index ecf941d195f0fe5c01e84da7d8a76bcdedbd457a..aa2c7cba08d2a05b72632a8f0cb5ea9d8148e31f 100644 (file)
@@ -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;