Backport Guido's checkin 2.171:
Disallow class assignment completely unless both old and new are heap
types. This prevents nonsense like 2.__class__ = bool or
True.__class__ = int.
return -1;
}
new = (PyTypeObject *)value;
+ if (!(new->tp_flags & Py_TPFLAGS_HEAPTYPE) ||
+ !(old->tp_flags & Py_TPFLAGS_HEAPTYPE))
+ {
+ PyErr_Format(PyExc_TypeError,
+ "__class__ assignment: only for heap types");
+ return -1;
+ }
newbase = new;
oldbase = old;
while (equiv_structs(newbase, newbase->tp_base))
old->tp_name);
return -1;
}
- if (new->tp_flags & Py_TPFLAGS_HEAPTYPE) {
- Py_INCREF(new);
- }
+ Py_INCREF(new);
self->ob_type = new;
- if (old->tp_flags & Py_TPFLAGS_HEAPTYPE) {
- Py_DECREF(old);
- }
+ Py_DECREF(old);
return 0;
}