blob: 96174c4e331e76406f6ec281a10aedaddf130836 [file] [log] [blame]
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001#include "Python.h"
Victor Stinnerb9e68122019-11-14 12:20:46 +01002#include "pycore_ceval.h" /* _PyEval_EvalFrame() */
Victor Stinnerbcda8f12018-11-21 22:27:47 +01003#include "pycore_object.h"
Victor Stinnerbe434dc2019-11-05 00:51:22 +01004#include "pycore_pyerrors.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01005#include "pycore_pystate.h"
Victor Stinnerec13b932018-11-25 23:56:17 +01006#include "pycore_tupleobject.h"
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01007#include "frameobject.h"
8
9
Jeroen Demeyerd4efd912019-07-02 11:49:40 +020010static PyObject *const *
Victor Stinner17269092019-11-05 01:22:12 +010011_PyStack_UnpackDict(PyThreadState *tstate,
12 PyObject *const *args, Py_ssize_t nargs,
13 PyObject *kwargs, PyObject **p_kwnames);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +020014
15static void
16_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs,
17 PyObject *kwnames);
18
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020019
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010020static PyObject *
21null_error(void)
22{
23 if (!PyErr_Occurred())
24 PyErr_SetString(PyExc_SystemError,
25 "null argument to internal routine");
26 return NULL;
27}
28
29
30PyObject*
Victor Stinner17269092019-11-05 01:22:12 +010031_Py_CheckFunctionResult(PyThreadState *tstate, PyObject *callable,
32 PyObject *result, const char *where)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010033{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010034 assert((callable != NULL) ^ (where != NULL));
35
36 if (result == NULL) {
Victor Stinnerd12d0e72019-11-07 12:42:07 +010037 if (!_PyErr_Occurred(tstate)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010038 if (callable)
Victor Stinner17269092019-11-05 01:22:12 +010039 _PyErr_Format(tstate, PyExc_SystemError,
40 "%R returned NULL without setting an error",
41 callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010042 else
Victor Stinner17269092019-11-05 01:22:12 +010043 _PyErr_Format(tstate, PyExc_SystemError,
44 "%s returned NULL without setting an error",
45 where);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010046#ifdef Py_DEBUG
47 /* Ensure that the bug is caught in debug mode */
48 Py_FatalError("a function returned NULL without setting an error");
49#endif
50 return NULL;
51 }
52 }
53 else {
Victor Stinnerd12d0e72019-11-07 12:42:07 +010054 if (_PyErr_Occurred(tstate)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010055 Py_DECREF(result);
56
57 if (callable) {
Victor Stinner17269092019-11-05 01:22:12 +010058 _PyErr_FormatFromCauseTstate(
59 tstate, PyExc_SystemError,
60 "%R returned a result with an error set", callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010061 }
62 else {
Victor Stinner17269092019-11-05 01:22:12 +010063 _PyErr_FormatFromCauseTstate(
64 tstate, PyExc_SystemError,
65 "%s returned a result with an error set", where);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010066 }
67#ifdef Py_DEBUG
68 /* Ensure that the bug is caught in debug mode */
69 Py_FatalError("a function returned a result with an error set");
70#endif
71 return NULL;
72 }
73 }
74 return result;
75}
76
77
78/* --- Core PyObject call functions ------------------------------- */
79
Victor Stinner2ff58a22019-06-17 14:27:23 +020080/* Call a callable Python object without any arguments */
81PyObject *
82PyObject_CallNoArgs(PyObject *func)
83{
84 return _PyObject_CallNoArg(func);
85}
86
87
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010088PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020089_PyObject_FastCallDict(PyObject *callable, PyObject *const *args,
90 size_t nargsf, PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010091{
Victor Stinner17269092019-11-05 01:22:12 +010092 assert(callable != NULL);
93
94 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010095 /* _PyObject_FastCallDict() must not be called with an exception set,
96 because it can clear it (directly or indirectly) and so the
97 caller loses its exception */
Victor Stinner17269092019-11-05 01:22:12 +010098 assert(!_PyErr_Occurred(tstate));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020099
100 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100101 assert(nargs >= 0);
102 assert(nargs == 0 || args != NULL);
103 assert(kwargs == NULL || PyDict_Check(kwargs));
104
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200105 vectorcallfunc func = _PyVectorcall_Function(callable);
106 if (func == NULL) {
107 /* Use tp_call instead */
Victor Stinner7e433732019-11-08 10:05:17 +0100108 return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100109 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200110
111 PyObject *res;
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200112 if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200113 res = func(callable, args, nargsf, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100114 }
115 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200116 PyObject *kwnames;
117 PyObject *const *newargs;
Victor Stinner17269092019-11-05 01:22:12 +0100118 newargs = _PyStack_UnpackDict(tstate,
119 args, nargs,
120 kwargs, &kwnames);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200121 if (newargs == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100122 return NULL;
123 }
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200124 res = func(callable, newargs,
125 nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
126 _PyStack_UnpackDict_Free(newargs, nargs, kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100127 }
Victor Stinner17269092019-11-05 01:22:12 +0100128 return _Py_CheckFunctionResult(tstate, callable, res, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100129}
130
131
132PyObject *
Victor Stinner7e433732019-11-08 10:05:17 +0100133_PyObject_MakeTpCall(PyThreadState *tstate, PyObject *callable,
134 PyObject *const *args, Py_ssize_t nargs,
135 PyObject *keywords)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100136{
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200137 /* Slow path: build a temporary tuple for positional arguments and a
138 * temporary dictionary for keyword arguments (if any) */
139 ternaryfunc call = Py_TYPE(callable)->tp_call;
140 if (call == NULL) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100141 _PyErr_Format(tstate, PyExc_TypeError,
142 "'%.200s' object is not callable",
143 Py_TYPE(callable)->tp_name);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200144 return NULL;
145 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100146
147 assert(nargs >= 0);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200148 assert(nargs == 0 || args != NULL);
149 assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords));
150 PyObject *argstuple = _PyTuple_FromArray(args, nargs);
151 if (argstuple == NULL) {
152 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100153 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200154
155 PyObject *kwdict;
156 if (keywords == NULL || PyDict_Check(keywords)) {
157 kwdict = keywords;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100158 }
159 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200160 if (PyTuple_GET_SIZE(keywords)) {
161 assert(args != NULL);
162 kwdict = _PyStack_AsDict(args + nargs, keywords);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100163 if (kwdict == NULL) {
164 Py_DECREF(argstuple);
165 return NULL;
166 }
167 }
168 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200169 keywords = kwdict = NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100170 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100171 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200172
173 PyObject *result = NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100174 if (_Py_EnterRecursiveCall(tstate, " while calling a Python object") == 0)
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200175 {
176 result = call(callable, argstuple, kwdict);
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100177 _Py_LeaveRecursiveCall(tstate);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200178 }
179
180 Py_DECREF(argstuple);
181 if (kwdict != keywords) {
182 Py_DECREF(kwdict);
183 }
184
Victor Stinner17269092019-11-05 01:22:12 +0100185 result = _Py_CheckFunctionResult(tstate, callable, result, NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200186 return result;
187}
188
189
190PyObject *
191PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs)
192{
Victor Stinner17269092019-11-05 01:22:12 +0100193 PyThreadState *tstate = _PyThreadState_GET();
194
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200195 /* get vectorcallfunc as in _PyVectorcall_Function, but without
196 * the _Py_TPFLAGS_HAVE_VECTORCALL check */
197 Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset;
Jeroen Demeyera8b27e62019-06-24 12:41:05 +0200198 if (offset <= 0) {
Victor Stinner17269092019-11-05 01:22:12 +0100199 _PyErr_Format(tstate, PyExc_TypeError,
200 "'%.200s' object does not support vectorcall",
201 Py_TYPE(callable)->tp_name);
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200202 return NULL;
203 }
204 vectorcallfunc func = *(vectorcallfunc *)(((char *)callable) + offset);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200205 if (func == NULL) {
Victor Stinner17269092019-11-05 01:22:12 +0100206 _PyErr_Format(tstate, PyExc_TypeError,
207 "'%.200s' object does not support vectorcall",
208 Py_TYPE(callable)->tp_name);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200209 return NULL;
210 }
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200211
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200212 Py_ssize_t nargs = PyTuple_GET_SIZE(tuple);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200213
214 /* Fast path for no keywords */
215 if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
216 return func(callable, _PyTuple_ITEMS(tuple), nargs, NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200217 }
218
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200219 /* Convert arguments & call */
220 PyObject *const *args;
221 PyObject *kwnames;
Victor Stinner17269092019-11-05 01:22:12 +0100222 args = _PyStack_UnpackDict(tstate,
223 _PyTuple_ITEMS(tuple), nargs,
224 kwargs, &kwnames);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200225 if (args == NULL) {
226 return NULL;
227 }
228 PyObject *result = func(callable, args,
229 nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
230 _PyStack_UnpackDict_Free(args, nargs, kwnames);
Victor Stinner17269092019-11-05 01:22:12 +0100231 return _Py_CheckFunctionResult(tstate, callable, result, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100232}
233
234
235PyObject *
236PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
237{
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100238 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100239 ternaryfunc call;
240 PyObject *result;
241
242 /* PyObject_Call() must not be called with an exception set,
243 because it can clear it (directly or indirectly) and so the
244 caller loses its exception */
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100245 assert(!_PyErr_Occurred(tstate));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100246 assert(PyTuple_Check(args));
247 assert(kwargs == NULL || PyDict_Check(kwargs));
248
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200249 if (_PyVectorcall_Function(callable) != NULL) {
250 return PyVectorcall_Call(callable, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100251 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100252 else {
253 call = callable->ob_type->tp_call;
254 if (call == NULL) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100255 _PyErr_Format(tstate, PyExc_TypeError,
256 "'%.200s' object is not callable",
257 callable->ob_type->tp_name);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100258 return NULL;
259 }
260
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100261 if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100262 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100263 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100264
265 result = (*call)(callable, args, kwargs);
266
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100267 _Py_LeaveRecursiveCall(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100268
Victor Stinner17269092019-11-05 01:22:12 +0100269 return _Py_CheckFunctionResult(tstate, callable, result, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100270 }
271}
272
273
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +0200274PyObject *
275PyCFunction_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
276{
277 return PyObject_Call(callable, args, kwargs);
278}
279
280
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100281/* --- PyFunction call functions ---------------------------------- */
282
283static PyObject* _Py_HOT_FUNCTION
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200284function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100285 PyObject *globals)
286{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100287 assert(globals != NULL);
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100288
289 PyThreadState *tstate = _PyThreadState_GET();
290 assert(tstate != NULL);
291
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100292 /* XXX Perhaps we should create a specialized
293 _PyFrame_New_NoTrack() that doesn't take locals, but does
294 take builtins without sanity checking them.
295 */
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100296 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, globals, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100297 if (f == NULL) {
298 return NULL;
299 }
300
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100301 PyObject **fastlocals = f->f_localsplus;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100302
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100303 for (Py_ssize_t i = 0; i < nargs; i++) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100304 Py_INCREF(*args);
305 fastlocals[i] = *args++;
306 }
Victor Stinnerb9e68122019-11-14 12:20:46 +0100307 PyObject *result = _PyEval_EvalFrame(tstate, f, 0);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100308
309 if (Py_REFCNT(f) > 1) {
310 Py_DECREF(f);
311 _PyObject_GC_TRACK(f);
312 }
313 else {
314 ++tstate->recursion_depth;
315 Py_DECREF(f);
316 --tstate->recursion_depth;
317 }
318 return result;
319}
320
321
322PyObject *
Jeroen Demeyer37788bc2019-05-30 15:11:22 +0200323_PyFunction_Vectorcall(PyObject *func, PyObject* const* stack,
324 size_t nargsf, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100325{
326 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
327 PyObject *globals = PyFunction_GET_GLOBALS(func);
328 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
329 PyObject *kwdefs, *closure, *name, *qualname;
330 PyObject **d;
331 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
332 Py_ssize_t nd;
333
334 assert(PyFunction_Check(func));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200335 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100336 assert(nargs >= 0);
337 assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
338 assert((nargs == 0 && nkwargs == 0) || stack != NULL);
Jeroen Demeyer05677862019-08-16 12:41:27 +0200339 /* kwnames must only contain strings and all keys must be unique */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100340
341 if (co->co_kwonlyargcount == 0 && nkwargs == 0 &&
Victor Stinner086c3ae2017-10-25 05:26:17 -0700342 (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100343 {
Pablo Galindocd74e662019-06-01 18:08:04 +0100344 if (argdefs == NULL && co->co_argcount == nargs) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100345 return function_code_fastcall(co, stack, nargs, globals);
346 }
347 else if (nargs == 0 && argdefs != NULL
Pablo Galindocd74e662019-06-01 18:08:04 +0100348 && co->co_argcount == PyTuple_GET_SIZE(argdefs)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100349 /* function called with no arguments, but all parameters have
350 a default value: use default values as arguments .*/
Victor Stinnerd17a6932018-11-09 16:56:48 +0100351 stack = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200352 return function_code_fastcall(co, stack, PyTuple_GET_SIZE(argdefs),
353 globals);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100354 }
355 }
356
357 kwdefs = PyFunction_GET_KW_DEFAULTS(func);
358 closure = PyFunction_GET_CLOSURE(func);
359 name = ((PyFunctionObject *)func) -> func_name;
360 qualname = ((PyFunctionObject *)func) -> func_qualname;
361
362 if (argdefs != NULL) {
Victor Stinnerd17a6932018-11-09 16:56:48 +0100363 d = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200364 nd = PyTuple_GET_SIZE(argdefs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100365 }
366 else {
367 d = NULL;
368 nd = 0;
369 }
370 return _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
371 stack, nargs,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100372 nkwargs ? _PyTuple_ITEMS(kwnames) : NULL,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100373 stack + nargs,
374 nkwargs, 1,
375 d, (int)nd, kwdefs,
376 closure, name, qualname);
377}
378
379
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100380/* --- More complex call functions -------------------------------- */
381
382/* External interface to call any callable object.
383 The args must be a tuple or NULL. The kwargs must be a dict or NULL. */
384PyObject *
385PyEval_CallObjectWithKeywords(PyObject *callable,
386 PyObject *args, PyObject *kwargs)
387{
388#ifdef Py_DEBUG
389 /* PyEval_CallObjectWithKeywords() must not be called with an exception
390 set. It raises a new exception if parameters are invalid or if
391 PyTuple_New() fails, and so the original exception is lost. */
392 assert(!PyErr_Occurred());
393#endif
394
INADA Naoki3824cd82017-03-01 20:41:03 +0900395 if (args != NULL && !PyTuple_Check(args)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100396 PyErr_SetString(PyExc_TypeError,
397 "argument list must be a tuple");
398 return NULL;
399 }
400
401 if (kwargs != NULL && !PyDict_Check(kwargs)) {
402 PyErr_SetString(PyExc_TypeError,
403 "keyword list must be a dictionary");
404 return NULL;
405 }
406
INADA Naoki3824cd82017-03-01 20:41:03 +0900407 if (args == NULL) {
408 return _PyObject_FastCallDict(callable, NULL, 0, kwargs);
409 }
410 else {
411 return PyObject_Call(callable, args, kwargs);
412 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100413}
414
415
416PyObject *
417PyObject_CallObject(PyObject *callable, PyObject *args)
418{
Jeroen Demeyer1dbd0842019-07-11 17:57:32 +0200419 assert(!PyErr_Occurred());
420 if (args == NULL) {
421 return _PyObject_CallNoArg(callable);
422 }
423 if (!PyTuple_Check(args)) {
424 PyErr_SetString(PyExc_TypeError,
425 "argument list must be a tuple");
426 return NULL;
427 }
428 return PyObject_Call(callable, args, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100429}
430
431
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100432/* Call callable(obj, *args, **kwargs). */
433PyObject *
434_PyObject_Call_Prepend(PyObject *callable,
435 PyObject *obj, PyObject *args, PyObject *kwargs)
436{
437 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
438 PyObject **stack;
439 Py_ssize_t argcount;
440 PyObject *result;
441
442 assert(PyTuple_Check(args));
443
444 argcount = PyTuple_GET_SIZE(args);
445 if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
446 stack = small_stack;
447 }
448 else {
449 stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
450 if (stack == NULL) {
451 PyErr_NoMemory();
452 return NULL;
453 }
454 }
455
456 /* use borrowed references */
457 stack[0] = obj;
458 memcpy(&stack[1],
Victor Stinnerd17a6932018-11-09 16:56:48 +0100459 _PyTuple_ITEMS(args),
460 argcount * sizeof(PyObject *));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100461
462 result = _PyObject_FastCallDict(callable,
463 stack, argcount + 1,
464 kwargs);
465 if (stack != small_stack) {
466 PyMem_Free(stack);
467 }
468 return result;
469}
470
471
472/* --- Call with a format string ---------------------------------- */
473
474static PyObject *
475_PyObject_CallFunctionVa(PyObject *callable, const char *format,
476 va_list va, int is_size_t)
477{
478 PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
479 const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
480 PyObject **stack;
481 Py_ssize_t nargs, i;
482 PyObject *result;
483
484 if (callable == NULL) {
485 return null_error();
486 }
487
488 if (!format || !*format) {
489 return _PyObject_CallNoArg(callable);
490 }
491
492 if (is_size_t) {
493 stack = _Py_VaBuildStack_SizeT(small_stack, small_stack_len,
494 format, va, &nargs);
495 }
496 else {
497 stack = _Py_VaBuildStack(small_stack, small_stack_len,
498 format, va, &nargs);
499 }
500 if (stack == NULL) {
501 return NULL;
502 }
503
504 if (nargs == 1 && PyTuple_Check(stack[0])) {
505 /* Special cases for backward compatibility:
506 - PyObject_CallFunction(func, "O", tuple) calls func(*tuple)
507 - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls
508 func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */
509 PyObject *args = stack[0];
510 result = _PyObject_FastCall(callable,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100511 _PyTuple_ITEMS(args),
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100512 PyTuple_GET_SIZE(args));
513 }
514 else {
515 result = _PyObject_FastCall(callable, stack, nargs);
516 }
517
518 for (i = 0; i < nargs; ++i) {
519 Py_DECREF(stack[i]);
520 }
521 if (stack != small_stack) {
522 PyMem_Free(stack);
523 }
524 return result;
525}
526
527
528PyObject *
529PyObject_CallFunction(PyObject *callable, const char *format, ...)
530{
531 va_list va;
532 PyObject *result;
533
534 va_start(va, format);
535 result = _PyObject_CallFunctionVa(callable, format, va, 0);
536 va_end(va);
537
538 return result;
539}
540
541
INADA Naokiaa289a52017-03-14 18:00:59 +0900542/* PyEval_CallFunction is exact copy of PyObject_CallFunction.
543 * This function is kept for backward compatibility.
544 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100545PyObject *
546PyEval_CallFunction(PyObject *callable, const char *format, ...)
547{
INADA Naokiaa289a52017-03-14 18:00:59 +0900548 va_list va;
549 PyObject *result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100550
INADA Naokiaa289a52017-03-14 18:00:59 +0900551 va_start(va, format);
552 result = _PyObject_CallFunctionVa(callable, format, va, 0);
553 va_end(va);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100554
INADA Naokiaa289a52017-03-14 18:00:59 +0900555 return result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100556}
557
558
559PyObject *
560_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
561{
562 va_list va;
563 PyObject *result;
564
565 va_start(va, format);
566 result = _PyObject_CallFunctionVa(callable, format, va, 1);
567 va_end(va);
568
569 return result;
570}
571
572
573static PyObject*
574callmethod(PyObject* callable, const char *format, va_list va, int is_size_t)
575{
576 assert(callable != NULL);
577
578 if (!PyCallable_Check(callable)) {
579 PyErr_Format(PyExc_TypeError,
580 "attribute of type '%.200s' is not callable",
581 Py_TYPE(callable)->tp_name);
582 return NULL;
583 }
584
585 return _PyObject_CallFunctionVa(callable, format, va, is_size_t);
586}
587
588
589PyObject *
590PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
591{
592 va_list va;
593 PyObject *callable, *retval;
594
595 if (obj == NULL || name == NULL) {
596 return null_error();
597 }
598
599 callable = PyObject_GetAttrString(obj, name);
600 if (callable == NULL)
601 return NULL;
602
603 va_start(va, format);
604 retval = callmethod(callable, format, va, 0);
605 va_end(va);
606
607 Py_DECREF(callable);
608 return retval;
609}
610
611
INADA Naokiaa289a52017-03-14 18:00:59 +0900612/* PyEval_CallMethod is exact copy of PyObject_CallMethod.
613 * This function is kept for backward compatibility.
614 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100615PyObject *
616PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...)
617{
INADA Naokiaa289a52017-03-14 18:00:59 +0900618 va_list va;
619 PyObject *callable, *retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100620
INADA Naokiaa289a52017-03-14 18:00:59 +0900621 if (obj == NULL || name == NULL) {
622 return null_error();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100623 }
624
INADA Naokiaa289a52017-03-14 18:00:59 +0900625 callable = PyObject_GetAttrString(obj, name);
626 if (callable == NULL)
627 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100628
INADA Naokiaa289a52017-03-14 18:00:59 +0900629 va_start(va, format);
630 retval = callmethod(callable, format, va, 0);
631 va_end(va);
632
633 Py_DECREF(callable);
634 return retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100635}
636
637
638PyObject *
639_PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name,
640 const char *format, ...)
641{
642 va_list va;
643 PyObject *callable, *retval;
644
645 if (obj == NULL || name == NULL) {
646 return null_error();
647 }
648
649 callable = _PyObject_GetAttrId(obj, name);
650 if (callable == NULL)
651 return NULL;
652
653 va_start(va, format);
654 retval = callmethod(callable, format, va, 0);
655 va_end(va);
656
657 Py_DECREF(callable);
658 return retval;
659}
660
661
662PyObject *
663_PyObject_CallMethod_SizeT(PyObject *obj, const char *name,
664 const char *format, ...)
665{
666 va_list va;
667 PyObject *callable, *retval;
668
669 if (obj == NULL || name == NULL) {
670 return null_error();
671 }
672
673 callable = PyObject_GetAttrString(obj, name);
674 if (callable == NULL)
675 return NULL;
676
677 va_start(va, format);
678 retval = callmethod(callable, format, va, 1);
679 va_end(va);
680
681 Py_DECREF(callable);
682 return retval;
683}
684
685
686PyObject *
687_PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name,
688 const char *format, ...)
689{
690 va_list va;
691 PyObject *callable, *retval;
692
693 if (obj == NULL || name == NULL) {
694 return null_error();
695 }
696
697 callable = _PyObject_GetAttrId(obj, name);
698 if (callable == NULL) {
699 return NULL;
700 }
701
702 va_start(va, format);
703 retval = callmethod(callable, format, va, 1);
704 va_end(va);
705
706 Py_DECREF(callable);
707 return retval;
708}
709
710
711/* --- Call with "..." arguments ---------------------------------- */
712
713static PyObject *
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700714object_vacall(PyObject *base, PyObject *callable, va_list vargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100715{
716 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
717 PyObject **stack;
718 Py_ssize_t nargs;
719 PyObject *result;
720 Py_ssize_t i;
721 va_list countva;
722
723 if (callable == NULL) {
724 return null_error();
725 }
726
727 /* Count the number of arguments */
728 va_copy(countva, vargs);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700729 nargs = base ? 1 : 0;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100730 while (1) {
731 PyObject *arg = va_arg(countva, PyObject *);
732 if (arg == NULL) {
733 break;
734 }
735 nargs++;
736 }
737 va_end(countva);
738
739 /* Copy arguments */
740 if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
741 stack = small_stack;
742 }
743 else {
744 stack = PyMem_Malloc(nargs * sizeof(stack[0]));
745 if (stack == NULL) {
746 PyErr_NoMemory();
747 return NULL;
748 }
749 }
750
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700751 i = 0;
752 if (base) {
753 stack[i++] = base;
754 }
755
756 for (; i < nargs; ++i) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100757 stack[i] = va_arg(vargs, PyObject *);
758 }
759
760 /* Call the function */
761 result = _PyObject_FastCall(callable, stack, nargs);
762
763 if (stack != small_stack) {
764 PyMem_Free(stack);
765 }
766 return result;
767}
768
769
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700770PyObject *
Jeroen Demeyerb1263d52019-06-28 11:49:00 +0200771_PyObject_VectorcallMethod(PyObject *name, PyObject *const *args,
772 size_t nargsf, PyObject *kwnames)
773{
774 assert(name != NULL);
775 assert(args != NULL);
776 assert(PyVectorcall_NARGS(nargsf) >= 1);
777
Victor Stinner7e433732019-11-08 10:05:17 +0100778 PyThreadState *tstate = _PyThreadState_GET();
Jeroen Demeyerb1263d52019-06-28 11:49:00 +0200779 PyObject *callable = NULL;
780 /* Use args[0] as "self" argument */
781 int unbound = _PyObject_GetMethod(args[0], name, &callable);
782 if (callable == NULL) {
783 return NULL;
784 }
785
786 if (unbound) {
787 /* We must remove PY_VECTORCALL_ARGUMENTS_OFFSET since
788 * that would be interpreted as allowing to change args[-1] */
789 nargsf &= ~PY_VECTORCALL_ARGUMENTS_OFFSET;
790 }
791 else {
792 /* Skip "self". We can keep PY_VECTORCALL_ARGUMENTS_OFFSET since
793 * args[-1] in the onward call is args[0] here. */
794 args++;
795 nargsf--;
796 }
Victor Stinner7e433732019-11-08 10:05:17 +0100797 PyObject *result = _PyObject_VectorcallTstate(tstate, callable,
798 args, nargsf, kwnames);
Jeroen Demeyerb1263d52019-06-28 11:49:00 +0200799 Py_DECREF(callable);
800 return result;
801}
802
803
804PyObject *
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700805PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
806{
807 if (obj == NULL || name == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100808 return null_error();
809 }
810
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700811 PyObject *callable = NULL;
812 int is_method = _PyObject_GetMethod(obj, name, &callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100813 if (callable == NULL) {
814 return NULL;
815 }
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700816 obj = is_method ? obj : NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100817
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700818 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100819 va_start(vargs, name);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700820 PyObject *result = object_vacall(obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100821 va_end(vargs);
822
823 Py_DECREF(callable);
824 return result;
825}
826
827
828PyObject *
829_PyObject_CallMethodIdObjArgs(PyObject *obj,
830 struct _Py_Identifier *name, ...)
831{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100832 if (obj == NULL || name == NULL) {
833 return null_error();
834 }
835
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700836 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
837 if (!oname) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100838 return NULL;
839 }
840
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700841 PyObject *callable = NULL;
842 int is_method = _PyObject_GetMethod(obj, oname, &callable);
843 if (callable == NULL) {
844 return NULL;
845 }
846 obj = is_method ? obj : NULL;
847
848 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100849 va_start(vargs, name);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700850 PyObject *result = object_vacall(obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100851 va_end(vargs);
852
853 Py_DECREF(callable);
854 return result;
855}
856
857
858PyObject *
859PyObject_CallFunctionObjArgs(PyObject *callable, ...)
860{
861 va_list vargs;
862 PyObject *result;
863
864 va_start(vargs, callable);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700865 result = object_vacall(NULL, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100866 va_end(vargs);
867
868 return result;
869}
870
871
872/* --- PyStack functions ------------------------------------------ */
873
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100874PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200875_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100876{
877 Py_ssize_t nkwargs;
878 PyObject *kwdict;
879 Py_ssize_t i;
880
881 assert(kwnames != NULL);
882 nkwargs = PyTuple_GET_SIZE(kwnames);
883 kwdict = _PyDict_NewPresized(nkwargs);
884 if (kwdict == NULL) {
885 return NULL;
886 }
887
888 for (i = 0; i < nkwargs; i++) {
889 PyObject *key = PyTuple_GET_ITEM(kwnames, i);
890 PyObject *value = *values++;
891 /* If key already exists, replace it with the new value */
892 if (PyDict_SetItem(kwdict, key, value)) {
893 Py_DECREF(kwdict);
894 return NULL;
895 }
896 }
897 return kwdict;
898}
899
900
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200901/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple).
902
903 Allocate a new argument vector and keyword names tuple. Return the argument
904 vector; return NULL with exception set on error. Return the keyword names
905 tuple in *p_kwnames.
906
Jeroen Demeyer05677862019-08-16 12:41:27 +0200907 This also checks that all keyword names are strings. If not, a TypeError is
908 raised.
909
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200910 The newly allocated argument vector supports PY_VECTORCALL_ARGUMENTS_OFFSET.
911
Jeroen Demeyer05677862019-08-16 12:41:27 +0200912 When done, you must call _PyStack_UnpackDict_Free(stack, nargs, kwnames) */
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200913static PyObject *const *
Victor Stinner17269092019-11-05 01:22:12 +0100914_PyStack_UnpackDict(PyThreadState *tstate,
915 PyObject *const *args, Py_ssize_t nargs,
916 PyObject *kwargs, PyObject **p_kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100917{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100918 assert(nargs >= 0);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200919 assert(kwargs != NULL);
920 assert(PyDict_Check(kwargs));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100921
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200922 Py_ssize_t nkwargs = PyDict_GET_SIZE(kwargs);
923 /* Check for overflow in the PyMem_Malloc() call below. The subtraction
924 * in this check cannot overflow: both maxnargs and nkwargs are
925 * non-negative signed integers, so their difference fits in the type. */
926 Py_ssize_t maxnargs = PY_SSIZE_T_MAX / sizeof(args[0]) - 1;
927 if (nargs > maxnargs - nkwargs) {
Victor Stinner17269092019-11-05 01:22:12 +0100928 _PyErr_NoMemory(tstate);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200929 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100930 }
931
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200932 /* Add 1 to support PY_VECTORCALL_ARGUMENTS_OFFSET */
933 PyObject **stack = PyMem_Malloc((1 + nargs + nkwargs) * sizeof(args[0]));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100934 if (stack == NULL) {
Victor Stinner17269092019-11-05 01:22:12 +0100935 _PyErr_NoMemory(tstate);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200936 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100937 }
938
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200939 PyObject *kwnames = PyTuple_New(nkwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100940 if (kwnames == NULL) {
941 PyMem_Free(stack);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200942 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100943 }
944
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200945 stack++; /* For PY_VECTORCALL_ARGUMENTS_OFFSET */
946
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200947 /* Copy positional arguments */
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200948 for (Py_ssize_t i = 0; i < nargs; i++) {
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200949 Py_INCREF(args[i]);
950 stack[i] = args[i];
951 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100952
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200953 PyObject **kwstack = stack + nargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100954 /* This loop doesn't support lookup function mutating the dictionary
955 to change its size. It's a deliberate choice for speed, this function is
956 called in the performance critical hot code. */
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200957 Py_ssize_t pos = 0, i = 0;
958 PyObject *key, *value;
Jeroen Demeyer05677862019-08-16 12:41:27 +0200959 unsigned long keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100960 while (PyDict_Next(kwargs, &pos, &key, &value)) {
Jeroen Demeyer05677862019-08-16 12:41:27 +0200961 keys_are_strings &= Py_TYPE(key)->tp_flags;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100962 Py_INCREF(key);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200963 Py_INCREF(value);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100964 PyTuple_SET_ITEM(kwnames, i, key);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100965 kwstack[i] = value;
966 i++;
967 }
968
Jeroen Demeyer05677862019-08-16 12:41:27 +0200969 /* keys_are_strings has the value Py_TPFLAGS_UNICODE_SUBCLASS if that
970 * flag is set for all keys. Otherwise, keys_are_strings equals 0.
971 * We do this check once at the end instead of inside the loop above
972 * because it simplifies the deallocation in the failing case.
973 * It happens to also make the loop above slightly more efficient. */
974 if (!keys_are_strings) {
Victor Stinner17269092019-11-05 01:22:12 +0100975 _PyErr_SetString(tstate, PyExc_TypeError,
976 "keywords must be strings");
Jeroen Demeyer05677862019-08-16 12:41:27 +0200977 _PyStack_UnpackDict_Free(stack, nargs, kwnames);
978 return NULL;
979 }
980
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100981 *p_kwnames = kwnames;
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200982 return stack;
983}
984
985static void
986_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs,
987 PyObject *kwnames)
988{
989 Py_ssize_t n = PyTuple_GET_SIZE(kwnames) + nargs;
990 for (Py_ssize_t i = 0; i < n; i++) {
991 Py_DECREF(stack[i]);
992 }
993 PyMem_Free((PyObject **)stack - 1);
994 Py_DECREF(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100995}