diff options
author | Jeremy Hylton <jeremy@alum.mit.edu> | 2003-04-09 21:05:12 (GMT) |
---|---|---|
committer | Jeremy Hylton <jeremy@alum.mit.edu> | 2003-04-09 21:05:12 (GMT) |
commit | 4cf6319cd27c73d0d962ec9bc6011ff0acab3b29 (patch) | |
tree | def4da5b247769342a9c2dd6f8c2c17fbe34c260 /Modules/cPickle.c | |
parent | d06483c2f680164093a7d8f0eaef7edc1fa35d10 (diff) | |
download | cpython-4cf6319cd27c73d0d962ec9bc6011ff0acab3b29.zip cpython-4cf6319cd27c73d0d962ec9bc6011ff0acab3b29.tar.gz cpython-4cf6319cd27c73d0d962ec9bc6011ff0acab3b29.tar.bz2 |
Make Picklers collectable.
Bug fix candidate.
Diffstat (limited to 'Modules/cPickle.c')
-rw-r--r-- | Modules/cPickle.c | 50 |
1 files changed, 45 insertions, 5 deletions
diff --git a/Modules/cPickle.c b/Modules/cPickle.c index 85bcc6c..aef6b3e 100644 --- a/Modules/cPickle.c +++ b/Modules/cPickle.c @@ -2724,7 +2724,7 @@ newPicklerobject(PyObject *file, int proto) return NULL; } - self = PyObject_New(Picklerobject, &Picklertype); + self = PyObject_GC_New(Picklerobject, &Picklertype); if (self == NULL) return NULL; self->proto = proto; @@ -2807,6 +2807,7 @@ newPicklerobject(PyObject *file, int proto) self->dispatch_table = dispatch_table; Py_INCREF(dispatch_table); } + PyObject_GC_Track(self); return self; @@ -2842,6 +2843,7 @@ get_Pickler(PyObject *self, PyObject *args) static void Pickler_dealloc(Picklerobject *self) { + PyObject_GC_UnTrack(self); Py_XDECREF(self->write); Py_XDECREF(self->memo); Py_XDECREF(self->fast_memo); @@ -2851,7 +2853,45 @@ Pickler_dealloc(Picklerobject *self) Py_XDECREF(self->inst_pers_func); Py_XDECREF(self->dispatch_table); PyMem_Free(self->write_buf); - PyObject_Del(self); + PyObject_GC_Del(self); +} + +static int +Pickler_traverse(Picklerobject *self, visitproc visit, void *arg) +{ + int err; +#define VISIT(SLOT) \ + if (SLOT) { \ + err = visit((PyObject *)(SLOT), arg); \ + if (err) \ + return err; \ + } + VISIT(self->write); + VISIT(self->memo); + VISIT(self->fast_memo); + VISIT(self->arg); + VISIT(self->file); + VISIT(self->pers_func); + VISIT(self->inst_pers_func); + VISIT(self->dispatch_table); +#undef VISIT + return 0; +} + +static int +Pickler_clear(Picklerobject *self) +{ +#define CLEAR(SLOT) Py_XDECREF(SLOT); SLOT = NULL; + CLEAR(self->write); + CLEAR(self->memo); + CLEAR(self->fast_memo); + CLEAR(self->arg); + CLEAR(self->file); + CLEAR(self->pers_func); + CLEAR(self->inst_pers_func); + CLEAR(self->dispatch_table); +#undef CLEAR + return 0; } static PyObject * @@ -2967,10 +3007,10 @@ static PyTypeObject Picklertype = { PyObject_GenericGetAttr, /* tp_getattro */ PyObject_GenericSetAttr, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, Picklertype__doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ + (traverseproc)Pickler_traverse, /* tp_traverse */ + (inquiry)Pickler_clear, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ |