blob: 2c4eae70b96901f68bef26981cf0bcecaaede882 [file] [log] [blame]
Victor Stinner40602832018-11-26 22:42:04 +01001#ifndef Py_CPYTHON_ABSTRACTOBJECT_H
2# error "this header file must not be included directly"
3#endif
4
5#ifdef __cplusplus
6extern "C" {
7#endif
8
9/* === Object Protocol ================================================== */
10
11#ifdef PY_SSIZE_T_CLEAN
12# define _PyObject_CallMethodId _PyObject_CallMethodId_SizeT
13#endif
14
Victor Stinner40602832018-11-26 22:42:04 +010015/* Convert keyword arguments from the FASTCALL (stack: C array, kwnames: tuple)
16 format to a Python dictionary ("kwargs" dict).
17
18 The type of kwnames keys is not checked. The final function getting
19 arguments is responsible to check if all keys are strings, for example using
20 PyArg_ParseTupleAndKeywords() or PyArg_ValidateKeywordArguments().
21
22 Duplicate keys are merged using the last value. If duplicate keys must raise
23 an exception, the caller is responsible to implement an explicit keys on
24 kwnames. */
25PyAPI_FUNC(PyObject *) _PyStack_AsDict(
26 PyObject *const *values,
27 PyObject *kwnames);
28
Victor Stinner40602832018-11-26 22:42:04 +010029/* Suggested size (number of positional arguments) for arrays of PyObject*
30 allocated on a C stack to avoid allocating memory on the heap memory. Such
31 array is used to pass positional arguments to call functions of the
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020032 _PyObject_Vectorcall() family.
Victor Stinner40602832018-11-26 22:42:04 +010033
34 The size is chosen to not abuse the C stack and so limit the risk of stack
35 overflow. The size is also chosen to allow using the small stack for most
36 function calls of the Python standard library. On 64-bit CPU, it allocates
37 40 bytes on the stack. */
38#define _PY_FASTCALL_SMALL_STACK 5
39
Victor Stinner17269092019-11-05 01:22:12 +010040PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult(
41 PyThreadState *tstate,
42 PyObject *callable,
43 PyObject *result,
44 const char *where);
Victor Stinner40602832018-11-26 22:42:04 +010045
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020046/* === Vectorcall protocol (PEP 590) ============================= */
47
48/* Call callable using tp_call. Arguments are like _PyObject_Vectorcall()
49 or _PyObject_FastCallDict() (both forms are supported),
50 except that nargs is plainly the number of arguments without flags. */
51PyAPI_FUNC(PyObject *) _PyObject_MakeTpCall(
Victor Stinner7e433732019-11-08 10:05:17 +010052 PyThreadState *tstate,
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020053 PyObject *callable,
54 PyObject *const *args, Py_ssize_t nargs,
55 PyObject *keywords);
56
57#define PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1))
58
59static inline Py_ssize_t
60PyVectorcall_NARGS(size_t n)
61{
62 return n & ~PY_VECTORCALL_ARGUMENTS_OFFSET;
63}
64
65static inline vectorcallfunc
66_PyVectorcall_Function(PyObject *callable)
67{
Jeroen Demeyer196a5302019-07-04 12:31:34 +020068 assert(callable != NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020069 PyTypeObject *tp = Py_TYPE(callable);
70 if (!PyType_HasFeature(tp, _Py_TPFLAGS_HAVE_VECTORCALL)) {
71 return NULL;
72 }
73 assert(PyCallable_Check(callable));
74 Py_ssize_t offset = tp->tp_vectorcall_offset;
75 assert(offset > 0);
76 vectorcallfunc *ptr = (vectorcallfunc *)(((char *)callable) + offset);
77 return *ptr;
78}
79
80/* Call the callable object 'callable' with the "vectorcall" calling
81 convention.
82
83 args is a C array for positional arguments.
84
85 nargsf is the number of positional arguments plus optionally the flag
86 PY_VECTORCALL_ARGUMENTS_OFFSET which means that the caller is allowed to
87 modify args[-1].
88
89 kwnames is a tuple of keyword names. The values of the keyword arguments
90 are stored in "args" after the positional arguments (note that the number
91 of keyword arguments does not change nargsf). kwnames can also be NULL if
92 there are no keyword arguments.
93
Jeroen Demeyer05677862019-08-16 12:41:27 +020094 keywords must only contain strings and all keys must be unique.
Victor Stinner40602832018-11-26 22:42:04 +010095
Rémi Lapeyreb4b97af2019-03-18 11:07:53 +010096 Return the result on success. Raise an exception and return NULL on
Victor Stinner40602832018-11-26 22:42:04 +010097 error. */
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020098static inline PyObject *
Victor Stinner7e433732019-11-08 10:05:17 +010099_PyObject_VectorcallTstate(PyThreadState *tstate, PyObject *callable,
100 PyObject *const *args, size_t nargsf,
101 PyObject *kwnames)
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200102{
103 assert(kwnames == NULL || PyTuple_Check(kwnames));
104 assert(args != NULL || PyVectorcall_NARGS(nargsf) == 0);
Victor Stinner17269092019-11-05 01:22:12 +0100105
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200106 vectorcallfunc func = _PyVectorcall_Function(callable);
107 if (func == NULL) {
108 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinner7e433732019-11-08 10:05:17 +0100109 return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200110 }
111 PyObject *res = func(callable, args, nargsf, kwnames);
Victor Stinner17269092019-11-05 01:22:12 +0100112 return _Py_CheckFunctionResult(tstate, callable, res, NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200113}
114
Victor Stinner7e433732019-11-08 10:05:17 +0100115static inline PyObject *
116_PyObject_Vectorcall(PyObject *callable, PyObject *const *args,
117 size_t nargsf, PyObject *kwnames)
118{
119 PyThreadState *tstate = PyThreadState_GET();
120 return _PyObject_VectorcallTstate(tstate, callable,
121 args, nargsf, kwnames);
122}
123
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200124/* Same as _PyObject_Vectorcall except that keyword arguments are passed as
125 dict, which may be NULL if there are no keyword arguments. */
Victor Stinner40602832018-11-26 22:42:04 +0100126PyAPI_FUNC(PyObject *) _PyObject_FastCallDict(
127 PyObject *callable,
128 PyObject *const *args,
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200129 size_t nargsf,
Victor Stinner40602832018-11-26 22:42:04 +0100130 PyObject *kwargs);
131
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200132/* Call "callable" (which must support vectorcall) with positional arguments
133 "tuple" and keyword arguments "dict". "dict" may also be NULL */
134PyAPI_FUNC(PyObject *) PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict);
Victor Stinner40602832018-11-26 22:42:04 +0100135
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200136/* Same as _PyObject_Vectorcall except without keyword arguments */
137static inline PyObject *
138_PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs)
139{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100140 PyThreadState *tstate = PyThreadState_GET();
141 return _PyObject_VectorcallTstate(tstate, func, args, (size_t)nargs, NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200142}
Victor Stinner40602832018-11-26 22:42:04 +0100143
Victor Stinner2ff58a22019-06-17 14:27:23 +0200144/* Call a callable without any arguments
145 Private static inline function variant of public function
146 PyObject_CallNoArgs(). */
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200147static inline PyObject *
148_PyObject_CallNoArg(PyObject *func) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100149 PyThreadState *tstate = PyThreadState_GET();
150 return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200151}
Victor Stinner40602832018-11-26 22:42:04 +0100152
Jeroen Demeyer196a5302019-07-04 12:31:34 +0200153static inline PyObject *
154_PyObject_CallOneArg(PyObject *func, PyObject *arg)
155{
156 assert(arg != NULL);
157 PyObject *_args[2];
158 PyObject **args = _args + 1; // For PY_VECTORCALL_ARGUMENTS_OFFSET
159 args[0] = arg;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100160 PyThreadState *tstate = PyThreadState_GET();
161 size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;
162 return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL);
Jeroen Demeyer196a5302019-07-04 12:31:34 +0200163}
164
Jeroen Demeyerb1263d52019-06-28 11:49:00 +0200165PyAPI_FUNC(PyObject *) _PyObject_VectorcallMethod(
166 PyObject *name, PyObject *const *args,
167 size_t nargsf, PyObject *kwnames);
168
Jeroen Demeyer762f93f2019-07-08 10:19:25 +0200169static inline PyObject *
170_PyObject_CallMethodNoArgs(PyObject *self, PyObject *name)
171{
172 return _PyObject_VectorcallMethod(name, &self,
173 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
174}
175
Jeroen Demeyer59ad1102019-07-11 10:59:05 +0200176static inline PyObject *
177_PyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg)
178{
179 assert(arg != NULL);
180 PyObject *args[2] = {self, arg};
181 return _PyObject_VectorcallMethod(name, args,
182 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
183}
184
Victor Stinner40602832018-11-26 22:42:04 +0100185/* Like PyObject_CallMethod(), but expect a _Py_Identifier*
186 as the method name. */
187PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *obj,
188 _Py_Identifier *name,
189 const char *format, ...);
190
191PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *obj,
192 _Py_Identifier *name,
193 const char *format,
194 ...);
195
196PyAPI_FUNC(PyObject *) _PyObject_CallMethodIdObjArgs(
197 PyObject *obj,
198 struct _Py_Identifier *name,
199 ...);
200
Jeroen Demeyerb1263d52019-06-28 11:49:00 +0200201static inline PyObject *
202_PyObject_VectorcallMethodId(
203 _Py_Identifier *name, PyObject *const *args,
204 size_t nargsf, PyObject *kwnames)
205{
206 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
207 if (!oname) {
208 return NULL;
209 }
210 return _PyObject_VectorcallMethod(oname, args, nargsf, kwnames);
211}
212
Jeroen Demeyer762f93f2019-07-08 10:19:25 +0200213static inline PyObject *
214_PyObject_CallMethodIdNoArgs(PyObject *self, _Py_Identifier *name)
215{
216 return _PyObject_VectorcallMethodId(name, &self,
217 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
218}
219
Jeroen Demeyer59ad1102019-07-11 10:59:05 +0200220static inline PyObject *
221_PyObject_CallMethodIdOneArg(PyObject *self, _Py_Identifier *name, PyObject *arg)
222{
223 assert(arg != NULL);
224 PyObject *args[2] = {self, arg};
225 return _PyObject_VectorcallMethodId(name, args,
226 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
227}
228
Victor Stinner40602832018-11-26 22:42:04 +0100229PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o);
230
231/* Guess the size of object 'o' using len(o) or o.__length_hint__().
232 If neither of those return a non-negative value, then return the default
233 value. If one of the calls fails, this function returns -1. */
234PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t);
235
236/* === New Buffer API ============================================ */
237
238/* Return 1 if the getbuffer function is available, otherwise return 0. */
239#define PyObject_CheckBuffer(obj) \
240 (((obj)->ob_type->tp_as_buffer != NULL) && \
241 ((obj)->ob_type->tp_as_buffer->bf_getbuffer != NULL))
242
243/* This is a C-API version of the getbuffer function call. It checks
244 to make sure object has the required function pointer and issues the
245 call.
246
247 Returns -1 and raises an error on failure and returns 0 on success. */
248PyAPI_FUNC(int) PyObject_GetBuffer(PyObject *obj, Py_buffer *view,
249 int flags);
250
251/* Get the memory area pointed to by the indices for the buffer given.
252 Note that view->ndim is the assumed size of indices. */
253PyAPI_FUNC(void *) PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices);
254
255/* Return the implied itemsize of the data-format area from a
256 struct-style description. */
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -0300257PyAPI_FUNC(Py_ssize_t) PyBuffer_SizeFromFormat(const char *format);
Victor Stinner40602832018-11-26 22:42:04 +0100258
259/* Implementation in memoryobject.c */
260PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, Py_buffer *view,
261 Py_ssize_t len, char order);
262
263PyAPI_FUNC(int) PyBuffer_FromContiguous(Py_buffer *view, void *buf,
264 Py_ssize_t len, char order);
265
266/* Copy len bytes of data from the contiguous chunk of memory
267 pointed to by buf into the buffer exported by obj. Return
268 0 on success and return -1 and raise a PyBuffer_Error on
269 error (i.e. the object does not have a buffer interface or
270 it is not working).
271
272 If fort is 'F', then if the object is multi-dimensional,
273 then the data will be copied into the array in
274 Fortran-style (first dimension varies the fastest). If
275 fort is 'C', then the data will be copied into the array
276 in C-style (last dimension varies the fastest). If fort
277 is 'A', then it does not matter and the copy will be made
278 in whatever way is more efficient. */
279PyAPI_FUNC(int) PyObject_CopyData(PyObject *dest, PyObject *src);
280
281/* Copy the data from the src buffer to the buffer of destination. */
282PyAPI_FUNC(int) PyBuffer_IsContiguous(const Py_buffer *view, char fort);
283
284/*Fill the strides array with byte-strides of a contiguous
285 (Fortran-style if fort is 'F' or C-style otherwise)
286 array of the given shape with the given number of bytes
287 per element. */
288PyAPI_FUNC(void) PyBuffer_FillContiguousStrides(int ndims,
289 Py_ssize_t *shape,
290 Py_ssize_t *strides,
291 int itemsize,
292 char fort);
293
294/* Fills in a buffer-info structure correctly for an exporter
295 that can only share a contiguous chunk of memory of
296 "unsigned bytes" of the given length.
297
298 Returns 0 on success and -1 (with raising an error) on error. */
299PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf,
300 Py_ssize_t len, int readonly,
301 int flags);
302
303/* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */
304PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view);
305
306/* ==== Iterators ================================================ */
307
308#define PyIter_Check(obj) \
309 ((obj)->ob_type->tp_iternext != NULL && \
310 (obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented)
311
312/* === Number Protocol ================================================== */
313
314#define PyIndex_Check(obj) \
315 ((obj)->ob_type->tp_as_number != NULL && \
316 (obj)->ob_type->tp_as_number->nb_index != NULL)
317
318/* === Sequence protocol ================================================ */
319
320/* Assume tp_as_sequence and sq_item exist and that 'i' does not
321 need to be corrected for a negative index. */
322#define PySequence_ITEM(o, i)\
323 ( Py_TYPE(o)->tp_as_sequence->sq_item(o, i) )
324
325#define PY_ITERSEARCH_COUNT 1
326#define PY_ITERSEARCH_INDEX 2
327#define PY_ITERSEARCH_CONTAINS 3
328
329/* Iterate over seq.
330
331 Result depends on the operation:
332
333 PY_ITERSEARCH_COUNT: return # of times obj appears in seq; -1 if
334 error.
335 PY_ITERSEARCH_INDEX: return 0-based index of first occurrence of
336 obj in seq; set ValueError and return -1 if none found;
337 also return -1 on error.
338 PY_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on
339 error. */
340PyAPI_FUNC(Py_ssize_t) _PySequence_IterSearch(PyObject *seq,
341 PyObject *obj, int operation);
342
343/* === Mapping protocol ================================================= */
344
345PyAPI_FUNC(int) _PyObject_RealIsInstance(PyObject *inst, PyObject *cls);
346
347PyAPI_FUNC(int) _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls);
348
349PyAPI_FUNC(char *const *) _PySequence_BytesToCharpArray(PyObject* self);
350
351PyAPI_FUNC(void) _Py_FreeCharPArray(char *const array[]);
352
353/* For internal use by buffer API functions */
354PyAPI_FUNC(void) _Py_add_one_to_index_F(int nd, Py_ssize_t *index,
355 const Py_ssize_t *shape);
356PyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index,
357 const Py_ssize_t *shape);
358
359/* Convert Python int to Py_ssize_t. Do nothing if the argument is None. */
360PyAPI_FUNC(int) _Py_convert_optional_to_ssize_t(PyObject *, void *);
361
362#ifdef __cplusplus
363}
364#endif