blob: 415f3e15f974aed04c0be3d1507eaf52aecf98e9 [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
29/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple).
30
31 Return 0 on success, raise an exception and return -1 on error.
32
33 Write the new stack into *p_stack. If *p_stack is differen than args, it
34 must be released by PyMem_Free().
35
36 The stack uses borrowed references.
37
38 The type of keyword keys is not checked, these checks should be done
39 later (ex: _PyArg_ParseStackAndKeywords). */
40PyAPI_FUNC(int) _PyStack_UnpackDict(
41 PyObject *const *args,
42 Py_ssize_t nargs,
43 PyObject *kwargs,
44 PyObject *const **p_stack,
45 PyObject **p_kwnames);
46
47/* Suggested size (number of positional arguments) for arrays of PyObject*
48 allocated on a C stack to avoid allocating memory on the heap memory. Such
49 array is used to pass positional arguments to call functions of the
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020050 _PyObject_Vectorcall() family.
Victor Stinner40602832018-11-26 22:42:04 +010051
52 The size is chosen to not abuse the C stack and so limit the risk of stack
53 overflow. The size is also chosen to allow using the small stack for most
54 function calls of the Python standard library. On 64-bit CPU, it allocates
55 40 bytes on the stack. */
56#define _PY_FASTCALL_SMALL_STACK 5
57
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020058PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult(PyObject *callable,
59 PyObject *result,
60 const char *where);
Victor Stinner40602832018-11-26 22:42:04 +010061
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020062/* === Vectorcall protocol (PEP 590) ============================= */
63
64/* Call callable using tp_call. Arguments are like _PyObject_Vectorcall()
65 or _PyObject_FastCallDict() (both forms are supported),
66 except that nargs is plainly the number of arguments without flags. */
67PyAPI_FUNC(PyObject *) _PyObject_MakeTpCall(
68 PyObject *callable,
69 PyObject *const *args, Py_ssize_t nargs,
70 PyObject *keywords);
71
72#define PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1))
73
74static inline Py_ssize_t
75PyVectorcall_NARGS(size_t n)
76{
77 return n & ~PY_VECTORCALL_ARGUMENTS_OFFSET;
78}
79
80static inline vectorcallfunc
81_PyVectorcall_Function(PyObject *callable)
82{
83 PyTypeObject *tp = Py_TYPE(callable);
84 if (!PyType_HasFeature(tp, _Py_TPFLAGS_HAVE_VECTORCALL)) {
85 return NULL;
86 }
87 assert(PyCallable_Check(callable));
88 Py_ssize_t offset = tp->tp_vectorcall_offset;
89 assert(offset > 0);
90 vectorcallfunc *ptr = (vectorcallfunc *)(((char *)callable) + offset);
91 return *ptr;
92}
93
94/* Call the callable object 'callable' with the "vectorcall" calling
95 convention.
96
97 args is a C array for positional arguments.
98
99 nargsf is the number of positional arguments plus optionally the flag
100 PY_VECTORCALL_ARGUMENTS_OFFSET which means that the caller is allowed to
101 modify args[-1].
102
103 kwnames is a tuple of keyword names. The values of the keyword arguments
104 are stored in "args" after the positional arguments (note that the number
105 of keyword arguments does not change nargsf). kwnames can also be NULL if
106 there are no keyword arguments.
107
108 keywords must only contains str strings (no subclass), and all keys must
109 be unique.
Victor Stinner40602832018-11-26 22:42:04 +0100110
Rémi Lapeyreb4b97af2019-03-18 11:07:53 +0100111 Return the result on success. Raise an exception and return NULL on
Victor Stinner40602832018-11-26 22:42:04 +0100112 error. */
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200113static inline PyObject *
114_PyObject_Vectorcall(PyObject *callable, PyObject *const *args,
115 size_t nargsf, PyObject *kwnames)
116{
117 assert(kwnames == NULL || PyTuple_Check(kwnames));
118 assert(args != NULL || PyVectorcall_NARGS(nargsf) == 0);
119 vectorcallfunc func = _PyVectorcall_Function(callable);
120 if (func == NULL) {
121 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
122 return _PyObject_MakeTpCall(callable, args, nargs, kwnames);
123 }
124 PyObject *res = func(callable, args, nargsf, kwnames);
125 return _Py_CheckFunctionResult(callable, res, NULL);
126}
127
128/* Same as _PyObject_Vectorcall except that keyword arguments are passed as
129 dict, which may be NULL if there are no keyword arguments. */
Victor Stinner40602832018-11-26 22:42:04 +0100130PyAPI_FUNC(PyObject *) _PyObject_FastCallDict(
131 PyObject *callable,
132 PyObject *const *args,
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200133 size_t nargsf,
Victor Stinner40602832018-11-26 22:42:04 +0100134 PyObject *kwargs);
135
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200136/* Call "callable" (which must support vectorcall) with positional arguments
137 "tuple" and keyword arguments "dict". "dict" may also be NULL */
138PyAPI_FUNC(PyObject *) PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict);
Victor Stinner40602832018-11-26 22:42:04 +0100139
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200140/* Same as _PyObject_Vectorcall except without keyword arguments */
141static inline PyObject *
142_PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs)
143{
144 return _PyObject_Vectorcall(func, args, (size_t)nargs, NULL);
145}
Victor Stinner40602832018-11-26 22:42:04 +0100146
Victor Stinner2ff58a22019-06-17 14:27:23 +0200147/* Call a callable without any arguments
148 Private static inline function variant of public function
149 PyObject_CallNoArgs(). */
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200150static inline PyObject *
151_PyObject_CallNoArg(PyObject *func) {
152 return _PyObject_Vectorcall(func, NULL, 0, NULL);
153}
Victor Stinner40602832018-11-26 22:42:04 +0100154
155PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend(
156 PyObject *callable,
157 PyObject *obj,
158 PyObject *args,
159 PyObject *kwargs);
160
Victor Stinner40602832018-11-26 22:42:04 +0100161/* Like PyObject_CallMethod(), but expect a _Py_Identifier*
162 as the method name. */
163PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *obj,
164 _Py_Identifier *name,
165 const char *format, ...);
166
167PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *obj,
168 _Py_Identifier *name,
169 const char *format,
170 ...);
171
172PyAPI_FUNC(PyObject *) _PyObject_CallMethodIdObjArgs(
173 PyObject *obj,
174 struct _Py_Identifier *name,
175 ...);
176
177PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o);
178
179/* Guess the size of object 'o' using len(o) or o.__length_hint__().
180 If neither of those return a non-negative value, then return the default
181 value. If one of the calls fails, this function returns -1. */
182PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t);
183
184/* === New Buffer API ============================================ */
185
186/* Return 1 if the getbuffer function is available, otherwise return 0. */
187#define PyObject_CheckBuffer(obj) \
188 (((obj)->ob_type->tp_as_buffer != NULL) && \
189 ((obj)->ob_type->tp_as_buffer->bf_getbuffer != NULL))
190
191/* This is a C-API version of the getbuffer function call. It checks
192 to make sure object has the required function pointer and issues the
193 call.
194
195 Returns -1 and raises an error on failure and returns 0 on success. */
196PyAPI_FUNC(int) PyObject_GetBuffer(PyObject *obj, Py_buffer *view,
197 int flags);
198
199/* Get the memory area pointed to by the indices for the buffer given.
200 Note that view->ndim is the assumed size of indices. */
201PyAPI_FUNC(void *) PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices);
202
203/* Return the implied itemsize of the data-format area from a
204 struct-style description. */
205PyAPI_FUNC(int) PyBuffer_SizeFromFormat(const char *);
206
207/* Implementation in memoryobject.c */
208PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, Py_buffer *view,
209 Py_ssize_t len, char order);
210
211PyAPI_FUNC(int) PyBuffer_FromContiguous(Py_buffer *view, void *buf,
212 Py_ssize_t len, char order);
213
214/* Copy len bytes of data from the contiguous chunk of memory
215 pointed to by buf into the buffer exported by obj. Return
216 0 on success and return -1 and raise a PyBuffer_Error on
217 error (i.e. the object does not have a buffer interface or
218 it is not working).
219
220 If fort is 'F', then if the object is multi-dimensional,
221 then the data will be copied into the array in
222 Fortran-style (first dimension varies the fastest). If
223 fort is 'C', then the data will be copied into the array
224 in C-style (last dimension varies the fastest). If fort
225 is 'A', then it does not matter and the copy will be made
226 in whatever way is more efficient. */
227PyAPI_FUNC(int) PyObject_CopyData(PyObject *dest, PyObject *src);
228
229/* Copy the data from the src buffer to the buffer of destination. */
230PyAPI_FUNC(int) PyBuffer_IsContiguous(const Py_buffer *view, char fort);
231
232/*Fill the strides array with byte-strides of a contiguous
233 (Fortran-style if fort is 'F' or C-style otherwise)
234 array of the given shape with the given number of bytes
235 per element. */
236PyAPI_FUNC(void) PyBuffer_FillContiguousStrides(int ndims,
237 Py_ssize_t *shape,
238 Py_ssize_t *strides,
239 int itemsize,
240 char fort);
241
242/* Fills in a buffer-info structure correctly for an exporter
243 that can only share a contiguous chunk of memory of
244 "unsigned bytes" of the given length.
245
246 Returns 0 on success and -1 (with raising an error) on error. */
247PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf,
248 Py_ssize_t len, int readonly,
249 int flags);
250
251/* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */
252PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view);
253
254/* ==== Iterators ================================================ */
255
256#define PyIter_Check(obj) \
257 ((obj)->ob_type->tp_iternext != NULL && \
258 (obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented)
259
260/* === Number Protocol ================================================== */
261
262#define PyIndex_Check(obj) \
263 ((obj)->ob_type->tp_as_number != NULL && \
264 (obj)->ob_type->tp_as_number->nb_index != NULL)
265
266/* === Sequence protocol ================================================ */
267
268/* Assume tp_as_sequence and sq_item exist and that 'i' does not
269 need to be corrected for a negative index. */
270#define PySequence_ITEM(o, i)\
271 ( Py_TYPE(o)->tp_as_sequence->sq_item(o, i) )
272
273#define PY_ITERSEARCH_COUNT 1
274#define PY_ITERSEARCH_INDEX 2
275#define PY_ITERSEARCH_CONTAINS 3
276
277/* Iterate over seq.
278
279 Result depends on the operation:
280
281 PY_ITERSEARCH_COUNT: return # of times obj appears in seq; -1 if
282 error.
283 PY_ITERSEARCH_INDEX: return 0-based index of first occurrence of
284 obj in seq; set ValueError and return -1 if none found;
285 also return -1 on error.
286 PY_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on
287 error. */
288PyAPI_FUNC(Py_ssize_t) _PySequence_IterSearch(PyObject *seq,
289 PyObject *obj, int operation);
290
291/* === Mapping protocol ================================================= */
292
293PyAPI_FUNC(int) _PyObject_RealIsInstance(PyObject *inst, PyObject *cls);
294
295PyAPI_FUNC(int) _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls);
296
297PyAPI_FUNC(char *const *) _PySequence_BytesToCharpArray(PyObject* self);
298
299PyAPI_FUNC(void) _Py_FreeCharPArray(char *const array[]);
300
301/* For internal use by buffer API functions */
302PyAPI_FUNC(void) _Py_add_one_to_index_F(int nd, Py_ssize_t *index,
303 const Py_ssize_t *shape);
304PyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index,
305 const Py_ssize_t *shape);
306
307/* Convert Python int to Py_ssize_t. Do nothing if the argument is None. */
308PyAPI_FUNC(int) _Py_convert_optional_to_ssize_t(PyObject *, void *);
309
310#ifdef __cplusplus
311}
312#endif