Commit 83addc7a authored by Guido van Rossum's avatar Guido van Rossum

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.
"""
parent 2dd8ddde
...@@ -2151,19 +2151,18 @@ newPicklerobject(PyObject *file, int bin) { ...@@ -2151,19 +2151,18 @@ newPicklerobject(PyObject *file, int bin) {
Py_INCREF(file); Py_INCREF(file);
else else
file=Pdata_New(); file=Pdata_New();
UNLESS (self->file = file)
goto err;
self->file = file; UNLESS (self->memo = PyDict_New())
goto err;
UNLESS (self->memo = PyDict_New()) {
Py_XDECREF((PyObject *)self);
return NULL;
}
if (PyFile_Check(file)) { if (PyFile_Check(file)) {
self->fp = PyFile_AsFile(file); self->fp = PyFile_AsFile(file);
if (self->fp == NULL) { if (self->fp == NULL) {
PyErr_SetString(PyExc_IOError, "output file closed"); PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
return NULL; goto err;
} }
self->write_func = write_file; self->write_func = write_file;
} }
...@@ -4054,10 +4053,8 @@ newUnpicklerobject(PyObject *f) { ...@@ -4054,10 +4053,8 @@ newUnpicklerobject(PyObject *f) {
self->safe_constructors = NULL; self->safe_constructors = NULL;
self->find_class = NULL; self->find_class = NULL;
UNLESS (self->memo = PyDict_New()) { UNLESS (self->memo = PyDict_New())
Py_XDECREF((PyObject *)self); goto err;
return NULL;
}
Py_INCREF(f); Py_INCREF(f);
self->file = f; self->file = f;
...@@ -4066,8 +4063,8 @@ newUnpicklerobject(PyObject *f) { ...@@ -4066,8 +4063,8 @@ newUnpicklerobject(PyObject *f) {
if (PyFile_Check(f)) { if (PyFile_Check(f)) {
self->fp = PyFile_AsFile(f); self->fp = PyFile_AsFile(f);
if (self->fp == NULL) { if (self->fp == NULL) {
PyErr_SetString(PyExc_IOError, "input file closed"); PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
return NULL; goto err;
} }
self->read_func = read_file; self->read_func = read_file;
self->readline_func = readline_file; self->readline_func = readline_file;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment