|
|
|
|
|
|
|
#include "nuitka/prelude.h" |
|
|
|
extern PyObject *callPythonFunction( PyObject *func, PyObject **args, int count ); |
|
|
|
|
|
PyObject *CALL_FUNCTION_WITH_ARGS1(PyObject *called, PyObject **args) { |
|
CHECK_OBJECT(called); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 1; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
if (Nuitka_Function_Check(called)) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = (struct Nuitka_FunctionObject *)called; |
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 1 == function->m_args_positional_count){ |
|
for (Py_ssize_t i = 0; i < 1; i++) { |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, args); |
|
} else if (function->m_args_simple && 1 + function->m_defaults_given == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
memcpy(python_pars, args, 1 * sizeof(PyObject *)); |
|
memcpy(python_pars + 1, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 0; i < function->m_args_positional_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsPos(function, python_pars, args, 1)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} else if (Nuitka_Method_Check(called)) { |
|
struct Nuitka_MethodObject *method = (struct Nuitka_MethodObject *)called; |
|
|
|
|
|
if (method->m_object != NULL) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = method->m_function; |
|
|
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 1 + 1 == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
for (Py_ssize_t i = 0; i < 1; i++) { |
|
python_pars[i + 1] = args[i]; |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else if ( function->m_args_simple && 1 + 1 + function->m_defaults_given == function->m_args_positional_count ) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
memcpy(python_pars+1, args, 1 * sizeof(PyObject *)); |
|
memcpy(python_pars+1 + 1, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 1; i < function->m_args_overall_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsMethodPos(function, python_pars, method->m_object, args, 1)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} |
|
} else if (PyCFunction_Check(called)) { |
|
|
|
int flags = PyCFunction_GET_FLAGS(called) & ~(METH_CLASS | METH_STATIC | METH_COEXIST); |
|
|
|
if (flags & METH_NOARGS) { |
|
#if 1 == 0 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, NULL ); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1( |
|
PyExc_TypeError, |
|
"%s() takes no arguments (1 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_O) { |
|
#if 1 == 1 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, args[0]); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1(PyExc_TypeError, |
|
"%s() takes exactly one argument (1 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_VARARGS) { |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 1); |
|
|
|
PyObject *result; |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
#if PYTHON_VERSION < 0x360 |
|
if (flags & METH_KEYWORDS) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#else |
|
if (flags == (METH_VARARGS|METH_KEYWORDS)) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else if (flags == METH_FASTCALL) { |
|
#if PYTHON_VERSION < 0x370 |
|
result = (*(_PyCFunctionFast)method)(self, &PyTuple_GET_ITEM(pos_args, 0), 1, NULL); |
|
#else |
|
result = (*(_PyCFunctionFast)method)(self, &pos_args, 1); |
|
#endif |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#endif |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
Py_DECREF(pos_args); |
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
Py_DECREF(pos_args); |
|
return NULL; |
|
} |
|
} |
|
} else if (PyFunction_Check(called)) { |
|
return callPythonFunction( |
|
called, |
|
args, |
|
1 |
|
); |
|
} |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 1); |
|
|
|
PyObject *result = CALL_FUNCTION(called, pos_args, NULL); |
|
|
|
Py_DECREF(pos_args); |
|
|
|
return result; |
|
} |
|
|
|
PyObject *CALL_FUNCTION_WITH_ARGS2(PyObject *called, PyObject **args) { |
|
CHECK_OBJECT(called); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 2; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
if (Nuitka_Function_Check(called)) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = (struct Nuitka_FunctionObject *)called; |
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 2 == function->m_args_positional_count){ |
|
for (Py_ssize_t i = 0; i < 2; i++) { |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, args); |
|
} else if (function->m_args_simple && 2 + function->m_defaults_given == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
memcpy(python_pars, args, 2 * sizeof(PyObject *)); |
|
memcpy(python_pars + 2, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 0; i < function->m_args_positional_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsPos(function, python_pars, args, 2)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} else if (Nuitka_Method_Check(called)) { |
|
struct Nuitka_MethodObject *method = (struct Nuitka_MethodObject *)called; |
|
|
|
|
|
if (method->m_object != NULL) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = method->m_function; |
|
|
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 2 + 1 == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
for (Py_ssize_t i = 0; i < 2; i++) { |
|
python_pars[i + 1] = args[i]; |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else if ( function->m_args_simple && 2 + 1 + function->m_defaults_given == function->m_args_positional_count ) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
memcpy(python_pars+1, args, 2 * sizeof(PyObject *)); |
|
memcpy(python_pars+1 + 2, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 1; i < function->m_args_overall_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsMethodPos(function, python_pars, method->m_object, args, 2)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} |
|
} else if (PyCFunction_Check(called)) { |
|
|
|
int flags = PyCFunction_GET_FLAGS(called) & ~(METH_CLASS | METH_STATIC | METH_COEXIST); |
|
|
|
if (flags & METH_NOARGS) { |
|
#if 2 == 0 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, NULL ); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1( |
|
PyExc_TypeError, |
|
"%s() takes no arguments (2 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_O) { |
|
#if 2 == 1 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, args[0]); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1(PyExc_TypeError, |
|
"%s() takes exactly one argument (2 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_VARARGS) { |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 2); |
|
|
|
PyObject *result; |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
#if PYTHON_VERSION < 0x360 |
|
if (flags & METH_KEYWORDS) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#else |
|
if (flags == (METH_VARARGS|METH_KEYWORDS)) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else if (flags == METH_FASTCALL) { |
|
#if PYTHON_VERSION < 0x370 |
|
result = (*(_PyCFunctionFast)method)(self, &PyTuple_GET_ITEM(pos_args, 0), 2, NULL); |
|
#else |
|
result = (*(_PyCFunctionFast)method)(self, &pos_args, 2); |
|
#endif |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#endif |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
Py_DECREF(pos_args); |
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
Py_DECREF(pos_args); |
|
return NULL; |
|
} |
|
} |
|
} else if (PyFunction_Check(called)) { |
|
return callPythonFunction( |
|
called, |
|
args, |
|
2 |
|
); |
|
} |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 2); |
|
|
|
PyObject *result = CALL_FUNCTION(called, pos_args, NULL); |
|
|
|
Py_DECREF(pos_args); |
|
|
|
return result; |
|
} |
|
|
|
PyObject *CALL_FUNCTION_WITH_ARGS3(PyObject *called, PyObject **args) { |
|
CHECK_OBJECT(called); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 3; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
if (Nuitka_Function_Check(called)) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = (struct Nuitka_FunctionObject *)called; |
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 3 == function->m_args_positional_count){ |
|
for (Py_ssize_t i = 0; i < 3; i++) { |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, args); |
|
} else if (function->m_args_simple && 3 + function->m_defaults_given == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
memcpy(python_pars, args, 3 * sizeof(PyObject *)); |
|
memcpy(python_pars + 3, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 0; i < function->m_args_positional_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsPos(function, python_pars, args, 3)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} else if (Nuitka_Method_Check(called)) { |
|
struct Nuitka_MethodObject *method = (struct Nuitka_MethodObject *)called; |
|
|
|
|
|
if (method->m_object != NULL) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = method->m_function; |
|
|
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 3 + 1 == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
for (Py_ssize_t i = 0; i < 3; i++) { |
|
python_pars[i + 1] = args[i]; |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else if ( function->m_args_simple && 3 + 1 + function->m_defaults_given == function->m_args_positional_count ) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
memcpy(python_pars+1, args, 3 * sizeof(PyObject *)); |
|
memcpy(python_pars+1 + 3, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 1; i < function->m_args_overall_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsMethodPos(function, python_pars, method->m_object, args, 3)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} |
|
} else if (PyCFunction_Check(called)) { |
|
|
|
int flags = PyCFunction_GET_FLAGS(called) & ~(METH_CLASS | METH_STATIC | METH_COEXIST); |
|
|
|
if (flags & METH_NOARGS) { |
|
#if 3 == 0 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, NULL ); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1( |
|
PyExc_TypeError, |
|
"%s() takes no arguments (3 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_O) { |
|
#if 3 == 1 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, args[0]); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1(PyExc_TypeError, |
|
"%s() takes exactly one argument (3 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_VARARGS) { |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 3); |
|
|
|
PyObject *result; |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
#if PYTHON_VERSION < 0x360 |
|
if (flags & METH_KEYWORDS) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#else |
|
if (flags == (METH_VARARGS|METH_KEYWORDS)) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else if (flags == METH_FASTCALL) { |
|
#if PYTHON_VERSION < 0x370 |
|
result = (*(_PyCFunctionFast)method)(self, &PyTuple_GET_ITEM(pos_args, 0), 3, NULL); |
|
#else |
|
result = (*(_PyCFunctionFast)method)(self, &pos_args, 3); |
|
#endif |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#endif |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
Py_DECREF(pos_args); |
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
Py_DECREF(pos_args); |
|
return NULL; |
|
} |
|
} |
|
} else if (PyFunction_Check(called)) { |
|
return callPythonFunction( |
|
called, |
|
args, |
|
3 |
|
); |
|
} |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 3); |
|
|
|
PyObject *result = CALL_FUNCTION(called, pos_args, NULL); |
|
|
|
Py_DECREF(pos_args); |
|
|
|
return result; |
|
} |
|
|
|
PyObject *CALL_FUNCTION_WITH_ARGS4(PyObject *called, PyObject **args) { |
|
CHECK_OBJECT(called); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 4; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
if (Nuitka_Function_Check(called)) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = (struct Nuitka_FunctionObject *)called; |
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 4 == function->m_args_positional_count){ |
|
for (Py_ssize_t i = 0; i < 4; i++) { |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, args); |
|
} else if (function->m_args_simple && 4 + function->m_defaults_given == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
memcpy(python_pars, args, 4 * sizeof(PyObject *)); |
|
memcpy(python_pars + 4, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 0; i < function->m_args_positional_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsPos(function, python_pars, args, 4)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} else if (Nuitka_Method_Check(called)) { |
|
struct Nuitka_MethodObject *method = (struct Nuitka_MethodObject *)called; |
|
|
|
|
|
if (method->m_object != NULL) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = method->m_function; |
|
|
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 4 + 1 == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
for (Py_ssize_t i = 0; i < 4; i++) { |
|
python_pars[i + 1] = args[i]; |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else if ( function->m_args_simple && 4 + 1 + function->m_defaults_given == function->m_args_positional_count ) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
memcpy(python_pars+1, args, 4 * sizeof(PyObject *)); |
|
memcpy(python_pars+1 + 4, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 1; i < function->m_args_overall_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsMethodPos(function, python_pars, method->m_object, args, 4)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} |
|
} else if (PyCFunction_Check(called)) { |
|
|
|
int flags = PyCFunction_GET_FLAGS(called) & ~(METH_CLASS | METH_STATIC | METH_COEXIST); |
|
|
|
if (flags & METH_NOARGS) { |
|
#if 4 == 0 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, NULL ); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1( |
|
PyExc_TypeError, |
|
"%s() takes no arguments (4 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_O) { |
|
#if 4 == 1 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, args[0]); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1(PyExc_TypeError, |
|
"%s() takes exactly one argument (4 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_VARARGS) { |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 4); |
|
|
|
PyObject *result; |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
#if PYTHON_VERSION < 0x360 |
|
if (flags & METH_KEYWORDS) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#else |
|
if (flags == (METH_VARARGS|METH_KEYWORDS)) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else if (flags == METH_FASTCALL) { |
|
#if PYTHON_VERSION < 0x370 |
|
result = (*(_PyCFunctionFast)method)(self, &PyTuple_GET_ITEM(pos_args, 0), 4, NULL); |
|
#else |
|
result = (*(_PyCFunctionFast)method)(self, &pos_args, 4); |
|
#endif |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#endif |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
Py_DECREF(pos_args); |
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
Py_DECREF(pos_args); |
|
return NULL; |
|
} |
|
} |
|
} else if (PyFunction_Check(called)) { |
|
return callPythonFunction( |
|
called, |
|
args, |
|
4 |
|
); |
|
} |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 4); |
|
|
|
PyObject *result = CALL_FUNCTION(called, pos_args, NULL); |
|
|
|
Py_DECREF(pos_args); |
|
|
|
return result; |
|
} |
|
|
|
PyObject *CALL_FUNCTION_WITH_ARGS5(PyObject *called, PyObject **args) { |
|
CHECK_OBJECT(called); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 5; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
if (Nuitka_Function_Check(called)) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = (struct Nuitka_FunctionObject *)called; |
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 5 == function->m_args_positional_count){ |
|
for (Py_ssize_t i = 0; i < 5; i++) { |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, args); |
|
} else if (function->m_args_simple && 5 + function->m_defaults_given == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
memcpy(python_pars, args, 5 * sizeof(PyObject *)); |
|
memcpy(python_pars + 5, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 0; i < function->m_args_positional_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsPos(function, python_pars, args, 5)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} else if (Nuitka_Method_Check(called)) { |
|
struct Nuitka_MethodObject *method = (struct Nuitka_MethodObject *)called; |
|
|
|
|
|
if (method->m_object != NULL) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = method->m_function; |
|
|
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 5 + 1 == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
for (Py_ssize_t i = 0; i < 5; i++) { |
|
python_pars[i + 1] = args[i]; |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else if ( function->m_args_simple && 5 + 1 + function->m_defaults_given == function->m_args_positional_count ) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
memcpy(python_pars+1, args, 5 * sizeof(PyObject *)); |
|
memcpy(python_pars+1 + 5, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 1; i < function->m_args_overall_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsMethodPos(function, python_pars, method->m_object, args, 5)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} |
|
} else if (PyCFunction_Check(called)) { |
|
|
|
int flags = PyCFunction_GET_FLAGS(called) & ~(METH_CLASS | METH_STATIC | METH_COEXIST); |
|
|
|
if (flags & METH_NOARGS) { |
|
#if 5 == 0 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, NULL ); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1( |
|
PyExc_TypeError, |
|
"%s() takes no arguments (5 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_O) { |
|
#if 5 == 1 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, args[0]); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1(PyExc_TypeError, |
|
"%s() takes exactly one argument (5 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_VARARGS) { |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 5); |
|
|
|
PyObject *result; |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
#if PYTHON_VERSION < 0x360 |
|
if (flags & METH_KEYWORDS) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#else |
|
if (flags == (METH_VARARGS|METH_KEYWORDS)) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else if (flags == METH_FASTCALL) { |
|
#if PYTHON_VERSION < 0x370 |
|
result = (*(_PyCFunctionFast)method)(self, &PyTuple_GET_ITEM(pos_args, 0), 5, NULL); |
|
#else |
|
result = (*(_PyCFunctionFast)method)(self, &pos_args, 5); |
|
#endif |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#endif |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
Py_DECREF(pos_args); |
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
Py_DECREF(pos_args); |
|
return NULL; |
|
} |
|
} |
|
} else if (PyFunction_Check(called)) { |
|
return callPythonFunction( |
|
called, |
|
args, |
|
5 |
|
); |
|
} |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 5); |
|
|
|
PyObject *result = CALL_FUNCTION(called, pos_args, NULL); |
|
|
|
Py_DECREF(pos_args); |
|
|
|
return result; |
|
} |
|
|
|
PyObject *CALL_FUNCTION_WITH_ARGS6(PyObject *called, PyObject **args) { |
|
CHECK_OBJECT(called); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 6; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
if (Nuitka_Function_Check(called)) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = (struct Nuitka_FunctionObject *)called; |
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 6 == function->m_args_positional_count){ |
|
for (Py_ssize_t i = 0; i < 6; i++) { |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, args); |
|
} else if (function->m_args_simple && 6 + function->m_defaults_given == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
memcpy(python_pars, args, 6 * sizeof(PyObject *)); |
|
memcpy(python_pars + 6, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 0; i < function->m_args_positional_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsPos(function, python_pars, args, 6)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} else if (Nuitka_Method_Check(called)) { |
|
struct Nuitka_MethodObject *method = (struct Nuitka_MethodObject *)called; |
|
|
|
|
|
if (method->m_object != NULL) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = method->m_function; |
|
|
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 6 + 1 == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
for (Py_ssize_t i = 0; i < 6; i++) { |
|
python_pars[i + 1] = args[i]; |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else if ( function->m_args_simple && 6 + 1 + function->m_defaults_given == function->m_args_positional_count ) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
memcpy(python_pars+1, args, 6 * sizeof(PyObject *)); |
|
memcpy(python_pars+1 + 6, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 1; i < function->m_args_overall_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsMethodPos(function, python_pars, method->m_object, args, 6)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} |
|
} else if (PyCFunction_Check(called)) { |
|
|
|
int flags = PyCFunction_GET_FLAGS(called) & ~(METH_CLASS | METH_STATIC | METH_COEXIST); |
|
|
|
if (flags & METH_NOARGS) { |
|
#if 6 == 0 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, NULL ); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1( |
|
PyExc_TypeError, |
|
"%s() takes no arguments (6 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_O) { |
|
#if 6 == 1 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, args[0]); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1(PyExc_TypeError, |
|
"%s() takes exactly one argument (6 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_VARARGS) { |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 6); |
|
|
|
PyObject *result; |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
#if PYTHON_VERSION < 0x360 |
|
if (flags & METH_KEYWORDS) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#else |
|
if (flags == (METH_VARARGS|METH_KEYWORDS)) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else if (flags == METH_FASTCALL) { |
|
#if PYTHON_VERSION < 0x370 |
|
result = (*(_PyCFunctionFast)method)(self, &PyTuple_GET_ITEM(pos_args, 0), 6, NULL); |
|
#else |
|
result = (*(_PyCFunctionFast)method)(self, &pos_args, 6); |
|
#endif |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#endif |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
Py_DECREF(pos_args); |
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
Py_DECREF(pos_args); |
|
return NULL; |
|
} |
|
} |
|
} else if (PyFunction_Check(called)) { |
|
return callPythonFunction( |
|
called, |
|
args, |
|
6 |
|
); |
|
} |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 6); |
|
|
|
PyObject *result = CALL_FUNCTION(called, pos_args, NULL); |
|
|
|
Py_DECREF(pos_args); |
|
|
|
return result; |
|
} |
|
|
|
PyObject *CALL_FUNCTION_WITH_ARGS7(PyObject *called, PyObject **args) { |
|
CHECK_OBJECT(called); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 7; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
if (Nuitka_Function_Check(called)) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = (struct Nuitka_FunctionObject *)called; |
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 7 == function->m_args_positional_count){ |
|
for (Py_ssize_t i = 0; i < 7; i++) { |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, args); |
|
} else if (function->m_args_simple && 7 + function->m_defaults_given == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
memcpy(python_pars, args, 7 * sizeof(PyObject *)); |
|
memcpy(python_pars + 7, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 0; i < function->m_args_positional_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsPos(function, python_pars, args, 7)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} else if (Nuitka_Method_Check(called)) { |
|
struct Nuitka_MethodObject *method = (struct Nuitka_MethodObject *)called; |
|
|
|
|
|
if (method->m_object != NULL) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = method->m_function; |
|
|
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 7 + 1 == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
for (Py_ssize_t i = 0; i < 7; i++) { |
|
python_pars[i + 1] = args[i]; |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else if ( function->m_args_simple && 7 + 1 + function->m_defaults_given == function->m_args_positional_count ) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
memcpy(python_pars+1, args, 7 * sizeof(PyObject *)); |
|
memcpy(python_pars+1 + 7, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 1; i < function->m_args_overall_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsMethodPos(function, python_pars, method->m_object, args, 7)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} |
|
} else if (PyCFunction_Check(called)) { |
|
|
|
int flags = PyCFunction_GET_FLAGS(called) & ~(METH_CLASS | METH_STATIC | METH_COEXIST); |
|
|
|
if (flags & METH_NOARGS) { |
|
#if 7 == 0 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, NULL ); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1( |
|
PyExc_TypeError, |
|
"%s() takes no arguments (7 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_O) { |
|
#if 7 == 1 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, args[0]); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1(PyExc_TypeError, |
|
"%s() takes exactly one argument (7 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_VARARGS) { |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 7); |
|
|
|
PyObject *result; |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
#if PYTHON_VERSION < 0x360 |
|
if (flags & METH_KEYWORDS) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#else |
|
if (flags == (METH_VARARGS|METH_KEYWORDS)) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else if (flags == METH_FASTCALL) { |
|
#if PYTHON_VERSION < 0x370 |
|
result = (*(_PyCFunctionFast)method)(self, &PyTuple_GET_ITEM(pos_args, 0), 7, NULL); |
|
#else |
|
result = (*(_PyCFunctionFast)method)(self, &pos_args, 7); |
|
#endif |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#endif |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
Py_DECREF(pos_args); |
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
Py_DECREF(pos_args); |
|
return NULL; |
|
} |
|
} |
|
} else if (PyFunction_Check(called)) { |
|
return callPythonFunction( |
|
called, |
|
args, |
|
7 |
|
); |
|
} |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 7); |
|
|
|
PyObject *result = CALL_FUNCTION(called, pos_args, NULL); |
|
|
|
Py_DECREF(pos_args); |
|
|
|
return result; |
|
} |
|
|
|
PyObject *CALL_FUNCTION_WITH_ARGS8(PyObject *called, PyObject **args) { |
|
CHECK_OBJECT(called); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 8; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
if (Nuitka_Function_Check(called)) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = (struct Nuitka_FunctionObject *)called; |
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 8 == function->m_args_positional_count){ |
|
for (Py_ssize_t i = 0; i < 8; i++) { |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, args); |
|
} else if (function->m_args_simple && 8 + function->m_defaults_given == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
memcpy(python_pars, args, 8 * sizeof(PyObject *)); |
|
memcpy(python_pars + 8, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 0; i < function->m_args_positional_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsPos(function, python_pars, args, 8)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} else if (Nuitka_Method_Check(called)) { |
|
struct Nuitka_MethodObject *method = (struct Nuitka_MethodObject *)called; |
|
|
|
|
|
if (method->m_object != NULL) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = method->m_function; |
|
|
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 8 + 1 == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
for (Py_ssize_t i = 0; i < 8; i++) { |
|
python_pars[i + 1] = args[i]; |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else if ( function->m_args_simple && 8 + 1 + function->m_defaults_given == function->m_args_positional_count ) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
memcpy(python_pars+1, args, 8 * sizeof(PyObject *)); |
|
memcpy(python_pars+1 + 8, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 1; i < function->m_args_overall_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsMethodPos(function, python_pars, method->m_object, args, 8)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} |
|
} else if (PyCFunction_Check(called)) { |
|
|
|
int flags = PyCFunction_GET_FLAGS(called) & ~(METH_CLASS | METH_STATIC | METH_COEXIST); |
|
|
|
if (flags & METH_NOARGS) { |
|
#if 8 == 0 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, NULL ); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1( |
|
PyExc_TypeError, |
|
"%s() takes no arguments (8 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_O) { |
|
#if 8 == 1 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, args[0]); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1(PyExc_TypeError, |
|
"%s() takes exactly one argument (8 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_VARARGS) { |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 8); |
|
|
|
PyObject *result; |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
#if PYTHON_VERSION < 0x360 |
|
if (flags & METH_KEYWORDS) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#else |
|
if (flags == (METH_VARARGS|METH_KEYWORDS)) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else if (flags == METH_FASTCALL) { |
|
#if PYTHON_VERSION < 0x370 |
|
result = (*(_PyCFunctionFast)method)(self, &PyTuple_GET_ITEM(pos_args, 0), 8, NULL); |
|
#else |
|
result = (*(_PyCFunctionFast)method)(self, &pos_args, 8); |
|
#endif |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#endif |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
Py_DECREF(pos_args); |
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
Py_DECREF(pos_args); |
|
return NULL; |
|
} |
|
} |
|
} else if (PyFunction_Check(called)) { |
|
return callPythonFunction( |
|
called, |
|
args, |
|
8 |
|
); |
|
} |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 8); |
|
|
|
PyObject *result = CALL_FUNCTION(called, pos_args, NULL); |
|
|
|
Py_DECREF(pos_args); |
|
|
|
return result; |
|
} |
|
|
|
PyObject *CALL_FUNCTION_WITH_ARGS9(PyObject *called, PyObject **args) { |
|
CHECK_OBJECT(called); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 9; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
if (Nuitka_Function_Check(called)) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = (struct Nuitka_FunctionObject *)called; |
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 9 == function->m_args_positional_count){ |
|
for (Py_ssize_t i = 0; i < 9; i++) { |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, args); |
|
} else if (function->m_args_simple && 9 + function->m_defaults_given == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
memcpy(python_pars, args, 9 * sizeof(PyObject *)); |
|
memcpy(python_pars + 9, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 0; i < function->m_args_positional_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsPos(function, python_pars, args, 9)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} else if (Nuitka_Method_Check(called)) { |
|
struct Nuitka_MethodObject *method = (struct Nuitka_MethodObject *)called; |
|
|
|
|
|
if (method->m_object != NULL) { |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
|
|
struct Nuitka_FunctionObject *function = method->m_function; |
|
|
|
PyObject *result; |
|
|
|
if (function->m_args_simple && 9 + 1 == function->m_args_positional_count) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
for (Py_ssize_t i = 0; i < 9; i++) { |
|
python_pars[i + 1] = args[i]; |
|
Py_INCREF(args[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else if ( function->m_args_simple && 9 + 1 + function->m_defaults_given == function->m_args_positional_count ) { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_positional_count); |
|
#else |
|
PyObject *python_pars[function->m_args_positional_count]; |
|
#endif |
|
python_pars[0] = method->m_object; |
|
Py_INCREF(method->m_object); |
|
|
|
memcpy(python_pars+1, args, 9 * sizeof(PyObject *)); |
|
memcpy(python_pars+1 + 9, &PyTuple_GET_ITEM(function->m_defaults, 0), function->m_defaults_given * sizeof(PyObject *)); |
|
|
|
for (Py_ssize_t i = 1; i < function->m_args_overall_count; i++) { |
|
Py_INCREF(python_pars[i]); |
|
} |
|
|
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
#ifdef _MSC_VER |
|
PyObject **python_pars = (PyObject **)_alloca(sizeof(PyObject *) * function->m_args_overall_count); |
|
#else |
|
PyObject *python_pars[function->m_args_overall_count]; |
|
#endif |
|
memset(python_pars, 0, function->m_args_overall_count * sizeof(PyObject *)); |
|
|
|
if (parseArgumentsMethodPos(function, python_pars, method->m_object, args, 9)) { |
|
result = function->m_c_code(function, python_pars); |
|
} else { |
|
result = NULL; |
|
} |
|
} |
|
|
|
Py_LeaveRecursiveCall(); |
|
|
|
return result; |
|
} |
|
} else if (PyCFunction_Check(called)) { |
|
|
|
int flags = PyCFunction_GET_FLAGS(called) & ~(METH_CLASS | METH_STATIC | METH_COEXIST); |
|
|
|
if (flags & METH_NOARGS) { |
|
#if 9 == 0 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, NULL ); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1( |
|
PyExc_TypeError, |
|
"%s() takes no arguments (9 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_O) { |
|
#if 9 == 1 |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
PyObject *result = (*method)( self, args[0]); |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
return NULL; |
|
} |
|
#else |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT1(PyExc_TypeError, |
|
"%s() takes exactly one argument (9 given)", |
|
((PyCFunctionObject *)called)->m_ml->ml_name |
|
); |
|
return NULL; |
|
#endif |
|
} else if (flags & METH_VARARGS) { |
|
PyCFunction method = PyCFunction_GET_FUNCTION(called); |
|
PyObject *self = PyCFunction_GET_SELF(called); |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 9); |
|
|
|
PyObject *result; |
|
|
|
|
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
if (unlikely(Py_EnterRecursiveCall((char *)" while calling a Python object"))) { |
|
return NULL; |
|
} |
|
#endif |
|
|
|
#if PYTHON_VERSION < 0x360 |
|
if (flags & METH_KEYWORDS) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#else |
|
if (flags == (METH_VARARGS|METH_KEYWORDS)) { |
|
result = (*(PyCFunctionWithKeywords)method)(self, pos_args, NULL); |
|
} else if (flags == METH_FASTCALL) { |
|
#if PYTHON_VERSION < 0x370 |
|
result = (*(_PyCFunctionFast)method)(self, &PyTuple_GET_ITEM(pos_args, 0), 9, NULL); |
|
#else |
|
result = (*(_PyCFunctionFast)method)(self, &pos_args, 9); |
|
#endif |
|
} else { |
|
result = (*method)(self, pos_args); |
|
} |
|
#endif |
|
|
|
#ifdef _NUITKA_FULL_COMPAT |
|
Py_LeaveRecursiveCall(); |
|
#endif |
|
|
|
if (result != NULL) { |
|
|
|
|
|
DROP_ERROR_OCCURRED(); |
|
|
|
Py_DECREF(pos_args); |
|
return result; |
|
} else { |
|
|
|
|
|
if (unlikely(!ERROR_OCCURRED())) { |
|
SET_CURRENT_EXCEPTION_TYPE0_STR( |
|
PyExc_SystemError, |
|
"NULL result without error in PyObject_Call" |
|
); |
|
} |
|
|
|
Py_DECREF(pos_args); |
|
return NULL; |
|
} |
|
} |
|
} else if (PyFunction_Check(called)) { |
|
return callPythonFunction( |
|
called, |
|
args, |
|
9 |
|
); |
|
} |
|
|
|
PyObject *pos_args = MAKE_TUPLE(args, 9); |
|
|
|
PyObject *result = CALL_FUNCTION(called, pos_args, NULL); |
|
|
|
Py_DECREF(pos_args); |
|
|
|
return result; |
|
} |
|
|
|
PyObject *CALL_METHOD_WITH_ARGS1(PyObject *source, PyObject *attr_name, PyObject **args) { |
|
CHECK_OBJECT(source); |
|
CHECK_OBJECT(attr_name); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 1; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
PyTypeObject *type = Py_TYPE(source); |
|
|
|
if (type->tp_getattro == PyObject_GenericGetAttr) { |
|
|
|
if (unlikely(type->tp_dict == NULL)) { |
|
if (unlikely(PyType_Ready(type) < 0)) { |
|
return NULL; |
|
} |
|
} |
|
|
|
PyObject *descr = _PyType_Lookup(type, attr_name); |
|
descrgetfunc func = NULL; |
|
|
|
if (descr != NULL) { |
|
Py_INCREF(descr); |
|
|
|
#if PYTHON_VERSION < 0x300 |
|
if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS)) { |
|
#endif |
|
func = Py_TYPE(descr)->tp_descr_get; |
|
|
|
if (func != NULL && PyDescr_IsData(descr)) { |
|
PyObject *called_object = func(descr, source, (PyObject *)type); |
|
Py_DECREF(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS1( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
#if PYTHON_VERSION < 0x300 |
|
} |
|
#endif |
|
} |
|
|
|
Py_ssize_t dictoffset = type->tp_dictoffset; |
|
PyObject *dict = NULL; |
|
|
|
if (dictoffset != 0) { |
|
|
|
if (dictoffset < 0) { |
|
Py_ssize_t tsize; |
|
size_t size; |
|
|
|
tsize = ((PyVarObject *)source)->ob_size; |
|
if (tsize < 0) { |
|
tsize = -tsize; |
|
} |
|
size = _PyObject_VAR_SIZE( type, tsize ); |
|
|
|
dictoffset += (long)size; |
|
} |
|
|
|
PyObject **dictptr = (PyObject **) ((char *)source + dictoffset); |
|
dict = *dictptr; |
|
} |
|
|
|
if (dict != NULL) { |
|
CHECK_OBJECT(dict); |
|
|
|
Py_INCREF(dict); |
|
|
|
PyObject *called_object = DICT_GET_ITEM1(dict, attr_name); |
|
|
|
if (called_object != NULL) { |
|
Py_XDECREF(descr); |
|
Py_DECREF(dict); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS1( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
|
|
Py_DECREF(dict); |
|
} |
|
|
|
if (func != NULL) { |
|
if (func == Nuitka_Function_Type.tp_descr_get) { |
|
PyObject *result = Nuitka_CallMethodFunctionPosArgs( |
|
(struct Nuitka_FunctionObject const *)descr, |
|
source, |
|
args, |
|
1 |
|
); |
|
|
|
Py_DECREF(descr); |
|
|
|
return result; |
|
} else { |
|
PyObject *called_object = func(descr, source, (PyObject *)type); |
|
CHECK_OBJECT(called_object); |
|
|
|
Py_DECREF(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS1( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
|
|
return result; |
|
} |
|
} |
|
|
|
if (descr != NULL) { |
|
CHECK_OBJECT(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS1( |
|
descr, |
|
args |
|
); |
|
Py_DECREF(descr); |
|
|
|
return result; |
|
} |
|
|
|
#if PYTHON_VERSION < 0x300 |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%s'", |
|
type->tp_name, |
|
PyString_AS_STRING(attr_name) |
|
); |
|
#else |
|
PyErr_Format( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%U'", |
|
type->tp_name, |
|
attr_name |
|
); |
|
#endif |
|
return NULL; |
|
} |
|
#if PYTHON_VERSION < 0x300 |
|
else if (type == &PyInstance_Type) { |
|
PyInstanceObject *source_instance = (PyInstanceObject *)source; |
|
|
|
|
|
|
|
assert(attr_name != const_str_plain___dict__); |
|
assert(attr_name != const_str_plain___class__); |
|
|
|
|
|
PyObject *called_object = GET_STRING_DICT_VALUE( |
|
(PyDictObject *)source_instance->in_dict, |
|
(PyStringObject *)attr_name |
|
); |
|
|
|
|
|
|
|
if (called_object != NULL) { |
|
return CALL_FUNCTION_WITH_ARGS1(called_object, args); |
|
} |
|
|
|
|
|
called_object = FIND_ATTRIBUTE_IN_CLASS( |
|
source_instance->in_class, |
|
attr_name |
|
); |
|
|
|
|
|
|
|
if (called_object != NULL) { |
|
descrgetfunc descr_get = Py_TYPE(called_object)->tp_descr_get; |
|
|
|
if (descr_get == Nuitka_Function_Type.tp_descr_get) { |
|
return Nuitka_CallMethodFunctionPosArgs( |
|
(struct Nuitka_FunctionObject const *)called_object, |
|
source, |
|
args, |
|
1 |
|
); |
|
} else if (descr_get != NULL) { |
|
PyObject *method = descr_get( |
|
called_object, |
|
source, |
|
(PyObject *)source_instance->in_class |
|
); |
|
|
|
if (unlikely(method == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS1(method, args); |
|
Py_DECREF(method); |
|
return result; |
|
} else { |
|
return CALL_FUNCTION_WITH_ARGS1(called_object, args); |
|
} |
|
|
|
} else if (unlikely(source_instance->in_class->cl_getattr == NULL)) { |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"%s instance has no attribute '%s'", |
|
PyString_AS_STRING(source_instance->in_class->cl_name), |
|
PyString_AS_STRING(attr_name) |
|
); |
|
|
|
return NULL; |
|
} else { |
|
|
|
|
|
|
|
PyObject *args2[] = { |
|
source, |
|
attr_name |
|
}; |
|
|
|
called_object = CALL_FUNCTION_WITH_ARGS2( |
|
source_instance->in_class->cl_getattr, |
|
args2 |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS1( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
} |
|
#endif |
|
else if (type->tp_getattro != NULL) { |
|
PyObject *called_object = (*type->tp_getattro)( |
|
source, |
|
attr_name |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS1( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} else if (type->tp_getattr != NULL) { |
|
PyObject *called_object = (*type->tp_getattr)( |
|
source, |
|
(char *)Nuitka_String_AsString_Unchecked(attr_name) |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS1( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} else { |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%s'", |
|
type->tp_name, |
|
Nuitka_String_AsString_Unchecked(attr_name) |
|
); |
|
|
|
return NULL; |
|
} |
|
} |
|
|
|
PyObject *CALL_METHOD_WITH_ARGS2(PyObject *source, PyObject *attr_name, PyObject **args) { |
|
CHECK_OBJECT(source); |
|
CHECK_OBJECT(attr_name); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 2; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
PyTypeObject *type = Py_TYPE(source); |
|
|
|
if (type->tp_getattro == PyObject_GenericGetAttr) { |
|
|
|
if (unlikely(type->tp_dict == NULL)) { |
|
if (unlikely(PyType_Ready(type) < 0)) { |
|
return NULL; |
|
} |
|
} |
|
|
|
PyObject *descr = _PyType_Lookup(type, attr_name); |
|
descrgetfunc func = NULL; |
|
|
|
if (descr != NULL) { |
|
Py_INCREF(descr); |
|
|
|
#if PYTHON_VERSION < 0x300 |
|
if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS)) { |
|
#endif |
|
func = Py_TYPE(descr)->tp_descr_get; |
|
|
|
if (func != NULL && PyDescr_IsData(descr)) { |
|
PyObject *called_object = func(descr, source, (PyObject *)type); |
|
Py_DECREF(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS2( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
#if PYTHON_VERSION < 0x300 |
|
} |
|
#endif |
|
} |
|
|
|
Py_ssize_t dictoffset = type->tp_dictoffset; |
|
PyObject *dict = NULL; |
|
|
|
if (dictoffset != 0) { |
|
|
|
if (dictoffset < 0) { |
|
Py_ssize_t tsize; |
|
size_t size; |
|
|
|
tsize = ((PyVarObject *)source)->ob_size; |
|
if (tsize < 0) { |
|
tsize = -tsize; |
|
} |
|
size = _PyObject_VAR_SIZE( type, tsize ); |
|
|
|
dictoffset += (long)size; |
|
} |
|
|
|
PyObject **dictptr = (PyObject **) ((char *)source + dictoffset); |
|
dict = *dictptr; |
|
} |
|
|
|
if (dict != NULL) { |
|
CHECK_OBJECT(dict); |
|
|
|
Py_INCREF(dict); |
|
|
|
PyObject *called_object = DICT_GET_ITEM1(dict, attr_name); |
|
|
|
if (called_object != NULL) { |
|
Py_XDECREF(descr); |
|
Py_DECREF(dict); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS2( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
|
|
Py_DECREF(dict); |
|
} |
|
|
|
if (func != NULL) { |
|
if (func == Nuitka_Function_Type.tp_descr_get) { |
|
PyObject *result = Nuitka_CallMethodFunctionPosArgs( |
|
(struct Nuitka_FunctionObject const *)descr, |
|
source, |
|
args, |
|
2 |
|
); |
|
|
|
Py_DECREF(descr); |
|
|
|
return result; |
|
} else { |
|
PyObject *called_object = func(descr, source, (PyObject *)type); |
|
CHECK_OBJECT(called_object); |
|
|
|
Py_DECREF(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS2( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
|
|
return result; |
|
} |
|
} |
|
|
|
if (descr != NULL) { |
|
CHECK_OBJECT(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS2( |
|
descr, |
|
args |
|
); |
|
Py_DECREF(descr); |
|
|
|
return result; |
|
} |
|
|
|
#if PYTHON_VERSION < 0x300 |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%s'", |
|
type->tp_name, |
|
PyString_AS_STRING(attr_name) |
|
); |
|
#else |
|
PyErr_Format( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%U'", |
|
type->tp_name, |
|
attr_name |
|
); |
|
#endif |
|
return NULL; |
|
} |
|
#if PYTHON_VERSION < 0x300 |
|
else if (type == &PyInstance_Type) { |
|
PyInstanceObject *source_instance = (PyInstanceObject *)source; |
|
|
|
|
|
|
|
assert(attr_name != const_str_plain___dict__); |
|
assert(attr_name != const_str_plain___class__); |
|
|
|
|
|
PyObject *called_object = GET_STRING_DICT_VALUE( |
|
(PyDictObject *)source_instance->in_dict, |
|
(PyStringObject *)attr_name |
|
); |
|
|
|
|
|
|
|
if (called_object != NULL) { |
|
return CALL_FUNCTION_WITH_ARGS2(called_object, args); |
|
} |
|
|
|
|
|
called_object = FIND_ATTRIBUTE_IN_CLASS( |
|
source_instance->in_class, |
|
attr_name |
|
); |
|
|
|
|
|
|
|
if (called_object != NULL) { |
|
descrgetfunc descr_get = Py_TYPE(called_object)->tp_descr_get; |
|
|
|
if (descr_get == Nuitka_Function_Type.tp_descr_get) { |
|
return Nuitka_CallMethodFunctionPosArgs( |
|
(struct Nuitka_FunctionObject const *)called_object, |
|
source, |
|
args, |
|
2 |
|
); |
|
} else if (descr_get != NULL) { |
|
PyObject *method = descr_get( |
|
called_object, |
|
source, |
|
(PyObject *)source_instance->in_class |
|
); |
|
|
|
if (unlikely(method == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS2(method, args); |
|
Py_DECREF(method); |
|
return result; |
|
} else { |
|
return CALL_FUNCTION_WITH_ARGS2(called_object, args); |
|
} |
|
|
|
} else if (unlikely(source_instance->in_class->cl_getattr == NULL)) { |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"%s instance has no attribute '%s'", |
|
PyString_AS_STRING(source_instance->in_class->cl_name), |
|
PyString_AS_STRING(attr_name) |
|
); |
|
|
|
return NULL; |
|
} else { |
|
|
|
|
|
|
|
PyObject *args2[] = { |
|
source, |
|
attr_name |
|
}; |
|
|
|
called_object = CALL_FUNCTION_WITH_ARGS2( |
|
source_instance->in_class->cl_getattr, |
|
args2 |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS2( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
} |
|
#endif |
|
else if (type->tp_getattro != NULL) { |
|
PyObject *called_object = (*type->tp_getattro)( |
|
source, |
|
attr_name |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS2( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} else if (type->tp_getattr != NULL) { |
|
PyObject *called_object = (*type->tp_getattr)( |
|
source, |
|
(char *)Nuitka_String_AsString_Unchecked(attr_name) |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS2( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} else { |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%s'", |
|
type->tp_name, |
|
Nuitka_String_AsString_Unchecked(attr_name) |
|
); |
|
|
|
return NULL; |
|
} |
|
} |
|
|
|
PyObject *CALL_METHOD_WITH_ARGS3(PyObject *source, PyObject *attr_name, PyObject **args) { |
|
CHECK_OBJECT(source); |
|
CHECK_OBJECT(attr_name); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 3; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
PyTypeObject *type = Py_TYPE(source); |
|
|
|
if (type->tp_getattro == PyObject_GenericGetAttr) { |
|
|
|
if (unlikely(type->tp_dict == NULL)) { |
|
if (unlikely(PyType_Ready(type) < 0)) { |
|
return NULL; |
|
} |
|
} |
|
|
|
PyObject *descr = _PyType_Lookup(type, attr_name); |
|
descrgetfunc func = NULL; |
|
|
|
if (descr != NULL) { |
|
Py_INCREF(descr); |
|
|
|
#if PYTHON_VERSION < 0x300 |
|
if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS)) { |
|
#endif |
|
func = Py_TYPE(descr)->tp_descr_get; |
|
|
|
if (func != NULL && PyDescr_IsData(descr)) { |
|
PyObject *called_object = func(descr, source, (PyObject *)type); |
|
Py_DECREF(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS3( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
#if PYTHON_VERSION < 0x300 |
|
} |
|
#endif |
|
} |
|
|
|
Py_ssize_t dictoffset = type->tp_dictoffset; |
|
PyObject *dict = NULL; |
|
|
|
if (dictoffset != 0) { |
|
|
|
if (dictoffset < 0) { |
|
Py_ssize_t tsize; |
|
size_t size; |
|
|
|
tsize = ((PyVarObject *)source)->ob_size; |
|
if (tsize < 0) { |
|
tsize = -tsize; |
|
} |
|
size = _PyObject_VAR_SIZE( type, tsize ); |
|
|
|
dictoffset += (long)size; |
|
} |
|
|
|
PyObject **dictptr = (PyObject **) ((char *)source + dictoffset); |
|
dict = *dictptr; |
|
} |
|
|
|
if (dict != NULL) { |
|
CHECK_OBJECT(dict); |
|
|
|
Py_INCREF(dict); |
|
|
|
PyObject *called_object = DICT_GET_ITEM1(dict, attr_name); |
|
|
|
if (called_object != NULL) { |
|
Py_XDECREF(descr); |
|
Py_DECREF(dict); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS3( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
|
|
Py_DECREF(dict); |
|
} |
|
|
|
if (func != NULL) { |
|
if (func == Nuitka_Function_Type.tp_descr_get) { |
|
PyObject *result = Nuitka_CallMethodFunctionPosArgs( |
|
(struct Nuitka_FunctionObject const *)descr, |
|
source, |
|
args, |
|
3 |
|
); |
|
|
|
Py_DECREF(descr); |
|
|
|
return result; |
|
} else { |
|
PyObject *called_object = func(descr, source, (PyObject *)type); |
|
CHECK_OBJECT(called_object); |
|
|
|
Py_DECREF(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS3( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
|
|
return result; |
|
} |
|
} |
|
|
|
if (descr != NULL) { |
|
CHECK_OBJECT(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS3( |
|
descr, |
|
args |
|
); |
|
Py_DECREF(descr); |
|
|
|
return result; |
|
} |
|
|
|
#if PYTHON_VERSION < 0x300 |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%s'", |
|
type->tp_name, |
|
PyString_AS_STRING(attr_name) |
|
); |
|
#else |
|
PyErr_Format( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%U'", |
|
type->tp_name, |
|
attr_name |
|
); |
|
#endif |
|
return NULL; |
|
} |
|
#if PYTHON_VERSION < 0x300 |
|
else if (type == &PyInstance_Type) { |
|
PyInstanceObject *source_instance = (PyInstanceObject *)source; |
|
|
|
|
|
|
|
assert(attr_name != const_str_plain___dict__); |
|
assert(attr_name != const_str_plain___class__); |
|
|
|
|
|
PyObject *called_object = GET_STRING_DICT_VALUE( |
|
(PyDictObject *)source_instance->in_dict, |
|
(PyStringObject *)attr_name |
|
); |
|
|
|
|
|
|
|
if (called_object != NULL) { |
|
return CALL_FUNCTION_WITH_ARGS3(called_object, args); |
|
} |
|
|
|
|
|
called_object = FIND_ATTRIBUTE_IN_CLASS( |
|
source_instance->in_class, |
|
attr_name |
|
); |
|
|
|
|
|
|
|
if (called_object != NULL) { |
|
descrgetfunc descr_get = Py_TYPE(called_object)->tp_descr_get; |
|
|
|
if (descr_get == Nuitka_Function_Type.tp_descr_get) { |
|
return Nuitka_CallMethodFunctionPosArgs( |
|
(struct Nuitka_FunctionObject const *)called_object, |
|
source, |
|
args, |
|
3 |
|
); |
|
} else if (descr_get != NULL) { |
|
PyObject *method = descr_get( |
|
called_object, |
|
source, |
|
(PyObject *)source_instance->in_class |
|
); |
|
|
|
if (unlikely(method == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS3(method, args); |
|
Py_DECREF(method); |
|
return result; |
|
} else { |
|
return CALL_FUNCTION_WITH_ARGS3(called_object, args); |
|
} |
|
|
|
} else if (unlikely(source_instance->in_class->cl_getattr == NULL)) { |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"%s instance has no attribute '%s'", |
|
PyString_AS_STRING(source_instance->in_class->cl_name), |
|
PyString_AS_STRING(attr_name) |
|
); |
|
|
|
return NULL; |
|
} else { |
|
|
|
|
|
|
|
PyObject *args2[] = { |
|
source, |
|
attr_name |
|
}; |
|
|
|
called_object = CALL_FUNCTION_WITH_ARGS2( |
|
source_instance->in_class->cl_getattr, |
|
args2 |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS3( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
} |
|
#endif |
|
else if (type->tp_getattro != NULL) { |
|
PyObject *called_object = (*type->tp_getattro)( |
|
source, |
|
attr_name |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS3( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} else if (type->tp_getattr != NULL) { |
|
PyObject *called_object = (*type->tp_getattr)( |
|
source, |
|
(char *)Nuitka_String_AsString_Unchecked(attr_name) |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS3( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} else { |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%s'", |
|
type->tp_name, |
|
Nuitka_String_AsString_Unchecked(attr_name) |
|
); |
|
|
|
return NULL; |
|
} |
|
} |
|
|
|
PyObject *CALL_METHOD_WITH_ARGS4(PyObject *source, PyObject *attr_name, PyObject **args) { |
|
CHECK_OBJECT(source); |
|
CHECK_OBJECT(attr_name); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 4; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
PyTypeObject *type = Py_TYPE(source); |
|
|
|
if (type->tp_getattro == PyObject_GenericGetAttr) { |
|
|
|
if (unlikely(type->tp_dict == NULL)) { |
|
if (unlikely(PyType_Ready(type) < 0)) { |
|
return NULL; |
|
} |
|
} |
|
|
|
PyObject *descr = _PyType_Lookup(type, attr_name); |
|
descrgetfunc func = NULL; |
|
|
|
if (descr != NULL) { |
|
Py_INCREF(descr); |
|
|
|
#if PYTHON_VERSION < 0x300 |
|
if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS)) { |
|
#endif |
|
func = Py_TYPE(descr)->tp_descr_get; |
|
|
|
if (func != NULL && PyDescr_IsData(descr)) { |
|
PyObject *called_object = func(descr, source, (PyObject *)type); |
|
Py_DECREF(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS4( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
#if PYTHON_VERSION < 0x300 |
|
} |
|
#endif |
|
} |
|
|
|
Py_ssize_t dictoffset = type->tp_dictoffset; |
|
PyObject *dict = NULL; |
|
|
|
if (dictoffset != 0) { |
|
|
|
if (dictoffset < 0) { |
|
Py_ssize_t tsize; |
|
size_t size; |
|
|
|
tsize = ((PyVarObject *)source)->ob_size; |
|
if (tsize < 0) { |
|
tsize = -tsize; |
|
} |
|
size = _PyObject_VAR_SIZE( type, tsize ); |
|
|
|
dictoffset += (long)size; |
|
} |
|
|
|
PyObject **dictptr = (PyObject **) ((char *)source + dictoffset); |
|
dict = *dictptr; |
|
} |
|
|
|
if (dict != NULL) { |
|
CHECK_OBJECT(dict); |
|
|
|
Py_INCREF(dict); |
|
|
|
PyObject *called_object = DICT_GET_ITEM1(dict, attr_name); |
|
|
|
if (called_object != NULL) { |
|
Py_XDECREF(descr); |
|
Py_DECREF(dict); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS4( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
|
|
Py_DECREF(dict); |
|
} |
|
|
|
if (func != NULL) { |
|
if (func == Nuitka_Function_Type.tp_descr_get) { |
|
PyObject *result = Nuitka_CallMethodFunctionPosArgs( |
|
(struct Nuitka_FunctionObject const *)descr, |
|
source, |
|
args, |
|
4 |
|
); |
|
|
|
Py_DECREF(descr); |
|
|
|
return result; |
|
} else { |
|
PyObject *called_object = func(descr, source, (PyObject *)type); |
|
CHECK_OBJECT(called_object); |
|
|
|
Py_DECREF(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS4( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
|
|
return result; |
|
} |
|
} |
|
|
|
if (descr != NULL) { |
|
CHECK_OBJECT(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS4( |
|
descr, |
|
args |
|
); |
|
Py_DECREF(descr); |
|
|
|
return result; |
|
} |
|
|
|
#if PYTHON_VERSION < 0x300 |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%s'", |
|
type->tp_name, |
|
PyString_AS_STRING(attr_name) |
|
); |
|
#else |
|
PyErr_Format( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%U'", |
|
type->tp_name, |
|
attr_name |
|
); |
|
#endif |
|
return NULL; |
|
} |
|
#if PYTHON_VERSION < 0x300 |
|
else if (type == &PyInstance_Type) { |
|
PyInstanceObject *source_instance = (PyInstanceObject *)source; |
|
|
|
|
|
|
|
assert(attr_name != const_str_plain___dict__); |
|
assert(attr_name != const_str_plain___class__); |
|
|
|
|
|
PyObject *called_object = GET_STRING_DICT_VALUE( |
|
(PyDictObject *)source_instance->in_dict, |
|
(PyStringObject *)attr_name |
|
); |
|
|
|
|
|
|
|
if (called_object != NULL) { |
|
return CALL_FUNCTION_WITH_ARGS4(called_object, args); |
|
} |
|
|
|
|
|
called_object = FIND_ATTRIBUTE_IN_CLASS( |
|
source_instance->in_class, |
|
attr_name |
|
); |
|
|
|
|
|
|
|
if (called_object != NULL) { |
|
descrgetfunc descr_get = Py_TYPE(called_object)->tp_descr_get; |
|
|
|
if (descr_get == Nuitka_Function_Type.tp_descr_get) { |
|
return Nuitka_CallMethodFunctionPosArgs( |
|
(struct Nuitka_FunctionObject const *)called_object, |
|
source, |
|
args, |
|
4 |
|
); |
|
} else if (descr_get != NULL) { |
|
PyObject *method = descr_get( |
|
called_object, |
|
source, |
|
(PyObject *)source_instance->in_class |
|
); |
|
|
|
if (unlikely(method == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS4(method, args); |
|
Py_DECREF(method); |
|
return result; |
|
} else { |
|
return CALL_FUNCTION_WITH_ARGS4(called_object, args); |
|
} |
|
|
|
} else if (unlikely(source_instance->in_class->cl_getattr == NULL)) { |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"%s instance has no attribute '%s'", |
|
PyString_AS_STRING(source_instance->in_class->cl_name), |
|
PyString_AS_STRING(attr_name) |
|
); |
|
|
|
return NULL; |
|
} else { |
|
|
|
|
|
|
|
PyObject *args2[] = { |
|
source, |
|
attr_name |
|
}; |
|
|
|
called_object = CALL_FUNCTION_WITH_ARGS2( |
|
source_instance->in_class->cl_getattr, |
|
args2 |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS4( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
} |
|
#endif |
|
else if (type->tp_getattro != NULL) { |
|
PyObject *called_object = (*type->tp_getattro)( |
|
source, |
|
attr_name |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS4( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} else if (type->tp_getattr != NULL) { |
|
PyObject *called_object = (*type->tp_getattr)( |
|
source, |
|
(char *)Nuitka_String_AsString_Unchecked(attr_name) |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS4( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} else { |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%s'", |
|
type->tp_name, |
|
Nuitka_String_AsString_Unchecked(attr_name) |
|
); |
|
|
|
return NULL; |
|
} |
|
} |
|
|
|
PyObject *CALL_METHOD_WITH_ARGS5(PyObject *source, PyObject *attr_name, PyObject **args) { |
|
CHECK_OBJECT(source); |
|
CHECK_OBJECT(attr_name); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 5; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
PyTypeObject *type = Py_TYPE(source); |
|
|
|
if (type->tp_getattro == PyObject_GenericGetAttr) { |
|
|
|
if (unlikely(type->tp_dict == NULL)) { |
|
if (unlikely(PyType_Ready(type) < 0)) { |
|
return NULL; |
|
} |
|
} |
|
|
|
PyObject *descr = _PyType_Lookup(type, attr_name); |
|
descrgetfunc func = NULL; |
|
|
|
if (descr != NULL) { |
|
Py_INCREF(descr); |
|
|
|
#if PYTHON_VERSION < 0x300 |
|
if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS)) { |
|
#endif |
|
func = Py_TYPE(descr)->tp_descr_get; |
|
|
|
if (func != NULL && PyDescr_IsData(descr)) { |
|
PyObject *called_object = func(descr, source, (PyObject *)type); |
|
Py_DECREF(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS5( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
#if PYTHON_VERSION < 0x300 |
|
} |
|
#endif |
|
} |
|
|
|
Py_ssize_t dictoffset = type->tp_dictoffset; |
|
PyObject *dict = NULL; |
|
|
|
if (dictoffset != 0) { |
|
|
|
if (dictoffset < 0) { |
|
Py_ssize_t tsize; |
|
size_t size; |
|
|
|
tsize = ((PyVarObject *)source)->ob_size; |
|
if (tsize < 0) { |
|
tsize = -tsize; |
|
} |
|
size = _PyObject_VAR_SIZE( type, tsize ); |
|
|
|
dictoffset += (long)size; |
|
} |
|
|
|
PyObject **dictptr = (PyObject **) ((char *)source + dictoffset); |
|
dict = *dictptr; |
|
} |
|
|
|
if (dict != NULL) { |
|
CHECK_OBJECT(dict); |
|
|
|
Py_INCREF(dict); |
|
|
|
PyObject *called_object = DICT_GET_ITEM1(dict, attr_name); |
|
|
|
if (called_object != NULL) { |
|
Py_XDECREF(descr); |
|
Py_DECREF(dict); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS5( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
|
|
Py_DECREF(dict); |
|
} |
|
|
|
if (func != NULL) { |
|
if (func == Nuitka_Function_Type.tp_descr_get) { |
|
PyObject *result = Nuitka_CallMethodFunctionPosArgs( |
|
(struct Nuitka_FunctionObject const *)descr, |
|
source, |
|
args, |
|
5 |
|
); |
|
|
|
Py_DECREF(descr); |
|
|
|
return result; |
|
} else { |
|
PyObject *called_object = func(descr, source, (PyObject *)type); |
|
CHECK_OBJECT(called_object); |
|
|
|
Py_DECREF(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS5( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
|
|
return result; |
|
} |
|
} |
|
|
|
if (descr != NULL) { |
|
CHECK_OBJECT(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS5( |
|
descr, |
|
args |
|
); |
|
Py_DECREF(descr); |
|
|
|
return result; |
|
} |
|
|
|
#if PYTHON_VERSION < 0x300 |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%s'", |
|
type->tp_name, |
|
PyString_AS_STRING(attr_name) |
|
); |
|
#else |
|
PyErr_Format( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%U'", |
|
type->tp_name, |
|
attr_name |
|
); |
|
#endif |
|
return NULL; |
|
} |
|
#if PYTHON_VERSION < 0x300 |
|
else if (type == &PyInstance_Type) { |
|
PyInstanceObject *source_instance = (PyInstanceObject *)source; |
|
|
|
|
|
|
|
assert(attr_name != const_str_plain___dict__); |
|
assert(attr_name != const_str_plain___class__); |
|
|
|
|
|
PyObject *called_object = GET_STRING_DICT_VALUE( |
|
(PyDictObject *)source_instance->in_dict, |
|
(PyStringObject *)attr_name |
|
); |
|
|
|
|
|
|
|
if (called_object != NULL) { |
|
return CALL_FUNCTION_WITH_ARGS5(called_object, args); |
|
} |
|
|
|
|
|
called_object = FIND_ATTRIBUTE_IN_CLASS( |
|
source_instance->in_class, |
|
attr_name |
|
); |
|
|
|
|
|
|
|
if (called_object != NULL) { |
|
descrgetfunc descr_get = Py_TYPE(called_object)->tp_descr_get; |
|
|
|
if (descr_get == Nuitka_Function_Type.tp_descr_get) { |
|
return Nuitka_CallMethodFunctionPosArgs( |
|
(struct Nuitka_FunctionObject const *)called_object, |
|
source, |
|
args, |
|
5 |
|
); |
|
} else if (descr_get != NULL) { |
|
PyObject *method = descr_get( |
|
called_object, |
|
source, |
|
(PyObject *)source_instance->in_class |
|
); |
|
|
|
if (unlikely(method == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS5(method, args); |
|
Py_DECREF(method); |
|
return result; |
|
} else { |
|
return CALL_FUNCTION_WITH_ARGS5(called_object, args); |
|
} |
|
|
|
} else if (unlikely(source_instance->in_class->cl_getattr == NULL)) { |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"%s instance has no attribute '%s'", |
|
PyString_AS_STRING(source_instance->in_class->cl_name), |
|
PyString_AS_STRING(attr_name) |
|
); |
|
|
|
return NULL; |
|
} else { |
|
|
|
|
|
|
|
PyObject *args2[] = { |
|
source, |
|
attr_name |
|
}; |
|
|
|
called_object = CALL_FUNCTION_WITH_ARGS2( |
|
source_instance->in_class->cl_getattr, |
|
args2 |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS5( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
} |
|
#endif |
|
else if (type->tp_getattro != NULL) { |
|
PyObject *called_object = (*type->tp_getattro)( |
|
source, |
|
attr_name |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS5( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} else if (type->tp_getattr != NULL) { |
|
PyObject *called_object = (*type->tp_getattr)( |
|
source, |
|
(char *)Nuitka_String_AsString_Unchecked(attr_name) |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS5( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} else { |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%s'", |
|
type->tp_name, |
|
Nuitka_String_AsString_Unchecked(attr_name) |
|
); |
|
|
|
return NULL; |
|
} |
|
} |
|
|
|
PyObject *CALL_METHOD_WITH_ARGS7(PyObject *source, PyObject *attr_name, PyObject **args) { |
|
CHECK_OBJECT(source); |
|
CHECK_OBJECT(attr_name); |
|
|
|
|
|
#ifndef __NUITKA_NO_ASSERT__ |
|
for (size_t i = 0; i < 7; i++) { |
|
CHECK_OBJECT(args[i]); |
|
} |
|
#endif |
|
|
|
PyTypeObject *type = Py_TYPE(source); |
|
|
|
if (type->tp_getattro == PyObject_GenericGetAttr) { |
|
|
|
if (unlikely(type->tp_dict == NULL)) { |
|
if (unlikely(PyType_Ready(type) < 0)) { |
|
return NULL; |
|
} |
|
} |
|
|
|
PyObject *descr = _PyType_Lookup(type, attr_name); |
|
descrgetfunc func = NULL; |
|
|
|
if (descr != NULL) { |
|
Py_INCREF(descr); |
|
|
|
#if PYTHON_VERSION < 0x300 |
|
if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS)) { |
|
#endif |
|
func = Py_TYPE(descr)->tp_descr_get; |
|
|
|
if (func != NULL && PyDescr_IsData(descr)) { |
|
PyObject *called_object = func(descr, source, (PyObject *)type); |
|
Py_DECREF(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS7( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
#if PYTHON_VERSION < 0x300 |
|
} |
|
#endif |
|
} |
|
|
|
Py_ssize_t dictoffset = type->tp_dictoffset; |
|
PyObject *dict = NULL; |
|
|
|
if (dictoffset != 0) { |
|
|
|
if (dictoffset < 0) { |
|
Py_ssize_t tsize; |
|
size_t size; |
|
|
|
tsize = ((PyVarObject *)source)->ob_size; |
|
if (tsize < 0) { |
|
tsize = -tsize; |
|
} |
|
size = _PyObject_VAR_SIZE( type, tsize ); |
|
|
|
dictoffset += (long)size; |
|
} |
|
|
|
PyObject **dictptr = (PyObject **) ((char *)source + dictoffset); |
|
dict = *dictptr; |
|
} |
|
|
|
if (dict != NULL) { |
|
CHECK_OBJECT(dict); |
|
|
|
Py_INCREF(dict); |
|
|
|
PyObject *called_object = DICT_GET_ITEM1(dict, attr_name); |
|
|
|
if (called_object != NULL) { |
|
Py_XDECREF(descr); |
|
Py_DECREF(dict); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS7( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
|
|
Py_DECREF(dict); |
|
} |
|
|
|
if (func != NULL) { |
|
if (func == Nuitka_Function_Type.tp_descr_get) { |
|
PyObject *result = Nuitka_CallMethodFunctionPosArgs( |
|
(struct Nuitka_FunctionObject const *)descr, |
|
source, |
|
args, |
|
7 |
|
); |
|
|
|
Py_DECREF(descr); |
|
|
|
return result; |
|
} else { |
|
PyObject *called_object = func(descr, source, (PyObject *)type); |
|
CHECK_OBJECT(called_object); |
|
|
|
Py_DECREF(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS7( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
|
|
return result; |
|
} |
|
} |
|
|
|
if (descr != NULL) { |
|
CHECK_OBJECT(descr); |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS7( |
|
descr, |
|
args |
|
); |
|
Py_DECREF(descr); |
|
|
|
return result; |
|
} |
|
|
|
#if PYTHON_VERSION < 0x300 |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%s'", |
|
type->tp_name, |
|
PyString_AS_STRING(attr_name) |
|
); |
|
#else |
|
PyErr_Format( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%U'", |
|
type->tp_name, |
|
attr_name |
|
); |
|
#endif |
|
return NULL; |
|
} |
|
#if PYTHON_VERSION < 0x300 |
|
else if (type == &PyInstance_Type) { |
|
PyInstanceObject *source_instance = (PyInstanceObject *)source; |
|
|
|
|
|
|
|
assert(attr_name != const_str_plain___dict__); |
|
assert(attr_name != const_str_plain___class__); |
|
|
|
|
|
PyObject *called_object = GET_STRING_DICT_VALUE( |
|
(PyDictObject *)source_instance->in_dict, |
|
(PyStringObject *)attr_name |
|
); |
|
|
|
|
|
|
|
if (called_object != NULL) { |
|
return CALL_FUNCTION_WITH_ARGS7(called_object, args); |
|
} |
|
|
|
|
|
called_object = FIND_ATTRIBUTE_IN_CLASS( |
|
source_instance->in_class, |
|
attr_name |
|
); |
|
|
|
|
|
|
|
if (called_object != NULL) { |
|
descrgetfunc descr_get = Py_TYPE(called_object)->tp_descr_get; |
|
|
|
if (descr_get == Nuitka_Function_Type.tp_descr_get) { |
|
return Nuitka_CallMethodFunctionPosArgs( |
|
(struct Nuitka_FunctionObject const *)called_object, |
|
source, |
|
args, |
|
7 |
|
); |
|
} else if (descr_get != NULL) { |
|
PyObject *method = descr_get( |
|
called_object, |
|
source, |
|
(PyObject *)source_instance->in_class |
|
); |
|
|
|
if (unlikely(method == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS7(method, args); |
|
Py_DECREF(method); |
|
return result; |
|
} else { |
|
return CALL_FUNCTION_WITH_ARGS7(called_object, args); |
|
} |
|
|
|
} else if (unlikely(source_instance->in_class->cl_getattr == NULL)) { |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"%s instance has no attribute '%s'", |
|
PyString_AS_STRING(source_instance->in_class->cl_name), |
|
PyString_AS_STRING(attr_name) |
|
); |
|
|
|
return NULL; |
|
} else { |
|
|
|
|
|
|
|
PyObject *args2[] = { |
|
source, |
|
attr_name |
|
}; |
|
|
|
called_object = CALL_FUNCTION_WITH_ARGS2( |
|
source_instance->in_class->cl_getattr, |
|
args2 |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS7( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} |
|
} |
|
#endif |
|
else if (type->tp_getattro != NULL) { |
|
PyObject *called_object = (*type->tp_getattro)( |
|
source, |
|
attr_name |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS7( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} else if (type->tp_getattr != NULL) { |
|
PyObject *called_object = (*type->tp_getattr)( |
|
source, |
|
(char *)Nuitka_String_AsString_Unchecked(attr_name) |
|
); |
|
|
|
if (unlikely(called_object == NULL)) { |
|
return NULL; |
|
} |
|
|
|
PyObject *result = CALL_FUNCTION_WITH_ARGS7( |
|
called_object, |
|
args |
|
); |
|
Py_DECREF(called_object); |
|
return result; |
|
} else { |
|
SET_CURRENT_EXCEPTION_TYPE0_FORMAT2( |
|
PyExc_AttributeError, |
|
"'%s' object has no attribute '%s'", |
|
type->tp_name, |
|
Nuitka_String_AsString_Unchecked(attr_name) |
|
); |
|
|
|
return NULL; |
|
} |
|
} |
|
|
|
|