]> granicus.if.org Git - python/commitdiff
save(): Fix for SF bug #494904: Cannot pickle a class with a
authorGuido van Rossum <guido@python.org>
Wed, 19 Dec 2001 16:56:54 +0000 (16:56 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 19 Dec 2001 16:56:54 +0000 (16:56 +0000)
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

index 425ff10bb0eae21acd9fedc8b01306351ab34dd5..a4943ce8211eb44f125adb72ef38d05887d7ec80 100644 (file)
@@ -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;