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