From e5ea439bc8f1a5a77fa0ee2c1d11b7a0ada83e9e Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 8 Apr 2002 01:39:56 +0000 Subject: - 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. --- Misc/NEWS | 5 +++++ Objects/typeobject.c | 12 ++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 5098898..fc3902b 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 5ec5784..158c0ed 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) { -- cgit v0.12