6#include "nuitka/prelude.h"
9#if PYTHON_VERSION < 0x3b0
10PyObject *callPythonFunction(PyObject *func, PyObject *
const *args,
int count) {
11 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
12 PyObject *globals = PyFunction_GET_GLOBALS(func);
13 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
15#if PYTHON_VERSION >= 0x300
16 PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func);
19 if (kwdefs == NULL && argdefs == NULL && co->co_argcount == count &&
20 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
22 if (argdefs == NULL && co->co_argcount == count && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
25 PyThreadState *tstate = PyThreadState_GET();
26 CHECK_OBJECT(globals);
28 PyFrameObject *frame = PyFrame_New(tstate, co, globals, NULL);
30 if (unlikely(frame == NULL)) {
34 for (
int i = 0; i < count; i++) {
35 frame->f_localsplus[i] = args[i];
36 Py_INCREF(frame->f_localsplus[i]);
39#if PYTHON_VERSION < 0x390
40 PyObject *result = PyEval_EvalFrameEx(frame, 0);
42 PyObject *result = _PyEval_EvalFrame(tstate, frame, 0);
46 tstate->recursion_depth++;
48 tstate->recursion_depth--;
53 PyObject **defaults = NULL;
56 if (argdefs != NULL) {
57 defaults = &PyTuple_GET_ITEM(argdefs, 0);
58 num_defaults = (int)(Py_SIZE(argdefs));
61 PyObject *result = PyEval_EvalCodeEx(
62#
if PYTHON_VERSION >= 0x300
75#
if PYTHON_VERSION >= 0x300
78 PyFunction_GET_CLOSURE(func));
83#if PYTHON_VERSION < 0x380 && !defined(_NUITKA_EXPERIMENTAL_DISABLE_UNCOMPILED_FUNCTION_CALL_OPT)
84static PyObject *callPythonFunctionNoArgs(PyObject *func) {
85 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
86 PyObject *globals = PyFunction_GET_GLOBALS(func);
87 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
89#if PYTHON_VERSION >= 0x300
90 PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func);
92 if (kwdefs == NULL && argdefs == NULL && co->co_argcount == 0 &&
93 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
95 if (argdefs == NULL && co->co_argcount == 0 && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
98 PyThreadState *tstate = PyThreadState_GET();
99 CHECK_OBJECT(globals);
101 PyFrameObject *frame = PyFrame_New(tstate, co, globals, NULL);
103 if (unlikely(frame == NULL)) {
107 PyObject *result = PyEval_EvalFrameEx(frame, 0);
111 tstate->recursion_depth++;
113 tstate->recursion_depth--;
118 PyObject **defaults = NULL;
119 int num_defaults = 0;
121 if (argdefs != NULL) {
122 defaults = &PyTuple_GET_ITEM(argdefs, 0);
123 num_defaults = (int)(Py_SIZE(argdefs));
126 PyObject *result = PyEval_EvalCodeEx(
127#
if PYTHON_VERSION >= 0x300
140#
if PYTHON_VERSION >= 0x300
143 PyFunction_GET_CLOSURE(func));
151PyObject *CALL_METHOD_WITH_POS_ARGS(PyThreadState *tstate, PyObject *source, PyObject *attr_name,
152 PyObject *positional_args) {
153 CHECK_OBJECT(source);
154 CHECK_OBJECT(attr_name);
155 CHECK_OBJECT(positional_args);
157#if PYTHON_VERSION < 0x300
158 if (PyInstance_Check(source)) {
159 PyInstanceObject *source_instance = (PyInstanceObject *)source;
163 assert(attr_name != const_str_plain___dict__);
164 assert(attr_name != const_str_plain___class__);
167 PyObject *called_object =
168 GET_STRING_DICT_VALUE((PyDictObject *)source_instance->in_dict, (PyStringObject *)attr_name);
172 if (called_object != NULL) {
173 return CALL_FUNCTION_WITH_POS_ARGS(tstate, called_object, positional_args);
176 called_object = FIND_ATTRIBUTE_IN_CLASS(source_instance->in_class, attr_name);
180 if (called_object != NULL) {
181 descrgetfunc descr_get = Py_TYPE(called_object)->tp_descr_get;
183 if (descr_get == Nuitka_Function_Type.tp_descr_get) {
185 source, &PyTuple_GET_ITEM(positional_args, 0),
186 PyTuple_GET_SIZE(positional_args));
187 }
else if (descr_get != NULL) {
188 PyObject *method = descr_get(called_object, source, (PyObject *)source_instance->in_class);
190 if (unlikely(method == NULL)) {
194 PyObject *result = CALL_FUNCTION_WITH_POS_ARGS(tstate, method, positional_args);
198 return CALL_FUNCTION_WITH_POS_ARGS(tstate, called_object, positional_args);
200 }
else if (unlikely(source_instance->in_class->cl_getattr == NULL)) {
201 PyErr_Format(PyExc_AttributeError,
"%s instance has no attribute '%s'",
202 PyString_AS_STRING(source_instance->in_class->cl_name), PyString_AS_STRING(attr_name));
209 PyObject *args[] = {source, attr_name};
211 called_object = CALL_FUNCTION_WITH_ARGS2(tstate, source_instance->in_class->cl_getattr, args);
213 if (unlikely(called_object == NULL)) {
217 PyObject *result = CALL_FUNCTION_WITH_POS_ARGS(tstate, called_object, positional_args);
218 Py_DECREF(called_object);
224 PyObject *called_object;
226 PyTypeObject *type = Py_TYPE(source);
228 if (type->tp_getattro != NULL) {
229 called_object = (*type->tp_getattro)(source, attr_name);
230 }
else if (type->tp_getattr != NULL) {
231 called_object = (*type->tp_getattr)(source, (
char *)Nuitka_String_AsString_Unchecked(attr_name));
233 SET_CURRENT_EXCEPTION_TYPE0_FORMAT2(PyExc_AttributeError,
"'%s' object has no attribute '%s'",
234 type->tp_name, Nuitka_String_AsString_Unchecked(attr_name));
239 if (unlikely(called_object == NULL)) {
243 PyObject *result = CALL_FUNCTION_WITH_POS_ARGS(tstate, called_object, positional_args);
244 Py_DECREF(called_object);
249char const *GET_CALLABLE_NAME(PyObject *
object) {
250 if (Nuitka_Function_Check(
object)) {
251 return Nuitka_String_AsString(Nuitka_Function_GetName(
object));
252 }
else if (Nuitka_Generator_Check(
object)) {
253 return Nuitka_String_AsString(Nuitka_Generator_GetName(
object));
254 }
else if (PyMethod_Check(
object)) {
255 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(
object));
256 }
else if (PyFunction_Check(
object)) {
257 return Nuitka_String_AsString(((PyFunctionObject *)
object)->func_name);
259#if PYTHON_VERSION < 0x300
260 else if (PyInstance_Check(
object)) {
261 return Nuitka_String_AsString(((PyInstanceObject *)
object)->in_class->cl_name);
262 }
else if (PyClass_Check(
object)) {
263 return Nuitka_String_AsString(((PyClassObject *)
object)->cl_name);
266 else if (PyCFunction_Check(
object)) {
267 return ((PyCFunctionObject *)
object)->m_ml->ml_name;
269 return Py_TYPE(
object)->tp_name;
273char const *GET_CALLABLE_DESC(PyObject *
object) {
274 if (Nuitka_Function_Check(
object) || Nuitka_Generator_Check(
object) || PyMethod_Check(
object) ||
275 PyFunction_Check(
object) || PyCFunction_Check(
object)) {
278#if PYTHON_VERSION < 0x300
279 else if (PyClass_Check(
object)) {
280 return " constructor";
281 }
else if (PyInstance_Check(
object)) {
290char const *GET_CLASS_NAME(PyObject *class_object) {
291 if (class_object == NULL) {
294#if PYTHON_VERSION < 0x300
295 if (PyClass_Check(class_object)) {
296 return Nuitka_String_AsString(((PyClassObject *)class_object)->cl_name);
300 if (!PyType_Check(class_object)) {
301 class_object = (PyObject *)Py_TYPE(class_object);
304 return ((PyTypeObject *)class_object)->tp_name;
308char const *GET_INSTANCE_CLASS_NAME(PyThreadState *tstate, PyObject *instance) {
310 PyObject *class_object = PyObject_GetAttr(instance, const_str_plain___class__);
313 if (class_object == NULL) {
314 CLEAR_ERROR_OCCURRED(tstate);
316 class_object = (PyObject *)Py_TYPE(instance);
317 Py_INCREF(class_object);
320 char const *result = GET_CLASS_NAME(class_object);
322 Py_DECREF(class_object);
327static PyObject *_getTypeAbstractMethods(PyThreadState *tstate, PyTypeObject *type,
void *context) {
328 PyObject *result = DICT_GET_ITEM_WITH_ERROR(tstate, type->tp_dict, const_str_plain___abstractmethods__);
330 if (unlikely(result == NULL)) {
331 if (!HAS_ERROR_OCCURRED(tstate)) {
332 SET_CURRENT_EXCEPTION_TYPE0_VALUE0(tstate, PyExc_AttributeError, const_str_plain___abstractmethods__);
340void formatCannotInstantiateAbstractClass(PyThreadState *tstate, PyTypeObject *type) {
341 PyObject *abstract_methods = _getTypeAbstractMethods(tstate, type, NULL);
342 if (unlikely(abstract_methods == NULL)) {
346 PyObject *sorted_methods = PySequence_List(abstract_methods);
347 Py_DECREF(abstract_methods);
348 if (unlikely(sorted_methods == NULL)) {
351 if (unlikely(PyList_Sort(sorted_methods))) {
352 Py_DECREF(sorted_methods);
355 PyObject *comma = Nuitka_String_FromString(
", ");
357#if PYTHON_VERSION < 0x300
358 PyObject *joined = CALL_METHOD_WITH_SINGLE_ARG(tstate, comma, const_str_plain_join, sorted_methods);
360 char const *joined_str = Nuitka_String_AsString(joined);
361 if (unlikely(joined_str == NULL)) {
366 PyObject *joined = PyUnicode_Join(comma, sorted_methods);
368 Py_DECREF(sorted_methods);
369 if (unlikely(joined == NULL)) {
373 Py_ssize_t method_count = PyList_GET_SIZE(sorted_methods);
375 SET_CURRENT_EXCEPTION_TYPE0_FORMAT3(PyExc_TypeError,
376 "Can't instantiate abstract class %s with abstract method%s %s", type->tp_name,
377 method_count > 1 ?
"s" :
"", Nuitka_String_AsString(joined));
382#include "HelpersCallingGenerated.c"
Definition compiled_function.h:22