Coverage Report

Created: 2026-05-16 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython/Objects/call.c
Line
Count
Source
1
#include "Python.h"
2
#include "pycore_call.h"          // _PyObject_CallNoArgsTstate()
3
#include "pycore_ceval.h"         // _Py_EnterRecursiveCallTstate()
4
#include "pycore_dict.h"          // _PyDict_FromItems()
5
#include "pycore_function.h"      // _PyFunction_Vectorcall() definition
6
#include "pycore_modsupport.h"    // _Py_VaBuildStack()
7
#include "pycore_object.h"        // _PyCFunctionWithKeywords_TrampolineCall()
8
#include "pycore_pyerrors.h"      // _PyErr_Occurred()
9
#include "pycore_pystate.h"       // _PyThreadState_GET()
10
#include "pycore_tuple.h"         // _PyTuple_ITEMS()
11
12
13
static PyObject *
14
null_error(PyThreadState *tstate)
15
0
{
16
0
    if (!_PyErr_Occurred(tstate)) {
17
0
        _PyErr_SetString(tstate, PyExc_SystemError,
18
0
                         "null argument to internal routine");
19
0
    }
20
0
    return NULL;
21
0
}
22
23
24
PyObject*
25
_Py_CheckFunctionResult(PyThreadState *tstate, PyObject *callable,
26
                        PyObject *result, const char *where)
27
824M
{
28
824M
    assert((callable != NULL) ^ (where != NULL));
29
30
824M
    if (result == NULL) {
31
18.7M
        if (!_PyErr_Occurred(tstate)) {
32
0
            if (callable)
33
0
                _PyErr_Format(tstate, PyExc_SystemError,
34
0
                              "%R returned NULL without setting an exception",
35
0
                              callable);
36
0
            else
37
0
                _PyErr_Format(tstate, PyExc_SystemError,
38
0
                              "%s returned NULL without setting an exception",
39
0
                              where);
40
#ifdef Py_DEBUG
41
            /* Ensure that the bug is caught in debug mode.
42
               Py_FatalError() logs the SystemError exception raised above. */
43
            Py_FatalError("a function returned NULL without setting an exception");
44
#endif
45
0
            return NULL;
46
0
        }
47
18.7M
    }
48
806M
    else {
49
806M
        if (_PyErr_Occurred(tstate)) {
50
0
            Py_DECREF(result);
51
52
0
            if (callable) {
53
0
                _PyErr_FormatFromCauseTstate(
54
0
                    tstate, PyExc_SystemError,
55
0
                    "%R returned a result with an exception set", callable);
56
0
            }
57
0
            else {
58
0
                _PyErr_FormatFromCauseTstate(
59
0
                    tstate, PyExc_SystemError,
60
0
                    "%s returned a result with an exception set", where);
61
0
            }
62
#ifdef Py_DEBUG
63
            /* Ensure that the bug is caught in debug mode.
64
               Py_FatalError() logs the SystemError exception raised above. */
65
            Py_FatalError("a function returned a result with an exception set");
66
#endif
67
0
            return NULL;
68
0
        }
69
806M
    }
70
824M
    return result;
71
824M
}
72
73
74
int
75
_Py_CheckSlotResult(PyObject *obj, const char *slot_name, int success)
76
0
{
77
0
    PyThreadState *tstate = _PyThreadState_GET();
78
0
    if (!success) {
79
0
        if (!_PyErr_Occurred(tstate)) {
80
0
            _Py_FatalErrorFormat(__func__,
81
0
                                 "Slot %s of type %s failed "
82
0
                                 "without setting an exception",
83
0
                                 slot_name, Py_TYPE(obj)->tp_name);
84
0
        }
85
0
    }
86
0
    else {
87
0
        if (_PyErr_Occurred(tstate)) {
88
0
            _Py_FatalErrorFormat(__func__,
89
0
                                 "Slot %s of type %s succeeded "
90
0
                                 "with an exception set",
91
0
                                 slot_name, Py_TYPE(obj)->tp_name);
92
0
        }
93
0
    }
94
0
    return 1;
95
0
}
96
97
98
/* --- Core PyObject call functions ------------------------------- */
99
100
/* Call a callable Python object without any arguments */
101
PyObject *
102
PyObject_CallNoArgs(PyObject *func)
103
391
{
104
391
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func);
105
391
    PyThreadState *tstate = _PyThreadState_GET();
106
391
    return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL);
107
391
}
108
109
110
PyObject *
111
_PyObject_VectorcallDictTstate(PyThreadState *tstate, PyObject *callable,
112
                               PyObject *const *args, size_t nargsf,
113
                               PyObject *kwargs)
114
50.8M
{
115
50.8M
    assert(callable != NULL);
116
117
    /* PyObject_VectorcallDict() must not be called with an exception set,
118
       because it can clear it (directly or indirectly) and so the
119
       caller loses its exception */
120
50.8M
    assert(!_PyErr_Occurred(tstate));
121
122
50.8M
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
123
50.8M
    assert(nargs >= 0);
124
50.8M
    assert(nargs == 0 || args != NULL);
125
50.8M
    assert(kwargs == NULL || PyDict_Check(kwargs));
126
127
50.8M
    vectorcallfunc func = PyVectorcall_Function(callable);
128
50.8M
    if (func == NULL) {
129
        /* Use tp_call instead */
130
5.70k
        return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwargs);
131
5.70k
    }
132
133
50.8M
    PyObject *res;
134
50.8M
    if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
135
42.7M
        res = func(callable, args, nargsf, NULL);
136
42.7M
    }
137
8.08M
    else {
138
8.08M
        PyObject *kwnames;
139
8.08M
        PyObject *const *newargs;
140
8.08M
        newargs = _PyStack_UnpackDict(tstate,
141
8.08M
                                      args, nargs,
142
8.08M
                                      kwargs, &kwnames);
143
8.08M
        if (newargs == NULL) {
144
0
            return NULL;
145
0
        }
146
8.08M
        res = func(callable, newargs,
147
8.08M
                   nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
148
8.08M
        _PyStack_UnpackDict_Free(newargs, nargs, kwnames);
149
8.08M
    }
150
50.8M
    return _Py_CheckFunctionResult(tstate, callable, res, NULL);
151
50.8M
}
152
153
154
PyObject *
155
PyObject_VectorcallDict(PyObject *callable, PyObject *const *args,
156
                       size_t nargsf, PyObject *kwargs)
157
266k
{
158
266k
    PyThreadState *tstate = _PyThreadState_GET();
159
266k
    return _PyObject_VectorcallDictTstate(tstate, callable, args, nargsf, kwargs);
160
266k
}
161
162
static void
163
object_is_not_callable(PyThreadState *tstate, PyObject *callable)
164
0
{
165
0
    if (Py_IS_TYPE(callable, &PyModule_Type)) {
166
        // >>> import pprint
167
        // >>> pprint(thing)
168
        // Traceback (most recent call last):
169
        //   File "<stdin>", line 1, in <module>
170
        // TypeError: 'module' object is not callable. Did you mean: 'pprint.pprint(...)'?
171
0
        PyObject *name = PyModule_GetNameObject(callable);
172
0
        if (name == NULL) {
173
0
            _PyErr_Clear(tstate);
174
0
            goto basic_type_error;
175
0
        }
176
0
        PyObject *attr;
177
0
        int res = PyObject_GetOptionalAttr(callable, name, &attr);
178
0
        if (res < 0) {
179
0
            _PyErr_Clear(tstate);
180
0
        }
181
0
        else if (res > 0 && PyCallable_Check(attr)) {
182
0
            _PyErr_Format(tstate, PyExc_TypeError,
183
0
                          "'%.200s' object is not callable. "
184
0
                          "Did you mean: '%U.%U(...)'?",
185
0
                          Py_TYPE(callable)->tp_name, name, name);
186
0
            Py_DECREF(attr);
187
0
            Py_DECREF(name);
188
0
            return;
189
0
        }
190
0
        Py_XDECREF(attr);
191
0
        Py_DECREF(name);
192
0
    }
193
0
basic_type_error:
194
0
    _PyErr_Format(tstate, PyExc_TypeError, "'%.200s' object is not callable",
195
0
                  Py_TYPE(callable)->tp_name);
196
0
}
197
198
199
PyObject *
200
_PyObject_MakeTpCall(PyThreadState *tstate, PyObject *callable,
201
                     PyObject *const *args, Py_ssize_t nargs,
202
                     PyObject *keywords)
203
154M
{
204
154M
    assert(nargs >= 0);
205
154M
    assert(nargs == 0 || args != NULL);
206
154M
    assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords));
207
208
    /* Slow path: build a temporary tuple for positional arguments and a
209
     * temporary dictionary for keyword arguments (if any) */
210
154M
    ternaryfunc call = Py_TYPE(callable)->tp_call;
211
154M
    if (call == NULL) {
212
0
        object_is_not_callable(tstate, callable);
213
0
        return NULL;
214
0
    }
215
216
154M
    PyObject *argstuple = PyTuple_FromArray(args, nargs);
217
154M
    if (argstuple == NULL) {
218
0
        return NULL;
219
0
    }
220
221
154M
    PyObject *kwdict;
222
154M
    if (keywords == NULL || PyDict_Check(keywords)) {
223
145M
        kwdict = keywords;
224
145M
    }
225
8.38M
    else {
226
8.38M
        if (PyTuple_GET_SIZE(keywords)) {
227
8.38M
            assert(args != NULL);
228
8.38M
            kwdict = _PyStack_AsDict(args + nargs, keywords);
229
8.38M
            if (kwdict == NULL) {
230
0
                Py_DECREF(argstuple);
231
0
                return NULL;
232
0
            }
233
8.38M
        }
234
0
        else {
235
0
            keywords = kwdict = NULL;
236
0
        }
237
8.38M
    }
238
239
154M
    PyObject *result = NULL;
240
154M
    if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object") == 0)
241
154M
    {
242
154M
        result = _PyCFunctionWithKeywords_TrampolineCall(
243
154M
            (PyCFunctionWithKeywords)call, callable, argstuple, kwdict);
244
154M
        _Py_LeaveRecursiveCallTstate(tstate);
245
154M
    }
246
247
154M
    Py_DECREF(argstuple);
248
154M
    if (kwdict != keywords) {
249
8.38M
        Py_DECREF(kwdict);
250
8.38M
    }
251
252
154M
    return _Py_CheckFunctionResult(tstate, callable, result, NULL);
253
154M
}
254
255
256
vectorcallfunc
257
PyVectorcall_Function(PyObject *callable)
258
89.3M
{
259
89.3M
    return _PyVectorcall_FunctionInline(callable);
260
89.3M
}
261
262
263
static PyObject *
264
_PyVectorcall_Call(PyThreadState *tstate, vectorcallfunc func,
265
                   PyObject *callable, PyObject *tuple, PyObject *kwargs)
266
28.4M
{
267
28.4M
    assert(func != NULL);
268
269
28.4M
    Py_ssize_t nargs = PyTuple_GET_SIZE(tuple);
270
271
    /* Fast path for no keywords */
272
28.4M
    if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
273
24.3M
        return func(callable, _PyTuple_ITEMS(tuple), nargs, NULL);
274
24.3M
    }
275
276
    /* Convert arguments & call */
277
4.10M
    PyObject *const *args;
278
4.10M
    PyObject *kwnames;
279
4.10M
    args = _PyStack_UnpackDict(tstate,
280
4.10M
                               _PyTuple_ITEMS(tuple), nargs,
281
4.10M
                               kwargs, &kwnames);
282
4.10M
    if (args == NULL) {
283
0
        return NULL;
284
0
    }
285
4.10M
    PyObject *result = func(callable, args,
286
4.10M
                            nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
287
4.10M
    _PyStack_UnpackDict_Free(args, nargs, kwnames);
288
289
4.10M
    return _Py_CheckFunctionResult(tstate, callable, result, NULL);
290
4.10M
}
291
292
293
PyObject *
294
PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs)
295
0
{
296
0
    PyThreadState *tstate = _PyThreadState_GET();
297
298
    /* get vectorcallfunc as in _PyVectorcall_Function, but without
299
     * the Py_TPFLAGS_HAVE_VECTORCALL check */
300
0
    Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset;
301
0
    if (offset <= 0) {
302
0
        _PyErr_Format(tstate, PyExc_TypeError,
303
0
                      "'%.200s' object does not support vectorcall",
304
0
                      Py_TYPE(callable)->tp_name);
305
0
        return NULL;
306
0
    }
307
0
    assert(PyCallable_Check(callable));
308
309
0
    vectorcallfunc func;
310
0
    memcpy(&func, (char *) callable + offset, sizeof(func));
311
0
    if (func == NULL) {
312
0
        _PyErr_Format(tstate, PyExc_TypeError,
313
0
                      "'%.200s' object does not support vectorcall",
314
0
                      Py_TYPE(callable)->tp_name);
315
0
        return NULL;
316
0
    }
317
318
0
    return _PyVectorcall_Call(tstate, func, callable, tuple, kwargs);
319
0
}
320
321
322
PyObject *
323
PyObject_Vectorcall(PyObject *callable, PyObject *const *args,
324
                     size_t nargsf, PyObject *kwnames)
325
295M
{
326
295M
    PyThreadState *tstate = _PyThreadState_GET();
327
295M
    return _PyObject_VectorcallTstate(tstate, callable,
328
295M
                                      args, nargsf, kwnames);
329
295M
}
330
331
332
PyObject *
333
_PyObject_Call(PyThreadState *tstate, PyObject *callable,
334
               PyObject *args, PyObject *kwargs)
335
38.2M
{
336
38.2M
    ternaryfunc call;
337
38.2M
    PyObject *result;
338
339
    /* PyObject_Call() must not be called with an exception set,
340
       because it can clear it (directly or indirectly) and so the
341
       caller loses its exception */
342
38.2M
    assert(!_PyErr_Occurred(tstate));
343
38.2M
    assert(PyTuple_Check(args));
344
38.2M
    assert(kwargs == NULL || PyDict_Check(kwargs));
345
38.2M
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable);
346
38.2M
    vectorcallfunc vector_func = PyVectorcall_Function(callable);
347
38.2M
    if (vector_func != NULL) {
348
28.4M
        return _PyVectorcall_Call(tstate, vector_func, callable, args, kwargs);
349
28.4M
    }
350
9.83M
    else {
351
9.83M
        call = Py_TYPE(callable)->tp_call;
352
9.83M
        if (call == NULL) {
353
0
            object_is_not_callable(tstate, callable);
354
0
            return NULL;
355
0
        }
356
357
9.83M
        if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) {
358
0
            return NULL;
359
0
        }
360
361
9.83M
        result = (*call)(callable, args, kwargs);
362
363
9.83M
        _Py_LeaveRecursiveCallTstate(tstate);
364
365
9.83M
        return _Py_CheckFunctionResult(tstate, callable, result, NULL);
366
9.83M
    }
367
38.2M
}
368
369
PyObject *
370
PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
371
38.1M
{
372
38.1M
    PyThreadState *tstate = _PyThreadState_GET();
373
38.1M
    return _PyObject_Call(tstate, callable, args, kwargs);
374
38.1M
}
375
376
377
/* Function removed in the Python 3.13 API but kept in the stable ABI. */
378
PyAPI_FUNC(PyObject *)
379
PyCFunction_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
380
0
{
381
0
    return PyObject_Call(callable, args, kwargs);
382
0
}
383
384
385
PyObject *
386
PyObject_CallOneArg(PyObject *func, PyObject *arg)
387
72.2M
{
388
72.2M
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func);
389
72.2M
    assert(arg != NULL);
390
72.2M
    PyObject *_args[2];
391
72.2M
    PyObject **args = _args + 1;  // For PY_VECTORCALL_ARGUMENTS_OFFSET
392
72.2M
    args[0] = arg;
393
72.2M
    PyThreadState *tstate = _PyThreadState_GET();
394
72.2M
    size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;
395
72.2M
    return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL);
396
72.2M
}
397
398
399
/* --- PyFunction call functions ---------------------------------- */
400
401
PyObject *
402
_PyFunction_Vectorcall(PyObject *func, PyObject* const* stack,
403
                       size_t nargsf, PyObject *kwnames)
404
197M
{
405
197M
    assert(PyFunction_Check(func));
406
197M
    PyFunctionObject *f = (PyFunctionObject *)func;
407
197M
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
408
197M
    assert(nargs >= 0);
409
197M
    PyThreadState *tstate = _PyThreadState_GET();
410
197M
    assert(nargs == 0 || stack != NULL);
411
197M
    EVAL_CALL_STAT_INC(EVAL_CALL_FUNCTION_VECTORCALL);
412
197M
    if (((PyCodeObject *)f->func_code)->co_flags & CO_OPTIMIZED) {
413
197M
        return _PyEval_Vector(tstate, f, NULL, stack, nargs, kwnames);
414
197M
    }
415
0
    else {
416
0
        return _PyEval_Vector(tstate, f, f->func_globals, stack, nargs, kwnames);
417
0
    }
418
197M
}
419
420
/* --- More complex call functions -------------------------------- */
421
422
/* External interface to call any callable object.
423
   The args must be a tuple or NULL.  The kwargs must be a dict or NULL.
424
   Function removed in Python 3.13 API but kept in the stable ABI. */
425
PyAPI_FUNC(PyObject*)
426
PyEval_CallObjectWithKeywords(PyObject *callable,
427
                              PyObject *args, PyObject *kwargs)
428
0
{
429
0
    PyThreadState *tstate = _PyThreadState_GET();
430
#ifdef Py_DEBUG
431
    /* PyEval_CallObjectWithKeywords() must not be called with an exception
432
       set. It raises a new exception if parameters are invalid or if
433
       PyTuple_New() fails, and so the original exception is lost. */
434
    assert(!_PyErr_Occurred(tstate));
435
#endif
436
437
0
    if (args != NULL && !PyTuple_Check(args)) {
438
0
        _PyErr_SetString(tstate, PyExc_TypeError,
439
0
                         "argument list must be a tuple");
440
0
        return NULL;
441
0
    }
442
443
0
    if (kwargs != NULL && !PyDict_Check(kwargs)) {
444
0
        _PyErr_SetString(tstate, PyExc_TypeError,
445
0
                         "keyword list must be a dictionary");
446
0
        return NULL;
447
0
    }
448
449
0
    if (args == NULL) {
450
0
        return _PyObject_VectorcallDictTstate(tstate, callable,
451
0
                                              NULL, 0, kwargs);
452
0
    }
453
0
    else {
454
0
        return _PyObject_Call(tstate, callable, args, kwargs);
455
0
    }
456
0
}
457
458
459
PyObject *
460
PyObject_CallObject(PyObject *callable, PyObject *args)
461
143k
{
462
143k
    PyThreadState *tstate = _PyThreadState_GET();
463
143k
    assert(!_PyErr_Occurred(tstate));
464
143k
    if (args == NULL) {
465
0
        return _PyObject_CallNoArgsTstate(tstate, callable);
466
0
    }
467
143k
    if (!PyTuple_Check(args)) {
468
0
        _PyErr_SetString(tstate, PyExc_TypeError,
469
0
                         "argument list must be a tuple");
470
0
        return NULL;
471
0
    }
472
143k
    return _PyObject_Call(tstate, callable, args, NULL);
473
143k
}
474
475
476
/* Call callable(obj, *args, **kwargs). */
477
PyObject *
478
_PyObject_Call_Prepend(PyThreadState *tstate, PyObject *callable,
479
                       PyObject *obj, PyObject *args, PyObject *kwargs)
480
50.5M
{
481
50.5M
    assert(PyTuple_Check(args));
482
483
50.5M
    PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
484
50.5M
    PyObject **stack;
485
486
50.5M
    Py_ssize_t argcount = PyTuple_GET_SIZE(args);
487
50.5M
    if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
488
50.3M
        stack = small_stack;
489
50.3M
    }
490
287k
    else {
491
287k
        stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
492
287k
        if (stack == NULL) {
493
0
            PyErr_NoMemory();
494
0
            return NULL;
495
0
        }
496
287k
    }
497
498
    /* use borrowed references */
499
50.5M
    stack[0] = obj;
500
50.5M
    memcpy(&stack[1],
501
50.5M
           _PyTuple_ITEMS(args),
502
50.5M
           argcount * sizeof(PyObject *));
503
504
50.5M
    PyObject *result = _PyObject_VectorcallDictTstate(tstate, callable,
505
50.5M
                                                      stack, argcount + 1,
506
50.5M
                                                      kwargs);
507
50.5M
    if (stack != small_stack) {
508
287k
        PyMem_Free(stack);
509
287k
    }
510
50.5M
    return result;
511
50.5M
}
512
513
514
/* --- Call with a format string ---------------------------------- */
515
516
static PyObject *
517
_PyObject_CallFunctionVa(PyThreadState *tstate, PyObject *callable,
518
                         const char *format, va_list va)
519
5.22M
{
520
5.22M
    PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
521
5.22M
    const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
522
5.22M
    PyObject **stack;
523
5.22M
    Py_ssize_t nargs, i;
524
5.22M
    PyObject *result;
525
526
5.22M
    if (callable == NULL) {
527
0
        return null_error(tstate);
528
0
    }
529
530
5.22M
    if (!format || !*format) {
531
1.95k
        return _PyObject_CallNoArgsTstate(tstate, callable);
532
1.95k
    }
533
534
5.22M
    stack = _Py_VaBuildStack(small_stack, small_stack_len,
535
5.22M
                             format, va, &nargs);
536
5.22M
    if (stack == NULL) {
537
0
        return NULL;
538
0
    }
539
5.22M
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable);
540
5.22M
    if (nargs == 1 && PyTuple_Check(stack[0])) {
541
        /* Special cases for backward compatibility:
542
           - PyObject_CallFunction(func, "O", tuple) calls func(*tuple)
543
           - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls
544
             func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */
545
12.4k
        PyObject *args = stack[0];
546
12.4k
        result = _PyObject_VectorcallTstate(tstate, callable,
547
12.4k
                                            _PyTuple_ITEMS(args),
548
12.4k
                                            PyTuple_GET_SIZE(args),
549
12.4k
                                            NULL);
550
12.4k
    }
551
5.21M
    else {
552
5.21M
        result = _PyObject_VectorcallTstate(tstate, callable,
553
5.21M
                                            stack, nargs, NULL);
554
5.21M
    }
555
556
25.5M
    for (i = 0; i < nargs; ++i) {
557
20.2M
        Py_DECREF(stack[i]);
558
20.2M
    }
559
5.22M
    if (stack != small_stack) {
560
222
        PyMem_Free(stack);
561
222
    }
562
5.22M
    return result;
563
5.22M
}
564
565
566
PyObject *
567
PyObject_CallFunction(PyObject *callable, const char *format, ...)
568
3.45M
{
569
3.45M
    va_list va;
570
3.45M
    PyObject *result;
571
3.45M
    PyThreadState *tstate = _PyThreadState_GET();
572
573
3.45M
    va_start(va, format);
574
3.45M
    result = _PyObject_CallFunctionVa(tstate, callable, format, va);
575
3.45M
    va_end(va);
576
577
3.45M
    return result;
578
3.45M
}
579
580
581
/* PyEval_CallFunction is exact copy of PyObject_CallFunction.
582
   Function removed in Python 3.13 API but kept in the stable ABI. */
583
PyAPI_FUNC(PyObject*)
584
PyEval_CallFunction(PyObject *callable, const char *format, ...)
585
0
{
586
0
    va_list va;
587
0
    PyObject *result;
588
0
    PyThreadState *tstate = _PyThreadState_GET();
589
590
0
    va_start(va, format);
591
0
    result = _PyObject_CallFunctionVa(tstate, callable, format, va);
592
0
    va_end(va);
593
594
0
    return result;
595
0
}
596
597
598
/* _PyObject_CallFunction_SizeT is exact copy of PyObject_CallFunction.
599
 * This function must be kept because it is part of the stable ABI.
600
 */
601
PyAPI_FUNC(PyObject *)  /* abi_only */
602
_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
603
0
{
604
0
    PyThreadState *tstate = _PyThreadState_GET();
605
606
0
    va_list va;
607
0
    va_start(va, format);
608
0
    PyObject *result = _PyObject_CallFunctionVa(tstate, callable, format, va);
609
0
    va_end(va);
610
611
0
    return result;
612
0
}
613
614
615
static PyObject*
616
callmethod(PyThreadState *tstate, PyObject* callable, const char *format, va_list va)
617
1.77M
{
618
1.77M
    assert(callable != NULL);
619
1.77M
    if (!PyCallable_Check(callable)) {
620
0
        _PyErr_Format(tstate, PyExc_TypeError,
621
0
                      "attribute of type '%.200s' is not callable",
622
0
                      Py_TYPE(callable)->tp_name);
623
0
        return NULL;
624
0
    }
625
626
1.77M
    return _PyObject_CallFunctionVa(tstate, callable, format, va);
627
1.77M
}
628
629
PyObject *
630
PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
631
4.92k
{
632
4.92k
    PyThreadState *tstate = _PyThreadState_GET();
633
634
4.92k
    if (obj == NULL || name == NULL) {
635
0
        return null_error(tstate);
636
0
    }
637
638
4.92k
    PyObject *callable = PyObject_GetAttrString(obj, name);
639
4.92k
    if (callable == NULL) {
640
0
        return NULL;
641
0
    }
642
643
4.92k
    va_list va;
644
4.92k
    va_start(va, format);
645
4.92k
    PyObject *retval = callmethod(tstate, callable, format, va);
646
4.92k
    va_end(va);
647
648
4.92k
    Py_DECREF(callable);
649
4.92k
    return retval;
650
4.92k
}
651
652
653
/* PyEval_CallMethod is exact copy of PyObject_CallMethod.
654
   Function removed in Python 3.13 API but kept in the stable ABI. */
655
PyAPI_FUNC(PyObject*)
656
PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...)
657
0
{
658
0
    PyThreadState *tstate = _PyThreadState_GET();
659
0
    if (obj == NULL || name == NULL) {
660
0
        return null_error(tstate);
661
0
    }
662
663
0
    PyObject *callable = PyObject_GetAttrString(obj, name);
664
0
    if (callable == NULL) {
665
0
        return NULL;
666
0
    }
667
668
0
    va_list va;
669
0
    va_start(va, format);
670
0
    PyObject *retval = callmethod(tstate, callable, format, va);
671
0
    va_end(va);
672
673
0
    Py_DECREF(callable);
674
0
    return retval;
675
0
}
676
677
678
PyObject *
679
_PyObject_CallMethod(PyObject *obj, PyObject *name,
680
                     const char *format, ...)
681
1.76M
{
682
1.76M
    PyThreadState *tstate = _PyThreadState_GET();
683
1.76M
    if (obj == NULL || name == NULL) {
684
0
        return null_error(tstate);
685
0
    }
686
687
1.76M
    PyObject *callable = PyObject_GetAttr(obj, name);
688
1.76M
    if (callable == NULL) {
689
0
        return NULL;
690
0
    }
691
692
1.76M
    va_list va;
693
1.76M
    va_start(va, format);
694
1.76M
    PyObject *retval = callmethod(tstate, callable, format, va);
695
1.76M
    va_end(va);
696
697
1.76M
    Py_DECREF(callable);
698
1.76M
    return retval;
699
1.76M
}
700
701
702
PyObject *
703
_PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name,
704
                       const char *format, ...)
705
0
{
706
0
    PyThreadState *tstate = _PyThreadState_GET();
707
0
    if (obj == NULL || name == NULL) {
708
0
        return null_error(tstate);
709
0
    }
710
711
0
_Py_COMP_DIAG_PUSH
712
0
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
713
0
    PyObject *callable = _PyObject_GetAttrId(obj, name);
714
0
_Py_COMP_DIAG_POP
715
0
    if (callable == NULL) {
716
0
        return NULL;
717
0
    }
718
719
0
    va_list va;
720
0
    va_start(va, format);
721
0
    PyObject *retval = callmethod(tstate, callable, format, va);
722
0
    va_end(va);
723
724
0
    Py_DECREF(callable);
725
0
    return retval;
726
0
}
727
728
729
PyObject * _PyObject_CallMethodFormat(PyThreadState *tstate, PyObject *callable,
730
                                      const char *format, ...)
731
0
{
732
0
    assert(callable != NULL);
733
0
    va_list va;
734
0
    va_start(va, format);
735
0
    PyObject *retval = callmethod(tstate, callable, format, va);
736
0
    va_end(va);
737
0
    return retval;
738
0
}
739
740
741
// _PyObject_CallMethod_SizeT is exact copy of PyObject_CallMethod.
742
// This function must be kept because it is part of the stable ABI.
743
PyAPI_FUNC(PyObject *)  /* abi_only */
744
_PyObject_CallMethod_SizeT(PyObject *obj, const char *name,
745
                           const char *format, ...)
746
0
{
747
0
    PyThreadState *tstate = _PyThreadState_GET();
748
0
    if (obj == NULL || name == NULL) {
749
0
        return null_error(tstate);
750
0
    }
751
752
0
    PyObject *callable = PyObject_GetAttrString(obj, name);
753
0
    if (callable == NULL) {
754
0
        return NULL;
755
0
    }
756
757
0
    va_list va;
758
0
    va_start(va, format);
759
0
    PyObject *retval = callmethod(tstate, callable, format, va);
760
0
    va_end(va);
761
762
0
    Py_DECREF(callable);
763
0
    return retval;
764
0
}
765
766
767
/* --- Call with "..." arguments ---------------------------------- */
768
769
static PyObject *
770
object_vacall(PyThreadState *tstate, PyObject *base,
771
              PyObject *callable, va_list vargs)
772
345k
{
773
345k
    PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
774
345k
    PyObject **stack;
775
345k
    Py_ssize_t nargs;
776
345k
    PyObject *result;
777
345k
    Py_ssize_t i;
778
345k
    va_list countva;
779
780
345k
    if (callable == NULL) {
781
0
        return null_error(tstate);
782
0
    }
783
784
    /* Count the number of arguments */
785
345k
    va_copy(countva, vargs);
786
345k
    nargs = base ? 1 : 0;
787
2.56M
    while (1) {
788
2.56M
        PyObject *arg = va_arg(countva, PyObject *);
789
2.56M
        if (arg == NULL) {
790
345k
            break;
791
345k
        }
792
2.22M
        nargs++;
793
2.22M
    }
794
345k
    va_end(countva);
795
796
    /* Copy arguments */
797
345k
    if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
798
85.2k
        stack = small_stack;
799
85.2k
    }
800
259k
    else {
801
259k
        stack = PyMem_Malloc(nargs * sizeof(stack[0]));
802
259k
        if (stack == NULL) {
803
0
            PyErr_NoMemory();
804
0
            return NULL;
805
0
        }
806
259k
    }
807
808
345k
    i = 0;
809
345k
    if (base) {
810
43.5k
        stack[i++] = base;
811
43.5k
    }
812
813
2.56M
    for (; i < nargs; ++i) {
814
2.22M
        stack[i] = va_arg(vargs, PyObject *);
815
2.22M
    }
816
817
#ifdef Py_STATS
818
    if (PyFunction_Check(callable)) {
819
        EVAL_CALL_STAT_INC(EVAL_CALL_API);
820
    }
821
#endif
822
    /* Call the function */
823
345k
    result = _PyObject_VectorcallTstate(tstate, callable, stack, nargs, NULL);
824
825
345k
    if (stack != small_stack) {
826
259k
        PyMem_Free(stack);
827
259k
    }
828
345k
    return result;
829
345k
}
830
831
PyObject *
832
_PyObject_VectorcallPrepend(PyThreadState *tstate, PyObject *callable,
833
                            PyObject *arg, PyObject *const *args,
834
                            size_t nargsf, PyObject *kwnames)
835
35.4M
{
836
35.4M
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
837
35.4M
    assert(nargs == 0 || args[nargs-1]);
838
839
35.4M
    PyObject *result;
840
35.4M
    if (nargsf & PY_VECTORCALL_ARGUMENTS_OFFSET) {
841
        /* PY_VECTORCALL_ARGUMENTS_OFFSET is set, so we are allowed to mutate the vector */
842
4.25M
        PyObject **newargs = (PyObject**)args - 1;
843
4.25M
        nargs += 1;
844
4.25M
        PyObject *tmp = newargs[0];
845
4.25M
        newargs[0] = arg;
846
4.25M
        assert(newargs[nargs-1]);
847
4.25M
        result = _PyObject_VectorcallTstate(tstate, callable, newargs,
848
4.25M
                                            nargs, kwnames);
849
4.25M
        newargs[0] = tmp;
850
4.25M
    }
851
31.2M
    else {
852
31.2M
        Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
853
31.2M
        Py_ssize_t totalargs = nargs + nkwargs;
854
31.2M
        if (totalargs == 0) {
855
416
            return _PyObject_VectorcallTstate(tstate, callable, &arg, 1, NULL);
856
416
        }
857
858
31.2M
        PyObject *newargs_stack[_PY_FASTCALL_SMALL_STACK];
859
31.2M
        PyObject **newargs;
860
31.2M
        if (totalargs <= (Py_ssize_t)Py_ARRAY_LENGTH(newargs_stack) - 1) {
861
31.2M
            newargs = newargs_stack;
862
31.2M
        }
863
2.48k
        else {
864
2.48k
            newargs = PyMem_Malloc((totalargs+1) * sizeof(PyObject *));
865
2.48k
            if (newargs == NULL) {
866
0
                _PyErr_NoMemory(tstate);
867
0
                return NULL;
868
0
            }
869
2.48k
        }
870
        /* use borrowed references */
871
31.2M
        newargs[0] = arg;
872
        /* bpo-37138: since totalargs > 0, it's impossible that args is NULL.
873
         * We need this, since calling memcpy() with a NULL pointer is
874
         * undefined behaviour. */
875
31.2M
        assert(args != NULL);
876
31.2M
        memcpy(newargs + 1, args, totalargs * sizeof(PyObject *));
877
31.2M
        result = _PyObject_VectorcallTstate(tstate, callable,
878
31.2M
                                            newargs, nargs+1, kwnames);
879
31.2M
        if (newargs != newargs_stack) {
880
2.48k
            PyMem_Free(newargs);
881
2.48k
        }
882
31.2M
    }
883
35.4M
    return result;
884
35.4M
}
885
886
PyObject *
887
PyObject_VectorcallMethod(PyObject *name, PyObject *const *args,
888
                           size_t nargsf, PyObject *kwnames)
889
5.02M
{
890
5.02M
    assert(name != NULL);
891
5.02M
    assert(args != NULL);
892
5.02M
    assert(PyVectorcall_NARGS(nargsf) >= 1);
893
894
5.02M
    PyThreadState *tstate = _PyThreadState_GET();
895
5.02M
    _PyCStackRef self, method;
896
5.02M
    _PyThreadState_PushCStackRef(tstate, &self);
897
5.02M
    _PyThreadState_PushCStackRef(tstate, &method);
898
    /* Use args[0] as "self" argument */
899
5.02M
    self.ref = PyStackRef_FromPyObjectBorrow(args[0]);
900
5.02M
    int unbound = _PyObject_GetMethodStackRef(tstate, &self.ref, name, &method.ref);
901
5.02M
    if (unbound < 0) {
902
5
        _PyThreadState_PopCStackRef(tstate, &method);
903
5
        _PyThreadState_PopCStackRef(tstate, &self);
904
5
        return NULL;
905
5
    }
906
907
5.02M
    PyObject *callable = PyStackRef_AsPyObjectBorrow(method.ref);
908
5.02M
    PyObject *self_obj = PyStackRef_AsPyObjectBorrow(self.ref);
909
5.02M
    PyObject *result;
910
911
5.02M
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_METHOD, callable);
912
5.02M
    if (self_obj == NULL) {
913
        /* Skip "self". We can keep PY_VECTORCALL_ARGUMENTS_OFFSET since
914
         * args[-1] in the onward call is args[0] here. */
915
92.9k
        result = _PyObject_VectorcallTstate(tstate, callable,
916
92.9k
                                            args + 1, nargsf - 1, kwnames);
917
92.9k
    }
918
4.92M
    else if (self_obj == args[0]) {
919
        /* We must remove PY_VECTORCALL_ARGUMENTS_OFFSET since
920
         * that would be interpreted as allowing to change args[-1] */
921
4.92M
        result = _PyObject_VectorcallTstate(tstate, callable, args,
922
4.92M
                                            nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET,
923
4.92M
                                            kwnames);
924
4.92M
    }
925
0
    else {
926
        /* classmethod: self_obj is the type, not args[0]. Replace
927
         * args[0] with self_obj and call the underlying callable. */
928
0
        result = _PyObject_VectorcallPrepend(tstate, callable, self_obj,
929
0
                                             args + 1, nargsf - 1, kwnames);
930
0
    }
931
5.02M
    _PyThreadState_PopCStackRef(tstate, &method);
932
5.02M
    _PyThreadState_PopCStackRef(tstate, &self);
933
5.02M
    return result;
934
5.02M
}
935
936
937
PyObject *
938
PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
939
65.2k
{
940
65.2k
    PyThreadState *tstate = _PyThreadState_GET();
941
65.2k
    if (obj == NULL || name == NULL) {
942
0
        return null_error(tstate);
943
0
    }
944
945
65.2k
    _PyCStackRef self, method;
946
65.2k
    _PyThreadState_PushCStackRef(tstate, &self);
947
65.2k
    _PyThreadState_PushCStackRef(tstate, &method);
948
65.2k
    self.ref = PyStackRef_FromPyObjectBorrow(obj);
949
65.2k
    int res = _PyObject_GetMethodStackRef(tstate, &self.ref, name, &method.ref);
950
65.2k
    if (res < 0) {
951
0
        _PyThreadState_PopCStackRef(tstate, &method);
952
0
        _PyThreadState_PopCStackRef(tstate, &self);
953
0
        return NULL;
954
0
    }
955
65.2k
    PyObject *callable = PyStackRef_AsPyObjectBorrow(method.ref);
956
65.2k
    PyObject *self_obj = PyStackRef_AsPyObjectBorrow(self.ref);
957
958
65.2k
    va_list vargs;
959
65.2k
    va_start(vargs, name);
960
65.2k
    PyObject *result = object_vacall(tstate, self_obj, callable, vargs);
961
65.2k
    va_end(vargs);
962
963
65.2k
    _PyThreadState_PopCStackRef(tstate, &method);
964
65.2k
    _PyThreadState_PopCStackRef(tstate, &self);
965
65.2k
    return result;
966
65.2k
}
967
968
969
PyObject *
970
PyObject_CallFunctionObjArgs(PyObject *callable, ...)
971
279k
{
972
279k
    PyThreadState *tstate = _PyThreadState_GET();
973
279k
    va_list vargs;
974
279k
    PyObject *result;
975
976
279k
    va_start(vargs, callable);
977
279k
    result = object_vacall(tstate, NULL, callable, vargs);
978
279k
    va_end(vargs);
979
980
279k
    return result;
981
279k
}
982
983
984
/* --- PyStack functions ------------------------------------------ */
985
986
PyObject *
987
_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
988
8.38M
{
989
8.38M
    Py_ssize_t nkwargs;
990
991
8.38M
    assert(kwnames != NULL);
992
8.38M
    nkwargs = PyTuple_GET_SIZE(kwnames);
993
8.38M
    return _PyDict_FromItems(&PyTuple_GET_ITEM(kwnames, 0), 1,
994
8.38M
                             values, 1, nkwargs);
995
8.38M
}
996
997
998
/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple).
999
1000
   Allocate a new argument vector and keyword names tuple. Return the argument
1001
   vector; return NULL with exception set on error. Return the keyword names
1002
   tuple in *p_kwnames.
1003
1004
   This also checks that all keyword names are strings. If not, a TypeError is
1005
   raised.
1006
1007
   The newly allocated argument vector supports PY_VECTORCALL_ARGUMENTS_OFFSET.
1008
1009
   The positional arguments are borrowed references from the input array
1010
   (which must be kept alive by the caller). The keyword argument values
1011
   are new references.
1012
1013
   When done, you must call _PyStack_UnpackDict_Free(stack, nargs, kwnames) */
1014
PyObject *const *
1015
_PyStack_UnpackDict(PyThreadState *tstate,
1016
                    PyObject *const *args, Py_ssize_t nargs,
1017
                    PyObject *kwargs, PyObject **p_kwnames)
1018
12.2M
{
1019
12.2M
    assert(nargs >= 0);
1020
12.2M
    assert(kwargs != NULL);
1021
12.2M
    assert(PyDict_Check(kwargs));
1022
1023
12.2M
    Py_ssize_t nkwargs = PyDict_GET_SIZE(kwargs);
1024
    /* Check for overflow in the PyMem_Malloc() call below. The subtraction
1025
     * in this check cannot overflow: both maxnargs and nkwargs are
1026
     * non-negative signed integers, so their difference fits in the type. */
1027
12.2M
    Py_ssize_t maxnargs = PY_SSIZE_T_MAX / sizeof(args[0]) - 1;
1028
12.2M
    if (nargs > maxnargs - nkwargs) {
1029
0
        _PyErr_NoMemory(tstate);
1030
0
        return NULL;
1031
0
    }
1032
1033
    /* Add 1 to support PY_VECTORCALL_ARGUMENTS_OFFSET */
1034
12.2M
    PyObject **stack = PyMem_Malloc((1 + nargs + nkwargs) * sizeof(args[0]));
1035
12.2M
    if (stack == NULL) {
1036
0
        _PyErr_NoMemory(tstate);
1037
0
        return NULL;
1038
0
    }
1039
1040
12.2M
    PyObject *kwnames = PyTuple_New(nkwargs);
1041
12.2M
    if (kwnames == NULL) {
1042
0
        PyMem_Free(stack);
1043
0
        return NULL;
1044
0
    }
1045
1046
12.2M
    stack++;  /* For PY_VECTORCALL_ARGUMENTS_OFFSET */
1047
1048
    /* Copy positional arguments (borrowed references) */
1049
21.7M
    for (Py_ssize_t i = 0; i < nargs; i++) {
1050
9.48M
        stack[i] = args[i];
1051
9.48M
    }
1052
1053
12.2M
    PyObject **kwstack = stack + nargs;
1054
    /* This loop doesn't support lookup function mutating the dictionary
1055
       to change its size. It's a deliberate choice for speed, this function is
1056
       called in the performance critical hot code. */
1057
12.2M
    Py_ssize_t pos = 0, i = 0;
1058
12.2M
    PyObject *key, *value;
1059
12.2M
    unsigned long keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS;
1060
27.7M
    while (PyDict_Next(kwargs, &pos, &key, &value)) {
1061
15.4M
        keys_are_strings &= Py_TYPE(key)->tp_flags;
1062
15.4M
        PyTuple_SET_ITEM(kwnames, i, Py_NewRef(key));
1063
15.4M
        kwstack[i] = Py_NewRef(value);
1064
15.4M
        i++;
1065
15.4M
    }
1066
1067
    /* keys_are_strings has the value Py_TPFLAGS_UNICODE_SUBCLASS if that
1068
     * flag is set for all keys. Otherwise, keys_are_strings equals 0.
1069
     * We do this check once at the end instead of inside the loop above
1070
     * because it simplifies the deallocation in the failing case.
1071
     * It happens to also make the loop above slightly more efficient. */
1072
12.2M
    if (!keys_are_strings) {
1073
0
        _PyErr_SetString(tstate, PyExc_TypeError,
1074
0
                         "keywords must be strings");
1075
0
        _PyStack_UnpackDict_Free(stack, nargs, kwnames);
1076
0
        return NULL;
1077
0
    }
1078
1079
12.2M
    *p_kwnames = kwnames;
1080
12.2M
    return stack;
1081
12.2M
}
1082
1083
void
1084
_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs,
1085
                         PyObject *kwnames)
1086
12.1M
{
1087
    /* Only decref kwargs values, positional args are borrowed */
1088
12.1M
    Py_ssize_t nkwargs = PyTuple_GET_SIZE(kwnames);
1089
27.4M
    for (Py_ssize_t i = 0; i < nkwargs; i++) {
1090
15.2M
        Py_DECREF(stack[nargs + i]);
1091
15.2M
    }
1092
12.1M
    _PyStack_UnpackDict_FreeNoDecRef(stack, kwnames);
1093
12.1M
}
1094
1095
void
1096
_PyStack_UnpackDict_FreeNoDecRef(PyObject *const *stack, PyObject *kwnames)
1097
12.2M
{
1098
12.2M
    PyMem_Free((PyObject **)stack - 1);
1099
12.2M
    Py_DECREF(kwnames);
1100
12.2M
}
1101
1102
// Export for the stable ABI
1103
#undef PyVectorcall_NARGS
1104
Py_ssize_t
1105
PyVectorcall_NARGS(size_t n)
1106
0
{
1107
0
    return _PyVectorcall_NARGS(n);
1108
0
}