17db96d56Sopenharmony_ci#ifndef Py_CPYTHON_ABSTRACTOBJECT_H
27db96d56Sopenharmony_ci#  error "this header file must not be included directly"
37db96d56Sopenharmony_ci#endif
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci/* === Object Protocol ================================================== */
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci#ifdef PY_SSIZE_T_CLEAN
87db96d56Sopenharmony_ci#  define _PyObject_CallMethodId _PyObject_CallMethodId_SizeT
97db96d56Sopenharmony_ci#endif
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci/* Convert keyword arguments from the FASTCALL (stack: C array, kwnames: tuple)
127db96d56Sopenharmony_ci   format to a Python dictionary ("kwargs" dict).
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci   The type of kwnames keys is not checked. The final function getting
157db96d56Sopenharmony_ci   arguments is responsible to check if all keys are strings, for example using
167db96d56Sopenharmony_ci   PyArg_ParseTupleAndKeywords() or PyArg_ValidateKeywordArguments().
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci   Duplicate keys are merged using the last value. If duplicate keys must raise
197db96d56Sopenharmony_ci   an exception, the caller is responsible to implement an explicit keys on
207db96d56Sopenharmony_ci   kwnames. */
217db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyStack_AsDict(
227db96d56Sopenharmony_ci    PyObject *const *values,
237db96d56Sopenharmony_ci    PyObject *kwnames);
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci/* Suggested size (number of positional arguments) for arrays of PyObject*
267db96d56Sopenharmony_ci   allocated on a C stack to avoid allocating memory on the heap memory. Such
277db96d56Sopenharmony_ci   array is used to pass positional arguments to call functions of the
287db96d56Sopenharmony_ci   PyObject_Vectorcall() family.
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci   The size is chosen to not abuse the C stack and so limit the risk of stack
317db96d56Sopenharmony_ci   overflow. The size is also chosen to allow using the small stack for most
327db96d56Sopenharmony_ci   function calls of the Python standard library. On 64-bit CPU, it allocates
337db96d56Sopenharmony_ci   40 bytes on the stack. */
347db96d56Sopenharmony_ci#define _PY_FASTCALL_SMALL_STACK 5
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _Py_CheckFunctionResult(
377db96d56Sopenharmony_ci    PyThreadState *tstate,
387db96d56Sopenharmony_ci    PyObject *callable,
397db96d56Sopenharmony_ci    PyObject *result,
407db96d56Sopenharmony_ci    const char *where);
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci/* === Vectorcall protocol (PEP 590) ============================= */
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci/* Call callable using tp_call. Arguments are like PyObject_Vectorcall()
457db96d56Sopenharmony_ci   or PyObject_FastCallDict() (both forms are supported),
467db96d56Sopenharmony_ci   except that nargs is plainly the number of arguments without flags. */
477db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_MakeTpCall(
487db96d56Sopenharmony_ci    PyThreadState *tstate,
497db96d56Sopenharmony_ci    PyObject *callable,
507db96d56Sopenharmony_ci    PyObject *const *args, Py_ssize_t nargs,
517db96d56Sopenharmony_ci    PyObject *keywords);
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci#define PY_VECTORCALL_ARGUMENTS_OFFSET \
547db96d56Sopenharmony_ci    (_Py_STATIC_CAST(size_t, 1) << (8 * sizeof(size_t) - 1))
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_cistatic inline Py_ssize_t
577db96d56Sopenharmony_ciPyVectorcall_NARGS(size_t n)
587db96d56Sopenharmony_ci{
597db96d56Sopenharmony_ci    return n & ~PY_VECTORCALL_ARGUMENTS_OFFSET;
607db96d56Sopenharmony_ci}
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ciPyAPI_FUNC(vectorcallfunc) PyVectorcall_Function(PyObject *callable);
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyObject_Vectorcall(
657db96d56Sopenharmony_ci    PyObject *callable,
667db96d56Sopenharmony_ci    PyObject *const *args,
677db96d56Sopenharmony_ci    size_t nargsf,
687db96d56Sopenharmony_ci    PyObject *kwnames);
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci// Backwards compatibility aliases for API that was provisional in Python 3.8
717db96d56Sopenharmony_ci#define _PyObject_Vectorcall PyObject_Vectorcall
727db96d56Sopenharmony_ci#define _PyObject_VectorcallMethod PyObject_VectorcallMethod
737db96d56Sopenharmony_ci#define _PyObject_FastCallDict PyObject_VectorcallDict
747db96d56Sopenharmony_ci#define _PyVectorcall_Function PyVectorcall_Function
757db96d56Sopenharmony_ci#define _PyObject_CallOneArg PyObject_CallOneArg
767db96d56Sopenharmony_ci#define _PyObject_CallMethodNoArgs PyObject_CallMethodNoArgs
777db96d56Sopenharmony_ci#define _PyObject_CallMethodOneArg PyObject_CallMethodOneArg
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci/* Same as PyObject_Vectorcall except that keyword arguments are passed as
807db96d56Sopenharmony_ci   dict, which may be NULL if there are no keyword arguments. */
817db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyObject_VectorcallDict(
827db96d56Sopenharmony_ci    PyObject *callable,
837db96d56Sopenharmony_ci    PyObject *const *args,
847db96d56Sopenharmony_ci    size_t nargsf,
857db96d56Sopenharmony_ci    PyObject *kwargs);
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci/* Call "callable" (which must support vectorcall) with positional arguments
887db96d56Sopenharmony_ci   "tuple" and keyword arguments "dict". "dict" may also be NULL */
897db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict);
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci// Same as PyObject_Vectorcall(), except without keyword arguments
927db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_FastCall(
937db96d56Sopenharmony_ci    PyObject *func,
947db96d56Sopenharmony_ci    PyObject *const *args,
957db96d56Sopenharmony_ci    Py_ssize_t nargs);
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyObject_CallOneArg(PyObject *func, PyObject *arg);
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyObject_VectorcallMethod(
1007db96d56Sopenharmony_ci    PyObject *name, PyObject *const *args,
1017db96d56Sopenharmony_ci    size_t nargsf, PyObject *kwnames);
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_cistatic inline PyObject *
1047db96d56Sopenharmony_ciPyObject_CallMethodNoArgs(PyObject *self, PyObject *name)
1057db96d56Sopenharmony_ci{
1067db96d56Sopenharmony_ci    size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;
1077db96d56Sopenharmony_ci    return PyObject_VectorcallMethod(name, &self, nargsf, _Py_NULL);
1087db96d56Sopenharmony_ci}
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_cistatic inline PyObject *
1117db96d56Sopenharmony_ciPyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg)
1127db96d56Sopenharmony_ci{
1137db96d56Sopenharmony_ci    PyObject *args[2] = {self, arg};
1147db96d56Sopenharmony_ci    size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET;
1157db96d56Sopenharmony_ci    assert(arg != NULL);
1167db96d56Sopenharmony_ci    return PyObject_VectorcallMethod(name, args, nargsf, _Py_NULL);
1177db96d56Sopenharmony_ci}
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_CallMethod(PyObject *obj,
1207db96d56Sopenharmony_ci                                            PyObject *name,
1217db96d56Sopenharmony_ci                                            const char *format, ...);
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci/* Like PyObject_CallMethod(), but expect a _Py_Identifier*
1247db96d56Sopenharmony_ci   as the method name. */
1257db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *obj,
1267db96d56Sopenharmony_ci                                              _Py_Identifier *name,
1277db96d56Sopenharmony_ci                                              const char *format, ...);
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *obj,
1307db96d56Sopenharmony_ci                                                    _Py_Identifier *name,
1317db96d56Sopenharmony_ci                                                    const char *format,
1327db96d56Sopenharmony_ci                                                    ...);
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyObject_CallMethodIdObjArgs(
1357db96d56Sopenharmony_ci    PyObject *obj,
1367db96d56Sopenharmony_ci    _Py_Identifier *name,
1377db96d56Sopenharmony_ci    ...);
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_cistatic inline PyObject *
1407db96d56Sopenharmony_ci_PyObject_VectorcallMethodId(
1417db96d56Sopenharmony_ci    _Py_Identifier *name, PyObject *const *args,
1427db96d56Sopenharmony_ci    size_t nargsf, PyObject *kwnames)
1437db96d56Sopenharmony_ci{
1447db96d56Sopenharmony_ci    PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
1457db96d56Sopenharmony_ci    if (!oname) {
1467db96d56Sopenharmony_ci        return _Py_NULL;
1477db96d56Sopenharmony_ci    }
1487db96d56Sopenharmony_ci    return PyObject_VectorcallMethod(oname, args, nargsf, kwnames);
1497db96d56Sopenharmony_ci}
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_cistatic inline PyObject *
1527db96d56Sopenharmony_ci_PyObject_CallMethodIdNoArgs(PyObject *self, _Py_Identifier *name)
1537db96d56Sopenharmony_ci{
1547db96d56Sopenharmony_ci    size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;
1557db96d56Sopenharmony_ci    return _PyObject_VectorcallMethodId(name, &self, nargsf, _Py_NULL);
1567db96d56Sopenharmony_ci}
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_cistatic inline PyObject *
1597db96d56Sopenharmony_ci_PyObject_CallMethodIdOneArg(PyObject *self, _Py_Identifier *name, PyObject *arg)
1607db96d56Sopenharmony_ci{
1617db96d56Sopenharmony_ci    PyObject *args[2] = {self, arg};
1627db96d56Sopenharmony_ci    size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET;
1637db96d56Sopenharmony_ci    assert(arg != NULL);
1647db96d56Sopenharmony_ci    return _PyObject_VectorcallMethodId(name, args, nargsf, _Py_NULL);
1657db96d56Sopenharmony_ci}
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyObject_HasLen(PyObject *o);
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci/* Guess the size of object 'o' using len(o) or o.__length_hint__().
1707db96d56Sopenharmony_ci   If neither of those return a non-negative value, then return the default
1717db96d56Sopenharmony_ci   value.  If one of the calls fails, this function returns -1. */
1727db96d56Sopenharmony_ciPyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t);
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci/* === Sequence protocol ================================================ */
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci/* Assume tp_as_sequence and sq_item exist and that 'i' does not
1777db96d56Sopenharmony_ci   need to be corrected for a negative index. */
1787db96d56Sopenharmony_ci#define PySequence_ITEM(o, i)\
1797db96d56Sopenharmony_ci    ( Py_TYPE(o)->tp_as_sequence->sq_item(o, i) )
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci#define PY_ITERSEARCH_COUNT    1
1827db96d56Sopenharmony_ci#define PY_ITERSEARCH_INDEX    2
1837db96d56Sopenharmony_ci#define PY_ITERSEARCH_CONTAINS 3
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci/* Iterate over seq.
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci   Result depends on the operation:
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ci   PY_ITERSEARCH_COUNT:  return # of times obj appears in seq; -1 if
1907db96d56Sopenharmony_ci     error.
1917db96d56Sopenharmony_ci   PY_ITERSEARCH_INDEX:  return 0-based index of first occurrence of
1927db96d56Sopenharmony_ci     obj in seq; set ValueError and return -1 if none found;
1937db96d56Sopenharmony_ci     also return -1 on error.
1947db96d56Sopenharmony_ci   PY_ITERSEARCH_CONTAINS:  return 1 if obj in seq, else 0; -1 on
1957db96d56Sopenharmony_ci     error. */
1967db96d56Sopenharmony_ciPyAPI_FUNC(Py_ssize_t) _PySequence_IterSearch(PyObject *seq,
1977db96d56Sopenharmony_ci                                              PyObject *obj, int operation);
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci/* === Mapping protocol ================================================= */
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyObject_RealIsInstance(PyObject *inst, PyObject *cls);
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls);
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ciPyAPI_FUNC(char *const *) _PySequence_BytesToCharpArray(PyObject* self);
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ciPyAPI_FUNC(void) _Py_FreeCharPArray(char *const array[]);
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci/* For internal use by buffer API functions */
2107db96d56Sopenharmony_ciPyAPI_FUNC(void) _Py_add_one_to_index_F(int nd, Py_ssize_t *index,
2117db96d56Sopenharmony_ci                                        const Py_ssize_t *shape);
2127db96d56Sopenharmony_ciPyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index,
2137db96d56Sopenharmony_ci                                        const Py_ssize_t *shape);
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci/* Convert Python int to Py_ssize_t. Do nothing if the argument is None. */
2167db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_convert_optional_to_ssize_t(PyObject *, void *);
2177db96d56Sopenharmony_ci
2187db96d56Sopenharmony_ci/* Same as PyNumber_Index but can return an instance of a subclass of int. */
2197db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyNumber_Index(PyObject *o);
220