13#include "nuitka/prelude.h"
16#if PYTHON_VERSION >= 0x300
17PyObject *SELECT_METACLASS(PyThreadState *tstate, PyObject *metaclass, PyObject *bases) {
18 CHECK_OBJECT(metaclass);
21 if (likely(PyType_Check(metaclass))) {
23 Py_ssize_t nbases = PyTuple_GET_SIZE(bases);
24 PyTypeObject *winner = (PyTypeObject *)metaclass;
27 PRINT_STRING(
"Bases:");
28 PRINT_ITEM((PyObject *)bases);
32 for (
int i = 0; i < nbases; i++) {
33 PyObject *base = PyTuple_GET_ITEM(bases, i);
35 PyTypeObject *base_type = Py_TYPE(base);
37 if (Nuitka_Type_IsSubtype(winner, base_type)) {
40 }
else if (Nuitka_Type_IsSubtype(base_type, winner)) {
45 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
46 "metaclass conflict: the metaclass of a derived class must be a "
47 "(non-strict) subclass of the metaclasses of all its bases");
53 if (unlikely(winner == NULL)) {
58 PRINT_STRING(
"Metaclass winner:");
59 PRINT_ITEM((PyObject *)winner);
64 return (PyObject *)winner;
67 PRINT_STRING(
"Metaclass not a type is used:");
68 PRINT_ITEM((PyObject *)metaclass);