From: Guido van Rossum Date: Mon, 8 Apr 2002 01:39:56 +0000 (+0000) Subject: - A type can now inherit its metatype from its base type. Previously, X-Git-Tag: v2.2.1~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e5ea439bc8f1a5a77fa0ee2c1d11b7a0ada83e9e;p=thirdparty%2FPython%2Fcpython.git - A type can now inherit its metatype from its base type. Previously, when PyType_Ready() was called, if ob_type was found to be NULL, it was always set to &PyType_Type; now it is set to base->ob_type, where base is tp_base, defaulting to &PyObject_Type. --- diff --git a/Misc/NEWS b/Misc/NEWS index 5098898e8093..fc3902bd348c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -20,6 +20,11 @@ Library C API +- A type can now inherit its metatype from its base type. Previously, + when PyType_Ready() was called, if ob_type was found to be NULL, it + was always set to &PyType_Type; now it is set to base->ob_type, + where base is tp_base, defaulting to &PyObject_Type. + - PyType_Ready() accidentally did not inherit tp_is_gc; now it does. Windows diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 5ec5784c94e3..158c0ed1f648 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2002,17 +2002,17 @@ PyType_Ready(PyTypeObject *type) 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) */ base = type->tp_base; if (base == NULL && type != &PyBaseObject_Type) base = type->tp_base = &PyBaseObject_Type; + /* 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 = base->ob_type; + /* Initialize tp_bases */ bases = type->tp_bases; if (bases == NULL) {