17db96d56Sopenharmony_ci#ifndef Py_INTERNAL_CALL_H 27db96d56Sopenharmony_ci#define Py_INTERNAL_CALL_H 37db96d56Sopenharmony_ci#ifdef __cplusplus 47db96d56Sopenharmony_ciextern "C" { 57db96d56Sopenharmony_ci#endif 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE 87db96d56Sopenharmony_ci# error "this header requires Py_BUILD_CORE define" 97db96d56Sopenharmony_ci#endif 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci#include "pycore_pystate.h" // _PyThreadState_GET() 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_Call_Prepend( 147db96d56Sopenharmony_ci PyThreadState *tstate, 157db96d56Sopenharmony_ci PyObject *callable, 167db96d56Sopenharmony_ci PyObject *obj, 177db96d56Sopenharmony_ci PyObject *args, 187db96d56Sopenharmony_ci PyObject *kwargs); 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_FastCallDictTstate( 217db96d56Sopenharmony_ci PyThreadState *tstate, 227db96d56Sopenharmony_ci PyObject *callable, 237db96d56Sopenharmony_ci PyObject *const *args, 247db96d56Sopenharmony_ci size_t nargsf, 257db96d56Sopenharmony_ci PyObject *kwargs); 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_Call( 287db96d56Sopenharmony_ci PyThreadState *tstate, 297db96d56Sopenharmony_ci PyObject *callable, 307db96d56Sopenharmony_ci PyObject *args, 317db96d56Sopenharmony_ci PyObject *kwargs); 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_ciextern PyObject * _PyObject_CallMethodFormat( 347db96d56Sopenharmony_ci PyThreadState *tstate, PyObject *callable, const char *format, ...); 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci// Static inline variant of public PyVectorcall_Function(). 387db96d56Sopenharmony_cistatic inline vectorcallfunc 397db96d56Sopenharmony_ci_PyVectorcall_FunctionInline(PyObject *callable) 407db96d56Sopenharmony_ci{ 417db96d56Sopenharmony_ci assert(callable != NULL); 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_ci PyTypeObject *tp = Py_TYPE(callable); 447db96d56Sopenharmony_ci if (!PyType_HasFeature(tp, Py_TPFLAGS_HAVE_VECTORCALL)) { 457db96d56Sopenharmony_ci return NULL; 467db96d56Sopenharmony_ci } 477db96d56Sopenharmony_ci assert(PyCallable_Check(callable)); 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci Py_ssize_t offset = tp->tp_vectorcall_offset; 507db96d56Sopenharmony_ci assert(offset > 0); 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci vectorcallfunc ptr; 537db96d56Sopenharmony_ci memcpy(&ptr, (char *) callable + offset, sizeof(ptr)); 547db96d56Sopenharmony_ci return ptr; 557db96d56Sopenharmony_ci} 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci/* Call the callable object 'callable' with the "vectorcall" calling 597db96d56Sopenharmony_ci convention. 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_ci args is a C array for positional arguments. 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci nargsf is the number of positional arguments plus optionally the flag 647db96d56Sopenharmony_ci PY_VECTORCALL_ARGUMENTS_OFFSET which means that the caller is allowed to 657db96d56Sopenharmony_ci modify args[-1]. 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci kwnames is a tuple of keyword names. The values of the keyword arguments 687db96d56Sopenharmony_ci are stored in "args" after the positional arguments (note that the number 697db96d56Sopenharmony_ci of keyword arguments does not change nargsf). kwnames can also be NULL if 707db96d56Sopenharmony_ci there are no keyword arguments. 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci keywords must only contain strings and all keys must be unique. 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ci Return the result on success. Raise an exception and return NULL on 757db96d56Sopenharmony_ci error. */ 767db96d56Sopenharmony_cistatic inline PyObject * 777db96d56Sopenharmony_ci_PyObject_VectorcallTstate(PyThreadState *tstate, PyObject *callable, 787db96d56Sopenharmony_ci PyObject *const *args, size_t nargsf, 797db96d56Sopenharmony_ci PyObject *kwnames) 807db96d56Sopenharmony_ci{ 817db96d56Sopenharmony_ci vectorcallfunc func; 827db96d56Sopenharmony_ci PyObject *res; 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci assert(kwnames == NULL || PyTuple_Check(kwnames)); 857db96d56Sopenharmony_ci assert(args != NULL || PyVectorcall_NARGS(nargsf) == 0); 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci func = _PyVectorcall_FunctionInline(callable); 887db96d56Sopenharmony_ci if (func == NULL) { 897db96d56Sopenharmony_ci Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); 907db96d56Sopenharmony_ci return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwnames); 917db96d56Sopenharmony_ci } 927db96d56Sopenharmony_ci res = func(callable, args, nargsf, kwnames); 937db96d56Sopenharmony_ci return _Py_CheckFunctionResult(tstate, callable, res, NULL); 947db96d56Sopenharmony_ci} 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_cistatic inline PyObject * 987db96d56Sopenharmony_ci_PyObject_CallNoArgsTstate(PyThreadState *tstate, PyObject *func) { 997db96d56Sopenharmony_ci return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); 1007db96d56Sopenharmony_ci} 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci// Private static inline function variant of public PyObject_CallNoArgs() 1047db96d56Sopenharmony_cistatic inline PyObject * 1057db96d56Sopenharmony_ci_PyObject_CallNoArgs(PyObject *func) { 1067db96d56Sopenharmony_ci PyThreadState *tstate = _PyThreadState_GET(); 1077db96d56Sopenharmony_ci return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); 1087db96d56Sopenharmony_ci} 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ci 1117db96d56Sopenharmony_cistatic inline PyObject * 1127db96d56Sopenharmony_ci_PyObject_FastCallTstate(PyThreadState *tstate, PyObject *func, PyObject *const *args, Py_ssize_t nargs) 1137db96d56Sopenharmony_ci{ 1147db96d56Sopenharmony_ci return _PyObject_VectorcallTstate(tstate, func, args, (size_t)nargs, NULL); 1157db96d56Sopenharmony_ci} 1167db96d56Sopenharmony_ci 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci#ifdef __cplusplus 1197db96d56Sopenharmony_ci} 1207db96d56Sopenharmony_ci#endif 1217db96d56Sopenharmony_ci#endif /* !Py_INTERNAL_CALL_H */ 122