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