blob: ae08d1824468daa8b9e760e1edbf079efdd05801 [file] [log] [blame]
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001#include "Python.h"
Victor Stinner4d231bc2019-11-14 13:36:21 +01002#include "pycore_call.h"
Victor Stinnerb9e68122019-11-14 12:20:46 +01003#include "pycore_ceval.h" /* _PyEval_EvalFrame() */
Victor Stinnerbcda8f12018-11-21 22:27:47 +01004#include "pycore_object.h"
Victor Stinnerbe434dc2019-11-05 00:51:22 +01005#include "pycore_pyerrors.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01006#include "pycore_pystate.h"
Victor Stinnerec13b932018-11-25 23:56:17 +01007#include "pycore_tupleobject.h"
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01008#include "frameobject.h"
9
10
Jeroen Demeyerd4efd912019-07-02 11:49:40 +020011static PyObject *const *
Victor Stinner17269092019-11-05 01:22:12 +010012_PyStack_UnpackDict(PyThreadState *tstate,
13 PyObject *const *args, Py_ssize_t nargs,
14 PyObject *kwargs, PyObject **p_kwnames);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +020015
16static void
17_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs,
18 PyObject *kwnames);
19
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020020
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010021static PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +010022null_error(PyThreadState *tstate)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010023{
Victor Stinner4d231bc2019-11-14 13:36:21 +010024 if (!_PyErr_Occurred(tstate)) {
25 _PyErr_SetString(tstate, PyExc_SystemError,
26 "null argument to internal routine");
27 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010028 return NULL;
29}
30
31
32PyObject*
Victor Stinner17269092019-11-05 01:22:12 +010033_Py_CheckFunctionResult(PyThreadState *tstate, PyObject *callable,
34 PyObject *result, const char *where)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010035{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010036 assert((callable != NULL) ^ (where != NULL));
37
38 if (result == NULL) {
Victor Stinnerd12d0e72019-11-07 12:42:07 +010039 if (!_PyErr_Occurred(tstate)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010040 if (callable)
Victor Stinner17269092019-11-05 01:22:12 +010041 _PyErr_Format(tstate, PyExc_SystemError,
42 "%R returned NULL without setting an error",
43 callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010044 else
Victor Stinner17269092019-11-05 01:22:12 +010045 _PyErr_Format(tstate, PyExc_SystemError,
46 "%s returned NULL without setting an error",
47 where);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010048#ifdef Py_DEBUG
49 /* Ensure that the bug is caught in debug mode */
50 Py_FatalError("a function returned NULL without setting an error");
51#endif
52 return NULL;
53 }
54 }
55 else {
Victor Stinnerd12d0e72019-11-07 12:42:07 +010056 if (_PyErr_Occurred(tstate)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010057 Py_DECREF(result);
58
59 if (callable) {
Victor Stinner17269092019-11-05 01:22:12 +010060 _PyErr_FormatFromCauseTstate(
61 tstate, PyExc_SystemError,
62 "%R returned a result with an error set", callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010063 }
64 else {
Victor Stinner17269092019-11-05 01:22:12 +010065 _PyErr_FormatFromCauseTstate(
66 tstate, PyExc_SystemError,
67 "%s returned a result with an error set", where);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010068 }
69#ifdef Py_DEBUG
70 /* Ensure that the bug is caught in debug mode */
71 Py_FatalError("a function returned a result with an error set");
72#endif
73 return NULL;
74 }
75 }
76 return result;
77}
78
79
80/* --- Core PyObject call functions ------------------------------- */
81
Victor Stinner2ff58a22019-06-17 14:27:23 +020082/* Call a callable Python object without any arguments */
83PyObject *
84PyObject_CallNoArgs(PyObject *func)
85{
Victor Stinner4d231bc2019-11-14 13:36:21 +010086 PyThreadState *tstate = _PyThreadState_GET();
87 return _PyObject_CallNoArgTstate(tstate, func);
Victor Stinner2ff58a22019-06-17 14:27:23 +020088}
89
90
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010091PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +010092_PyObject_FastCallDictTstate(PyThreadState *tstate, PyObject *callable,
93 PyObject *const *args, size_t nargsf,
94 PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010095{
Victor Stinner17269092019-11-05 01:22:12 +010096 assert(callable != NULL);
97
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010098 /* _PyObject_FastCallDict() must not be called with an exception set,
99 because it can clear it (directly or indirectly) and so the
100 caller loses its exception */
Victor Stinner17269092019-11-05 01:22:12 +0100101 assert(!_PyErr_Occurred(tstate));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200102
103 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100104 assert(nargs >= 0);
105 assert(nargs == 0 || args != NULL);
106 assert(kwargs == NULL || PyDict_Check(kwargs));
107
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200108 vectorcallfunc func = _PyVectorcall_Function(callable);
109 if (func == NULL) {
110 /* Use tp_call instead */
Victor Stinner7e433732019-11-08 10:05:17 +0100111 return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100112 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200113
114 PyObject *res;
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200115 if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200116 res = func(callable, args, nargsf, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100117 }
118 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200119 PyObject *kwnames;
120 PyObject *const *newargs;
Victor Stinner17269092019-11-05 01:22:12 +0100121 newargs = _PyStack_UnpackDict(tstate,
122 args, nargs,
123 kwargs, &kwnames);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200124 if (newargs == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100125 return NULL;
126 }
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200127 res = func(callable, newargs,
128 nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
129 _PyStack_UnpackDict_Free(newargs, nargs, kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100130 }
Victor Stinner17269092019-11-05 01:22:12 +0100131 return _Py_CheckFunctionResult(tstate, callable, res, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100132}
133
134
135PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +0100136_PyObject_FastCallDict(PyObject *callable, PyObject *const *args,
137 size_t nargsf, PyObject *kwargs)
138{
139 PyThreadState *tstate = _PyThreadState_GET();
140 return _PyObject_FastCallDictTstate(tstate, callable, args, nargsf, kwargs);
141}
142
143
144PyObject *
Victor Stinner7e433732019-11-08 10:05:17 +0100145_PyObject_MakeTpCall(PyThreadState *tstate, PyObject *callable,
146 PyObject *const *args, Py_ssize_t nargs,
147 PyObject *keywords)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100148{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100149 assert(nargs >= 0);
150 assert(nargs == 0 || args != NULL);
151 assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords));
152
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200153 /* Slow path: build a temporary tuple for positional arguments and a
154 * temporary dictionary for keyword arguments (if any) */
155 ternaryfunc call = Py_TYPE(callable)->tp_call;
156 if (call == NULL) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100157 _PyErr_Format(tstate, PyExc_TypeError,
158 "'%.200s' object is not callable",
159 Py_TYPE(callable)->tp_name);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200160 return NULL;
161 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100162
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200163 PyObject *argstuple = _PyTuple_FromArray(args, nargs);
164 if (argstuple == NULL) {
165 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100166 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200167
168 PyObject *kwdict;
169 if (keywords == NULL || PyDict_Check(keywords)) {
170 kwdict = keywords;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100171 }
172 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200173 if (PyTuple_GET_SIZE(keywords)) {
174 assert(args != NULL);
175 kwdict = _PyStack_AsDict(args + nargs, keywords);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100176 if (kwdict == NULL) {
177 Py_DECREF(argstuple);
178 return NULL;
179 }
180 }
181 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200182 keywords = kwdict = NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100183 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100184 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200185
186 PyObject *result = NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100187 if (_Py_EnterRecursiveCall(tstate, " while calling a Python object") == 0)
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200188 {
189 result = call(callable, argstuple, kwdict);
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100190 _Py_LeaveRecursiveCall(tstate);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200191 }
192
193 Py_DECREF(argstuple);
194 if (kwdict != keywords) {
195 Py_DECREF(kwdict);
196 }
197
Victor Stinner4d231bc2019-11-14 13:36:21 +0100198 return _Py_CheckFunctionResult(tstate, callable, result, NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200199}
200
201
202PyObject *
203PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs)
204{
Victor Stinner17269092019-11-05 01:22:12 +0100205 PyThreadState *tstate = _PyThreadState_GET();
206
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200207 /* get vectorcallfunc as in _PyVectorcall_Function, but without
208 * the _Py_TPFLAGS_HAVE_VECTORCALL check */
209 Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset;
Jeroen Demeyera8b27e62019-06-24 12:41:05 +0200210 if (offset <= 0) {
Victor Stinner17269092019-11-05 01:22:12 +0100211 _PyErr_Format(tstate, PyExc_TypeError,
212 "'%.200s' object does not support vectorcall",
213 Py_TYPE(callable)->tp_name);
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200214 return NULL;
215 }
216 vectorcallfunc func = *(vectorcallfunc *)(((char *)callable) + offset);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200217 if (func == NULL) {
Victor Stinner17269092019-11-05 01:22:12 +0100218 _PyErr_Format(tstate, PyExc_TypeError,
219 "'%.200s' object does not support vectorcall",
220 Py_TYPE(callable)->tp_name);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200221 return NULL;
222 }
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200223
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200224 Py_ssize_t nargs = PyTuple_GET_SIZE(tuple);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200225
226 /* Fast path for no keywords */
227 if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
228 return func(callable, _PyTuple_ITEMS(tuple), nargs, NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200229 }
230
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200231 /* Convert arguments & call */
232 PyObject *const *args;
233 PyObject *kwnames;
Victor Stinner17269092019-11-05 01:22:12 +0100234 args = _PyStack_UnpackDict(tstate,
235 _PyTuple_ITEMS(tuple), nargs,
236 kwargs, &kwnames);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200237 if (args == NULL) {
238 return NULL;
239 }
240 PyObject *result = func(callable, args,
241 nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
242 _PyStack_UnpackDict_Free(args, nargs, kwnames);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100243
Victor Stinner17269092019-11-05 01:22:12 +0100244 return _Py_CheckFunctionResult(tstate, callable, result, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100245}
246
247
248PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +0100249_PyObject_Call(PyThreadState *tstate, PyObject *callable,
250 PyObject *args, PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100251{
252 ternaryfunc call;
253 PyObject *result;
254
255 /* PyObject_Call() must not be called with an exception set,
256 because it can clear it (directly or indirectly) and so the
257 caller loses its exception */
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100258 assert(!_PyErr_Occurred(tstate));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100259 assert(PyTuple_Check(args));
260 assert(kwargs == NULL || PyDict_Check(kwargs));
261
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200262 if (_PyVectorcall_Function(callable) != NULL) {
263 return PyVectorcall_Call(callable, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100264 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100265 else {
266 call = callable->ob_type->tp_call;
267 if (call == NULL) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100268 _PyErr_Format(tstate, PyExc_TypeError,
269 "'%.200s' object is not callable",
270 callable->ob_type->tp_name);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100271 return NULL;
272 }
273
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100274 if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100275 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100276 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100277
278 result = (*call)(callable, args, kwargs);
279
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100280 _Py_LeaveRecursiveCall(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100281
Victor Stinner17269092019-11-05 01:22:12 +0100282 return _Py_CheckFunctionResult(tstate, callable, result, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100283 }
284}
285
Victor Stinner4d231bc2019-11-14 13:36:21 +0100286PyObject *
287PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
288{
289 PyThreadState *tstate = _PyThreadState_GET();
290 return _PyObject_Call(tstate, callable, args, kwargs);
291}
292
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100293
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +0200294PyObject *
295PyCFunction_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
296{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100297 PyThreadState *tstate = _PyThreadState_GET();
298 return _PyObject_Call(tstate, callable, args, kwargs);
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +0200299}
300
301
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100302/* --- PyFunction call functions ---------------------------------- */
303
304static PyObject* _Py_HOT_FUNCTION
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200305function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100306 PyObject *globals)
307{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100308 assert(globals != NULL);
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100309
310 PyThreadState *tstate = _PyThreadState_GET();
311 assert(tstate != NULL);
312
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100313 /* XXX Perhaps we should create a specialized
314 _PyFrame_New_NoTrack() that doesn't take locals, but does
315 take builtins without sanity checking them.
316 */
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100317 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, globals, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100318 if (f == NULL) {
319 return NULL;
320 }
321
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100322 PyObject **fastlocals = f->f_localsplus;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100323
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100324 for (Py_ssize_t i = 0; i < nargs; i++) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100325 Py_INCREF(*args);
326 fastlocals[i] = *args++;
327 }
Victor Stinnerb9e68122019-11-14 12:20:46 +0100328 PyObject *result = _PyEval_EvalFrame(tstate, f, 0);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100329
330 if (Py_REFCNT(f) > 1) {
331 Py_DECREF(f);
332 _PyObject_GC_TRACK(f);
333 }
334 else {
335 ++tstate->recursion_depth;
336 Py_DECREF(f);
337 --tstate->recursion_depth;
338 }
339 return result;
340}
341
342
343PyObject *
Jeroen Demeyer37788bc2019-05-30 15:11:22 +0200344_PyFunction_Vectorcall(PyObject *func, PyObject* const* stack,
345 size_t nargsf, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100346{
347 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
348 PyObject *globals = PyFunction_GET_GLOBALS(func);
349 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
350 PyObject *kwdefs, *closure, *name, *qualname;
351 PyObject **d;
352 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
353 Py_ssize_t nd;
354
355 assert(PyFunction_Check(func));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200356 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100357 assert(nargs >= 0);
358 assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
359 assert((nargs == 0 && nkwargs == 0) || stack != NULL);
Jeroen Demeyer05677862019-08-16 12:41:27 +0200360 /* kwnames must only contain strings and all keys must be unique */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100361
362 if (co->co_kwonlyargcount == 0 && nkwargs == 0 &&
Victor Stinner086c3ae2017-10-25 05:26:17 -0700363 (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100364 {
Pablo Galindocd74e662019-06-01 18:08:04 +0100365 if (argdefs == NULL && co->co_argcount == nargs) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100366 return function_code_fastcall(co, stack, nargs, globals);
367 }
368 else if (nargs == 0 && argdefs != NULL
Pablo Galindocd74e662019-06-01 18:08:04 +0100369 && co->co_argcount == PyTuple_GET_SIZE(argdefs)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100370 /* function called with no arguments, but all parameters have
371 a default value: use default values as arguments .*/
Victor Stinnerd17a6932018-11-09 16:56:48 +0100372 stack = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200373 return function_code_fastcall(co, stack, PyTuple_GET_SIZE(argdefs),
374 globals);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100375 }
376 }
377
378 kwdefs = PyFunction_GET_KW_DEFAULTS(func);
379 closure = PyFunction_GET_CLOSURE(func);
380 name = ((PyFunctionObject *)func) -> func_name;
381 qualname = ((PyFunctionObject *)func) -> func_qualname;
382
383 if (argdefs != NULL) {
Victor Stinnerd17a6932018-11-09 16:56:48 +0100384 d = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200385 nd = PyTuple_GET_SIZE(argdefs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100386 }
387 else {
388 d = NULL;
389 nd = 0;
390 }
391 return _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
392 stack, nargs,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100393 nkwargs ? _PyTuple_ITEMS(kwnames) : NULL,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100394 stack + nargs,
395 nkwargs, 1,
396 d, (int)nd, kwdefs,
397 closure, name, qualname);
398}
399
400
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100401/* --- More complex call functions -------------------------------- */
402
403/* External interface to call any callable object.
404 The args must be a tuple or NULL. The kwargs must be a dict or NULL. */
405PyObject *
406PyEval_CallObjectWithKeywords(PyObject *callable,
407 PyObject *args, PyObject *kwargs)
408{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100409 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100410#ifdef Py_DEBUG
411 /* PyEval_CallObjectWithKeywords() must not be called with an exception
412 set. It raises a new exception if parameters are invalid or if
413 PyTuple_New() fails, and so the original exception is lost. */
Victor Stinner4d231bc2019-11-14 13:36:21 +0100414 assert(!_PyErr_Occurred(tstate));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100415#endif
416
INADA Naoki3824cd82017-03-01 20:41:03 +0900417 if (args != NULL && !PyTuple_Check(args)) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100418 _PyErr_SetString(tstate, PyExc_TypeError,
419 "argument list must be a tuple");
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100420 return NULL;
421 }
422
423 if (kwargs != NULL && !PyDict_Check(kwargs)) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100424 _PyErr_SetString(tstate, PyExc_TypeError,
425 "keyword list must be a dictionary");
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100426 return NULL;
427 }
428
INADA Naoki3824cd82017-03-01 20:41:03 +0900429 if (args == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100430 return _PyObject_FastCallDictTstate(tstate, callable, NULL, 0, kwargs);
INADA Naoki3824cd82017-03-01 20:41:03 +0900431 }
432 else {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100433 return _PyObject_Call(tstate, callable, args, kwargs);
INADA Naoki3824cd82017-03-01 20:41:03 +0900434 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100435}
436
437
438PyObject *
439PyObject_CallObject(PyObject *callable, PyObject *args)
440{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100441 PyThreadState *tstate = _PyThreadState_GET();
442 assert(!_PyErr_Occurred(tstate));
Jeroen Demeyer1dbd0842019-07-11 17:57:32 +0200443 if (args == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100444 return _PyObject_CallNoArgTstate(tstate, callable);
Jeroen Demeyer1dbd0842019-07-11 17:57:32 +0200445 }
446 if (!PyTuple_Check(args)) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100447 _PyErr_SetString(tstate, PyExc_TypeError,
448 "argument list must be a tuple");
Jeroen Demeyer1dbd0842019-07-11 17:57:32 +0200449 return NULL;
450 }
Victor Stinner4d231bc2019-11-14 13:36:21 +0100451 return _PyObject_Call(tstate, callable, args, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100452}
453
454
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100455/* Call callable(obj, *args, **kwargs). */
456PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +0100457_PyObject_Call_Prepend(PyThreadState *tstate, PyObject *callable,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100458 PyObject *obj, PyObject *args, PyObject *kwargs)
459{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100460 assert(PyTuple_Check(args));
461
Victor Stinner4d231bc2019-11-14 13:36:21 +0100462 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
463 PyObject **stack;
464
465 Py_ssize_t argcount = PyTuple_GET_SIZE(args);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100466 if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
467 stack = small_stack;
468 }
469 else {
470 stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
471 if (stack == NULL) {
472 PyErr_NoMemory();
473 return NULL;
474 }
475 }
476
477 /* use borrowed references */
478 stack[0] = obj;
479 memcpy(&stack[1],
Victor Stinnerd17a6932018-11-09 16:56:48 +0100480 _PyTuple_ITEMS(args),
481 argcount * sizeof(PyObject *));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100482
Victor Stinner4d231bc2019-11-14 13:36:21 +0100483 PyObject *result = _PyObject_FastCallDictTstate(tstate, callable,
484 stack, argcount + 1,
485 kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100486 if (stack != small_stack) {
487 PyMem_Free(stack);
488 }
489 return result;
490}
491
492
493/* --- Call with a format string ---------------------------------- */
494
495static PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +0100496_PyObject_CallFunctionVa(PyThreadState *tstate, PyObject *callable,
497 const char *format, va_list va, int is_size_t)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100498{
499 PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
500 const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
501 PyObject **stack;
502 Py_ssize_t nargs, i;
503 PyObject *result;
504
505 if (callable == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100506 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100507 }
508
509 if (!format || !*format) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100510 return _PyObject_CallNoArgTstate(tstate, callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100511 }
512
513 if (is_size_t) {
514 stack = _Py_VaBuildStack_SizeT(small_stack, small_stack_len,
515 format, va, &nargs);
516 }
517 else {
518 stack = _Py_VaBuildStack(small_stack, small_stack_len,
519 format, va, &nargs);
520 }
521 if (stack == NULL) {
522 return NULL;
523 }
524
525 if (nargs == 1 && PyTuple_Check(stack[0])) {
526 /* Special cases for backward compatibility:
527 - PyObject_CallFunction(func, "O", tuple) calls func(*tuple)
528 - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls
529 func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */
530 PyObject *args = stack[0];
Victor Stinner4d231bc2019-11-14 13:36:21 +0100531 result = _PyObject_VectorcallTstate(tstate, callable,
532 _PyTuple_ITEMS(args),
533 PyTuple_GET_SIZE(args),
534 NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100535 }
536 else {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100537 result = _PyObject_VectorcallTstate(tstate, callable,
538 stack, nargs, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100539 }
540
541 for (i = 0; i < nargs; ++i) {
542 Py_DECREF(stack[i]);
543 }
544 if (stack != small_stack) {
545 PyMem_Free(stack);
546 }
547 return result;
548}
549
550
551PyObject *
552PyObject_CallFunction(PyObject *callable, const char *format, ...)
553{
554 va_list va;
555 PyObject *result;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100556 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100557
558 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100559 result = _PyObject_CallFunctionVa(tstate, callable, format, va, 0);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100560 va_end(va);
561
562 return result;
563}
564
565
INADA Naokiaa289a52017-03-14 18:00:59 +0900566/* PyEval_CallFunction is exact copy of PyObject_CallFunction.
567 * This function is kept for backward compatibility.
568 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100569PyObject *
570PyEval_CallFunction(PyObject *callable, const char *format, ...)
571{
INADA Naokiaa289a52017-03-14 18:00:59 +0900572 va_list va;
573 PyObject *result;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100574 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100575
INADA Naokiaa289a52017-03-14 18:00:59 +0900576 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100577 result = _PyObject_CallFunctionVa(tstate, callable, format, va, 0);
INADA Naokiaa289a52017-03-14 18:00:59 +0900578 va_end(va);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100579
INADA Naokiaa289a52017-03-14 18:00:59 +0900580 return result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100581}
582
583
584PyObject *
585_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
586{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100587 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100588
Victor Stinner4d231bc2019-11-14 13:36:21 +0100589 va_list va;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100590 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100591 PyObject *result = _PyObject_CallFunctionVa(tstate, callable, format, va, 1);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100592 va_end(va);
593
594 return result;
595}
596
597
598static PyObject*
Victor Stinner4d231bc2019-11-14 13:36:21 +0100599callmethod(PyThreadState *tstate, PyObject* callable, const char *format, va_list va, int is_size_t)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100600{
601 assert(callable != NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100602 if (!PyCallable_Check(callable)) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100603 _PyErr_Format(tstate, PyExc_TypeError,
604 "attribute of type '%.200s' is not callable",
605 Py_TYPE(callable)->tp_name);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100606 return NULL;
607 }
608
Victor Stinner4d231bc2019-11-14 13:36:21 +0100609 return _PyObject_CallFunctionVa(tstate, callable, format, va, is_size_t);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100610}
611
612
613PyObject *
614PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
615{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100616 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100617
618 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100619 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100620 }
621
Victor Stinner4d231bc2019-11-14 13:36:21 +0100622 PyObject *callable = PyObject_GetAttrString(obj, name);
623 if (callable == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100624 return NULL;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100625 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100626
Victor Stinner4d231bc2019-11-14 13:36:21 +0100627 va_list va;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100628 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100629 PyObject *retval = callmethod(tstate, callable, format, va, 0);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100630 va_end(va);
631
632 Py_DECREF(callable);
633 return retval;
634}
635
636
INADA Naokiaa289a52017-03-14 18:00:59 +0900637/* PyEval_CallMethod is exact copy of PyObject_CallMethod.
638 * This function is kept for backward compatibility.
639 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100640PyObject *
641PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...)
642{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100643 PyThreadState *tstate = _PyThreadState_GET();
INADA Naokiaa289a52017-03-14 18:00:59 +0900644 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100645 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100646 }
647
Victor Stinner4d231bc2019-11-14 13:36:21 +0100648 PyObject *callable = PyObject_GetAttrString(obj, name);
649 if (callable == NULL) {
INADA Naokiaa289a52017-03-14 18:00:59 +0900650 return NULL;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100651 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100652
Victor Stinner4d231bc2019-11-14 13:36:21 +0100653 va_list va;
INADA Naokiaa289a52017-03-14 18:00:59 +0900654 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100655 PyObject *retval = callmethod(tstate, callable, format, va, 0);
INADA Naokiaa289a52017-03-14 18:00:59 +0900656 va_end(va);
657
658 Py_DECREF(callable);
659 return retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100660}
661
662
663PyObject *
664_PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name,
665 const char *format, ...)
666{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100667 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100668 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100669 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100670 }
671
Victor Stinner4d231bc2019-11-14 13:36:21 +0100672 PyObject *callable = _PyObject_GetAttrId(obj, name);
673 if (callable == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100674 return NULL;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100675 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100676
Victor Stinner4d231bc2019-11-14 13:36:21 +0100677 va_list va;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100678 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100679 PyObject *retval = callmethod(tstate, callable, format, va, 0);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100680 va_end(va);
681
682 Py_DECREF(callable);
683 return retval;
684}
685
686
687PyObject *
688_PyObject_CallMethod_SizeT(PyObject *obj, const char *name,
689 const char *format, ...)
690{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100691 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100692 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100693 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100694 }
695
Victor Stinner4d231bc2019-11-14 13:36:21 +0100696 PyObject *callable = PyObject_GetAttrString(obj, name);
697 if (callable == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100698 return NULL;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100699 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100700
Victor Stinner4d231bc2019-11-14 13:36:21 +0100701 va_list va;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100702 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100703 PyObject *retval = callmethod(tstate, callable, format, va, 1);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100704 va_end(va);
705
706 Py_DECREF(callable);
707 return retval;
708}
709
710
711PyObject *
712_PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name,
713 const char *format, ...)
714{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100715 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100716 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100717 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100718 }
719
Victor Stinner4d231bc2019-11-14 13:36:21 +0100720 PyObject *callable = _PyObject_GetAttrId(obj, name);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100721 if (callable == NULL) {
722 return NULL;
723 }
724
Victor Stinner4d231bc2019-11-14 13:36:21 +0100725 va_list va;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100726 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100727 PyObject *retval = callmethod(tstate, callable, format, va, 1);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100728 va_end(va);
729
730 Py_DECREF(callable);
731 return retval;
732}
733
734
735/* --- Call with "..." arguments ---------------------------------- */
736
737static PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +0100738object_vacall(PyThreadState *tstate, PyObject *base,
739 PyObject *callable, va_list vargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100740{
741 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
742 PyObject **stack;
743 Py_ssize_t nargs;
744 PyObject *result;
745 Py_ssize_t i;
746 va_list countva;
747
748 if (callable == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100749 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100750 }
751
752 /* Count the number of arguments */
753 va_copy(countva, vargs);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700754 nargs = base ? 1 : 0;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100755 while (1) {
756 PyObject *arg = va_arg(countva, PyObject *);
757 if (arg == NULL) {
758 break;
759 }
760 nargs++;
761 }
762 va_end(countva);
763
764 /* Copy arguments */
765 if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
766 stack = small_stack;
767 }
768 else {
769 stack = PyMem_Malloc(nargs * sizeof(stack[0]));
770 if (stack == NULL) {
771 PyErr_NoMemory();
772 return NULL;
773 }
774 }
775
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700776 i = 0;
777 if (base) {
778 stack[i++] = base;
779 }
780
781 for (; i < nargs; ++i) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100782 stack[i] = va_arg(vargs, PyObject *);
783 }
784
785 /* Call the function */
Victor Stinner4d231bc2019-11-14 13:36:21 +0100786 result = _PyObject_VectorcallTstate(tstate, callable, stack, nargs, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100787
788 if (stack != small_stack) {
789 PyMem_Free(stack);
790 }
791 return result;
792}
793
794
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700795PyObject *
Jeroen Demeyerb1263d52019-06-28 11:49:00 +0200796_PyObject_VectorcallMethod(PyObject *name, PyObject *const *args,
797 size_t nargsf, PyObject *kwnames)
798{
799 assert(name != NULL);
800 assert(args != NULL);
801 assert(PyVectorcall_NARGS(nargsf) >= 1);
802
Victor Stinner7e433732019-11-08 10:05:17 +0100803 PyThreadState *tstate = _PyThreadState_GET();
Jeroen Demeyerb1263d52019-06-28 11:49:00 +0200804 PyObject *callable = NULL;
805 /* Use args[0] as "self" argument */
806 int unbound = _PyObject_GetMethod(args[0], name, &callable);
807 if (callable == NULL) {
808 return NULL;
809 }
810
811 if (unbound) {
812 /* We must remove PY_VECTORCALL_ARGUMENTS_OFFSET since
813 * that would be interpreted as allowing to change args[-1] */
814 nargsf &= ~PY_VECTORCALL_ARGUMENTS_OFFSET;
815 }
816 else {
817 /* Skip "self". We can keep PY_VECTORCALL_ARGUMENTS_OFFSET since
818 * args[-1] in the onward call is args[0] here. */
819 args++;
820 nargsf--;
821 }
Victor Stinner7e433732019-11-08 10:05:17 +0100822 PyObject *result = _PyObject_VectorcallTstate(tstate, callable,
823 args, nargsf, kwnames);
Jeroen Demeyerb1263d52019-06-28 11:49:00 +0200824 Py_DECREF(callable);
825 return result;
826}
827
828
829PyObject *
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700830PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
831{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100832 PyThreadState *tstate = _PyThreadState_GET();
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700833 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100834 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100835 }
836
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700837 PyObject *callable = NULL;
838 int is_method = _PyObject_GetMethod(obj, name, &callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100839 if (callable == NULL) {
840 return NULL;
841 }
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700842 obj = is_method ? obj : NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100843
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700844 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100845 va_start(vargs, name);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100846 PyObject *result = object_vacall(tstate, obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100847 va_end(vargs);
848
849 Py_DECREF(callable);
850 return result;
851}
852
853
854PyObject *
855_PyObject_CallMethodIdObjArgs(PyObject *obj,
856 struct _Py_Identifier *name, ...)
857{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100858 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100859 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100860 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100861 }
862
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700863 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
864 if (!oname) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100865 return NULL;
866 }
867
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700868 PyObject *callable = NULL;
869 int is_method = _PyObject_GetMethod(obj, oname, &callable);
870 if (callable == NULL) {
871 return NULL;
872 }
873 obj = is_method ? obj : NULL;
874
875 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100876 va_start(vargs, name);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100877 PyObject *result = object_vacall(tstate, obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100878 va_end(vargs);
879
880 Py_DECREF(callable);
881 return result;
882}
883
884
885PyObject *
886PyObject_CallFunctionObjArgs(PyObject *callable, ...)
887{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100888 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100889 va_list vargs;
890 PyObject *result;
891
892 va_start(vargs, callable);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100893 result = object_vacall(tstate, NULL, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100894 va_end(vargs);
895
896 return result;
897}
898
899
900/* --- PyStack functions ------------------------------------------ */
901
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100902PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200903_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100904{
905 Py_ssize_t nkwargs;
906 PyObject *kwdict;
907 Py_ssize_t i;
908
909 assert(kwnames != NULL);
910 nkwargs = PyTuple_GET_SIZE(kwnames);
911 kwdict = _PyDict_NewPresized(nkwargs);
912 if (kwdict == NULL) {
913 return NULL;
914 }
915
916 for (i = 0; i < nkwargs; i++) {
917 PyObject *key = PyTuple_GET_ITEM(kwnames, i);
918 PyObject *value = *values++;
919 /* If key already exists, replace it with the new value */
920 if (PyDict_SetItem(kwdict, key, value)) {
921 Py_DECREF(kwdict);
922 return NULL;
923 }
924 }
925 return kwdict;
926}
927
928
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200929/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple).
930
931 Allocate a new argument vector and keyword names tuple. Return the argument
932 vector; return NULL with exception set on error. Return the keyword names
933 tuple in *p_kwnames.
934
Jeroen Demeyer05677862019-08-16 12:41:27 +0200935 This also checks that all keyword names are strings. If not, a TypeError is
936 raised.
937
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200938 The newly allocated argument vector supports PY_VECTORCALL_ARGUMENTS_OFFSET.
939
Jeroen Demeyer05677862019-08-16 12:41:27 +0200940 When done, you must call _PyStack_UnpackDict_Free(stack, nargs, kwnames) */
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200941static PyObject *const *
Victor Stinner17269092019-11-05 01:22:12 +0100942_PyStack_UnpackDict(PyThreadState *tstate,
943 PyObject *const *args, Py_ssize_t nargs,
944 PyObject *kwargs, PyObject **p_kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100945{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100946 assert(nargs >= 0);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200947 assert(kwargs != NULL);
948 assert(PyDict_Check(kwargs));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100949
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200950 Py_ssize_t nkwargs = PyDict_GET_SIZE(kwargs);
951 /* Check for overflow in the PyMem_Malloc() call below. The subtraction
952 * in this check cannot overflow: both maxnargs and nkwargs are
953 * non-negative signed integers, so their difference fits in the type. */
954 Py_ssize_t maxnargs = PY_SSIZE_T_MAX / sizeof(args[0]) - 1;
955 if (nargs > maxnargs - nkwargs) {
Victor Stinner17269092019-11-05 01:22:12 +0100956 _PyErr_NoMemory(tstate);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200957 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100958 }
959
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200960 /* Add 1 to support PY_VECTORCALL_ARGUMENTS_OFFSET */
961 PyObject **stack = PyMem_Malloc((1 + nargs + nkwargs) * sizeof(args[0]));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100962 if (stack == NULL) {
Victor Stinner17269092019-11-05 01:22:12 +0100963 _PyErr_NoMemory(tstate);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200964 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100965 }
966
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200967 PyObject *kwnames = PyTuple_New(nkwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100968 if (kwnames == NULL) {
969 PyMem_Free(stack);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200970 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100971 }
972
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200973 stack++; /* For PY_VECTORCALL_ARGUMENTS_OFFSET */
974
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200975 /* Copy positional arguments */
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200976 for (Py_ssize_t i = 0; i < nargs; i++) {
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200977 Py_INCREF(args[i]);
978 stack[i] = args[i];
979 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100980
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200981 PyObject **kwstack = stack + nargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100982 /* This loop doesn't support lookup function mutating the dictionary
983 to change its size. It's a deliberate choice for speed, this function is
984 called in the performance critical hot code. */
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200985 Py_ssize_t pos = 0, i = 0;
986 PyObject *key, *value;
Jeroen Demeyer05677862019-08-16 12:41:27 +0200987 unsigned long keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100988 while (PyDict_Next(kwargs, &pos, &key, &value)) {
Jeroen Demeyer05677862019-08-16 12:41:27 +0200989 keys_are_strings &= Py_TYPE(key)->tp_flags;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100990 Py_INCREF(key);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200991 Py_INCREF(value);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100992 PyTuple_SET_ITEM(kwnames, i, key);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100993 kwstack[i] = value;
994 i++;
995 }
996
Jeroen Demeyer05677862019-08-16 12:41:27 +0200997 /* keys_are_strings has the value Py_TPFLAGS_UNICODE_SUBCLASS if that
998 * flag is set for all keys. Otherwise, keys_are_strings equals 0.
999 * We do this check once at the end instead of inside the loop above
1000 * because it simplifies the deallocation in the failing case.
1001 * It happens to also make the loop above slightly more efficient. */
1002 if (!keys_are_strings) {
Victor Stinner17269092019-11-05 01:22:12 +01001003 _PyErr_SetString(tstate, PyExc_TypeError,
1004 "keywords must be strings");
Jeroen Demeyer05677862019-08-16 12:41:27 +02001005 _PyStack_UnpackDict_Free(stack, nargs, kwnames);
1006 return NULL;
1007 }
1008
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001009 *p_kwnames = kwnames;
Jeroen Demeyerd4efd912019-07-02 11:49:40 +02001010 return stack;
1011}
1012
1013static void
1014_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs,
1015 PyObject *kwnames)
1016{
1017 Py_ssize_t n = PyTuple_GET_SIZE(kwnames) + nargs;
1018 for (Py_ssize_t i = 0; i < n; i++) {
1019 Py_DECREF(stack[i]);
1020 }
1021 PyMem_Free((PyObject **)stack - 1);
1022 Py_DECREF(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001023}