6#include "nuitka/prelude.h"
10bool Nuitka_Type_IsSubtype(PyTypeObject *a, PyTypeObject *b) {
14#if PYTHON_VERSION < 0x300
15 if (!(a->tp_flags & Py_TPFLAGS_HAVE_CLASS)) {
16 return b == a || b == &PyBaseObject_Type;
20 PyObject *mro = a->tp_mro;
23 if (likely(mro != NULL)) {
24 assert(PyTuple_Check(mro));
26 Py_ssize_t n = PyTuple_GET_SIZE(mro);
28 for (Py_ssize_t i = 0; i < n; i++) {
29 if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) {
44 return (b == &PyBaseObject_Type);
56int Nuitka_Object_IsSubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls)
59 if (PyType_CheckExact(cls)) {
66 return PyObject_IsSubclass(derived, cls);
70 if (PyTuple_Check(cls)) {
71 if (Py_EnterRecursiveCall(
" in __subclasscheck__")) {
75 Py_ssize_t n = PyTuple_GET_SIZE(cls);
78 for (Py_ssize_t i = 0; i < n; ++i) {
79 PyObject *item = PyTuple_GET_ITEM(cls, i);
81 r = Nuitka_Object_IsSubclass(tstate, derived, item);
88 Py_LeaveRecursiveCall();
94 PyObject *checker = Nuitka_TypeLookup((PyTypeObject *)cls, const_str_plain___subclasscheck__);
96 if (checker != NULL) {
97 descrgetfunc f = Py_TYPE(checker)->tp_descr_get;
102 checker = f(checker, cls, (PyObject *)(Py_TYPE(cls)));
106 if (checker != NULL) {
109 if (Py_EnterRecursiveCall(
" in __subclasscheck__")) {
114 PyObject *res = CALL_FUNCTION_WITH_SINGLE_ARG(checker, derived);
116 Py_LeaveRecursiveCall();
121 ok = CHECK_IF_TRUE(res);
125 }
else if (HAS_ERROR_OCCURRED(tstate)) {
130 return PyObject_IsSubclass(derived, cls);
134getattrofunc PyObject_GenericGetAttr_resolved;
135setattrofunc PyObject_GenericSetAttr_resolved;
139void Nuitka_PyType_Ready(PyTypeObject *type, PyTypeObject *base,
bool generic_get_attr,
bool generic_set_attr,
140 bool self_iter,
bool await_self_iter,
bool await_self_aiter) {
141 assert(type->tp_base == NULL);
143 PyObject_GenericGetAttr_resolved = PyBaseObject_Type.tp_getattro;
144 PyObject_GenericSetAttr_resolved = PyBaseObject_Type.tp_setattro;
146 type->tp_base = base;
148 if (generic_get_attr) {
149 assert(type->tp_getattro == NULL);
150 type->tp_getattro = PyObject_GenericGetAttr_resolved;
153 if (generic_set_attr) {
154 assert(type->tp_setattro == NULL);
155 type->tp_setattro = PyObject_GenericSetAttr_resolved;
159 assert(type->tp_iter == NULL);
160 type->tp_iter = PyObject_SelfIter;
163#if PYTHON_VERSION >= 0x350
164 if (await_self_iter) {
165 assert(type->tp_as_async->am_await == NULL);
166 type->tp_as_async->am_await = PyObject_SelfIter;
169 if (await_self_aiter) {
170 assert(type->tp_as_async->am_aiter == NULL);
171 type->tp_as_async->am_aiter = PyObject_SelfIter;
174 assert(!await_self_iter);
175 assert(!await_self_aiter);
178#if PYTHON_VERSION >= 0x3a0
179 type->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE;
182 NUITKA_MAY_BE_UNUSED
int res = PyType_Ready(type);
186#if PYTHON_VERSION >= 0x3c0
189 PyObject_HEAD PyObject *name;
190 PyObject *type_params;
191 PyObject *compute_value;
196static PyTypeObject *getTypeAliasType(
void) {
197 static PyTypeObject *type_alias_type = NULL;
199 if (type_alias_type == NULL) {
201 PyObject *typing_module = PyImport_ImportModule(
"_typing");
202 CHECK_OBJECT(typing_module);
204 type_alias_type = (PyTypeObject *)PyObject_GetAttrString(typing_module,
"TypeAliasType");
205 CHECK_OBJECT(type_alias_type);
208 return type_alias_type;
211PyObject *MAKE_TYPE_ALIAS(PyObject *name, PyObject *type_params, PyObject *value, PyObject *module_name) {
214 typealiasobject *ta = Nuitka_GC_New(getTypeAliasType());
218 ta->name = Py_NewRef(name);
219 ta->type_params = Py_IsNone(type_params) ? NULL : Py_XNewRef(type_params);
220 ta->compute_value = NULL;
221 ta->value = Py_XNewRef(value);
222 ta->module = Py_NewRef(module_name);
226 return (PyObject *)ta;
230 PyObject_HEAD PyObject *name;
232 PyObject *evaluate_bound;
233 PyObject *constraints;
234 PyObject *evaluate_constraints;
240static typevarobject *_Nuitka_typevar_alloc(PyThreadState *tstate, PyObject *name, PyObject *bound,
241 PyObject *evaluate_bound, PyObject *constraints,
242 PyObject *evaluate_constraints,
bool covariant,
bool contravariant,
243 bool infer_variance, PyObject *module) {
244 PyTypeObject *tp = tstate->interp->cached_objects.typevar_type;
245 typevarobject *result = Nuitka_GC_New(tp);
247 result->name = Py_NewRef(name);
249 result->bound = Py_XNewRef(bound);
250 result->evaluate_bound = Py_XNewRef(evaluate_bound);
251 result->constraints = Py_XNewRef(constraints);
252 result->evaluate_constraints = Py_XNewRef(evaluate_constraints);
254 result->covariant = covariant;
255 result->contravariant = contravariant;
256 result->infer_variance = infer_variance;
258 Nuitka_GC_Track(result);
261 if (unlikely(module != NULL)) {
262 if (PyObject_SetAttrString((PyObject *)result,
"__module__", module) < 0) {
271PyObject *MAKE_TYPE_VAR(PyThreadState *tstate, PyObject *name) {
275 return (PyObject *)_Nuitka_typevar_alloc(tstate, name, NULL, NULL, NULL, NULL,
false,
false,
true, NULL);
278static PyTypeObject *_getTypeGenericAliasType(
void) {
279 static PyTypeObject *type_generic_alias_type = NULL;
281 if (type_generic_alias_type == NULL) {
283 PyObject *typing_module = PyImport_ImportModule(
"_typing");
284 CHECK_OBJECT(typing_module);
286 type_generic_alias_type = (PyTypeObject *)PyObject_GetAttrString(typing_module,
"_GenericAlias");
287 CHECK_OBJECT(type_generic_alias_type);
290 return type_generic_alias_type;
293static PyObject *_Nuitka_unpack_typevartuples(PyObject *params) {
294 assert(PyTuple_Check(params));
298 return Py_NewRef(params);
301PyObject *MAKE_TYPE_GENERIC(PyThreadState *tstate, PyObject *params) {
302 CHECK_OBJECT(params);
303 PyObject *unpacked_params = _Nuitka_unpack_typevartuples(params);
304 CHECK_OBJECT(unpacked_params);
306 PyObject *args[2] = {(PyObject *)tstate->interp->cached_objects.generic_type, unpacked_params};
308 PyObject *called = (PyObject *)_getTypeGenericAliasType();
310 PyObject *result = CALL_FUNCTION_WITH_ARGS2(tstate, called, args);
311 Py_DECREF(unpacked_params);