From 950dce6f01039bae5efdb8eedbe9ad48d81d0488 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 19 Dec 2001 16:56:54 +0000 Subject: [PATCH] save(): Fix for SF bug #494904: Cannot pickle a class with a metaclass, reported by Dan Parisien. Objects that are instances of custom metaclasses, i.e. whose ob_type is a subclass of PyType_Type, should be pickled the same as new-style classes (objects whose ob_type is PyType_Type). This can't be done through the existing dispatch switches, and the __reduce__ trick doesn't work for these, since it finds the unbound __reduce__ for instances of the class (inherited from PyBaseObject_Type). So check explicitly using PyType_IsSubtype(). --- Modules/cPickle.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Modules/cPickle.c b/Modules/cPickle.c index 425ff10bb0e..a4943ce8211 100644 --- a/Modules/cPickle.c +++ b/Modules/cPickle.c @@ -1990,6 +1990,11 @@ save(Picklerobject *self, PyObject *args, int pers_save) { } } + if (PyType_IsSubtype(type, &PyType_Type)) { + res = save_global(self, args, NULL); + goto finally; + } + if (!pers_save && self->inst_pers_func) { if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) { res = tmp;