Commit a22d5000 authored by Guido van Rossum's avatar Guido van Rossum

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().
parent cef0b49d
......@@ -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;
......
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