mirror of
https://github.com/python/cpython.git
synced 2025-11-13 07:26:31 +00:00
- PyType_Ready(): Initialize the ob_type field to &PyType_Type if it's
NULL, so that you can call PyType_Ready() to initialize a type that is to be separately compiled with C on Windows. inherit_special(): Add a long comment explaining that you have to set tp_new if your base class is PyBaseObject_Type.
This commit is contained in:
parent
facf24bdc7
commit
f884b74910
1 changed files with 16 additions and 0 deletions
|
|
@ -1747,6 +1747,16 @@ inherit_special(PyTypeObject *type, PyTypeObject *base)
|
||||||
type->tp_clear = base->tp_clear;
|
type->tp_clear = base->tp_clear;
|
||||||
}
|
}
|
||||||
if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
|
if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
|
||||||
|
/* The condition below could use some explanation.
|
||||||
|
It appears that tp_new is not inherited for static types
|
||||||
|
whose base class is 'object'; this seems to be a precaution
|
||||||
|
so that old extension types don't suddenly become
|
||||||
|
callable (object.__new__ wouldn't insure the invariants
|
||||||
|
that the extension type's own factory function ensures).
|
||||||
|
Heap types, of course, are under our control, so they do
|
||||||
|
inherit tp_new; static extension types that specify some
|
||||||
|
other built-in type as the default are considered
|
||||||
|
new-style-aware so they also inherit object.__new__. */
|
||||||
if (base != &PyBaseObject_Type ||
|
if (base != &PyBaseObject_Type ||
|
||||||
(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
|
(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
|
||||||
if (type->tp_new == NULL)
|
if (type->tp_new == NULL)
|
||||||
|
|
@ -1940,6 +1950,12 @@ PyType_Ready(PyTypeObject *type)
|
||||||
|
|
||||||
type->tp_flags |= Py_TPFLAGS_READYING;
|
type->tp_flags |= Py_TPFLAGS_READYING;
|
||||||
|
|
||||||
|
/* Initialize ob_type if NULL. This means extensions that want to be
|
||||||
|
compilable separately on Windows can call PyType_Ready() instead of
|
||||||
|
initializing the ob_type field of their type objects. */
|
||||||
|
if (type->ob_type == NULL)
|
||||||
|
type->ob_type = &PyType_Type;
|
||||||
|
|
||||||
/* Initialize tp_base (defaults to BaseObject unless that's us) */
|
/* Initialize tp_base (defaults to BaseObject unless that's us) */
|
||||||
base = type->tp_base;
|
base = type->tp_base;
|
||||||
if (base == NULL && type != &PyBaseObject_Type)
|
if (base == NULL && type != &PyBaseObject_Type)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue