Coverage Report

Created: 2026-03-08 06:40

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
880M
{
28
880M
    assert((callable != NULL) ^ (where != NULL));
29
30
880M
    if (result == NULL) {
31
22.0M
        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
22.0M
    }
48
858M
    else {
49
858M
        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
858M
    }
70
880M
    return result;
71
880M
}
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
390
{
104
390
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func);
105
390
    PyThreadState *tstate = _PyThreadState_GET();
106
390
    return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL);
107
390
}
108
109
110
PyObject *
111
_PyObject_VectorcallDictTstate(PyThreadState *tstate, PyObject *callable,
112
                               PyObject *const *args, size_t nargsf,
113
                               PyObject *kwargs)
114
57.4M
{
115
57.4M
    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
57.4M
    assert(!_PyErr_Occurred(tstate));
121
122
57.4M
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
123
57.4M
    assert(nargs >= 0);
124
57.4M
    assert(nargs == 0 || args != NULL);
125
57.4M
    assert(kwargs == NULL || PyDict_Check(kwargs));
126
127
57.4M
    vectorcallfunc func = PyVectorcall_Function(callable);
128
57.4M
    if (func == NULL) {
129
        /* Use tp_call instead */
130
5.46k
        return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwargs);
131
5.46k
    }
132
133
57.4M
    PyObject *res;
134
57.4M
    if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
135
46.4M
        res = func(callable, args, nargsf, NULL);
136
46.4M
    }
137
11.0M
    else {
138
11.0M
        PyObject *kwnames;
139
11.0M
        PyObject *const *newargs;
140
11.0M
        newargs = _PyStack_UnpackDict(tstate,
141
11.0M
                                      args, nargs,
142
11.0M
                                      kwargs, &kwnames);
143
11.0M
        if (newargs == NULL) {
144
0
            return NULL;
145
0
        }
146
11.0M
        res = func(callable, newargs,
147
11.0M
                   nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
148
11.0M
        _PyStack_UnpackDict_Free(newargs, nargs, kwnames);
149
11.0M
    }
150
57.4M
    return _Py_CheckFunctionResult(tstate, callable, res, NULL);
151
57.4M
}
152
153
154
PyObject *
155
PyObject_VectorcallDict(PyObject *callable, PyObject *const *args,
156
                       size_t nargsf, PyObject *kwargs)
157
263k
{
158
263k
    PyThreadState *tstate = _PyThreadState_GET();
159
263k
    return _PyObject_VectorcallDictTstate(tstate, callable, args, nargsf, kwargs);
160
263k
}
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
162M
{
204
162M
    assert(nargs >= 0);
205
162M
    assert(nargs == 0 || args != NULL);
206
162M
    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
162M
    ternaryfunc call = Py_TYPE(callable)->tp_call;
211
162M
    if (call == NULL) {
212
0
        object_is_not_callable(tstate, callable);
213
0
        return NULL;
214
0
    }
215
216
162M
    PyObject *argstuple = PyTuple_FromArray(args, nargs);
217
162M
    if (argstuple == NULL) {
218
0
        return NULL;
219
0
    }
220
221
162M
    PyObject *kwdict;
222
162M
    if (keywords == NULL || PyDict_Check(keywords)) {
223
150M
        kwdict = keywords;
224
150M
    }
225
11.3M
    else {
226
11.3M
        if (PyTuple_GET_SIZE(keywords)) {
227
11.3M
            assert(args != NULL);
228
11.3M
            kwdict = _PyStack_AsDict(args + nargs, keywords);
229
11.3M
            if (kwdict == NULL) {
230
0
                Py_DECREF(argstuple);
231
0
                return NULL;
232
0
            }
233
11.3M
        }
234
0
        else {
235
0
            keywords = kwdict = NULL;
236
0
        }
237
11.3M
    }
238
239
162M
    PyObject *result = NULL;
240
162M
    if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object") == 0)
241
162M
    {
242
162M
        result = _PyCFunctionWithKeywords_TrampolineCall(
243
162M
            (PyCFunctionWithKeywords)call, callable, argstuple, kwdict);
244
162M
        _Py_LeaveRecursiveCallTstate(tstate);
245
162M
    }
246
247
162M
    Py_DECREF(argstuple);
248
162M
    if (kwdict != keywords) {
249
11.3M
        Py_DECREF(kwdict);
250
11.3M
    }
251
252
162M
    return _Py_CheckFunctionResult(tstate, callable, result, NULL);
253
162M
}
254
255
256
vectorcallfunc
257
PyVectorcall_Function(PyObject *callable)
258
103M
{
259
103M
    return _PyVectorcall_FunctionInline(callable);
260
103M
}
261
262
263
static PyObject *
264
_PyVectorcall_Call(PyThreadState *tstate, vectorcallfunc func,
265
                   PyObject *callable, PyObject *tuple, PyObject *kwargs)
266
34.7M
{
267
34.7M
    assert(func != NULL);
268
269
34.7M
    Py_ssize_t nargs = PyTuple_GET_SIZE(tuple);
270
271
    /* Fast path for no keywords */
272
34.7M
    if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
273
31.6M
        return func(callable, _PyTuple_ITEMS(tuple), nargs, NULL);
274
31.6M
    }
275
276
    /* Convert arguments & call */
277
3.12M
    PyObject *const *args;
278
3.12M
    PyObject *kwnames;
279
3.12M
    args = _PyStack_UnpackDict(tstate,
280
3.12M
                               _PyTuple_ITEMS(tuple), nargs,
281
3.12M
                               kwargs, &kwnames);
282
3.12M
    if (args == NULL) {
283
0
        return NULL;
284
0
    }
285
3.12M
    PyObject *result = func(callable, args,
286
3.12M
                            nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
287
3.12M
    _PyStack_UnpackDict_Free(args, nargs, kwnames);
288
289
3.12M
    return _Py_CheckFunctionResult(tstate, callable, result, NULL);
290
3.12M
}
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
317M
{
326
317M
    PyThreadState *tstate = _PyThreadState_GET();
327
317M
    return _PyObject_VectorcallTstate(tstate, callable,
328
317M
                                      args, nargsf, kwnames);
329
317M
}
330
331
332
PyObject *
333
_PyObject_Call(PyThreadState *tstate, PyObject *callable,
334
               PyObject *args, PyObject *kwargs)
335
45.8M
{
336
45.8M
    ternaryfunc call;
337
45.8M
    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
45.8M
    assert(!_PyErr_Occurred(tstate));
343
45.8M
    assert(PyTuple_Check(args));
344
45.8M
    assert(kwargs == NULL || PyDict_Check(kwargs));
345
45.8M
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable);
346
45.8M
    vectorcallfunc vector_func = PyVectorcall_Function(callable);
347
45.8M
    if (vector_func != NULL) {
348
34.7M
        return _PyVectorcall_Call(tstate, vector_func, callable, args, kwargs);
349
34.7M
    }
350
11.0M
    else {
351
11.0M
        call = Py_TYPE(callable)->tp_call;
352
11.0M
        if (call == NULL) {
353
0
            object_is_not_callable(tstate, callable);
354
0
            return NULL;
355
0
        }
356
357
11.0M
        if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) {
358
0
            return NULL;
359
0
        }
360
361
11.0M
        result = (*call)(callable, args, kwargs);
362
363
11.0M
        _Py_LeaveRecursiveCallTstate(tstate);
364
365
11.0M
        return _Py_CheckFunctionResult(tstate, callable, result, NULL);
366
11.0M
    }
367
45.8M
}
368
369
PyObject *
370
PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
371
45.7M
{
372
45.7M
    PyThreadState *tstate = _PyThreadState_GET();
373
45.7M
    return _PyObject_Call(tstate, callable, args, kwargs);
374
45.7M
}
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
75.9M
{
388
75.9M
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func);
389
75.9M
    assert(arg != NULL);
390
75.9M
    PyObject *_args[2];
391
75.9M
    PyObject **args = _args + 1;  // For PY_VECTORCALL_ARGUMENTS_OFFSET
392
75.9M
    args[0] = arg;
393
75.9M
    PyThreadState *tstate = _PyThreadState_GET();
394
75.9M
    size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;
395
75.9M
    return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL);
396
75.9M
}
397
398
399
/* --- PyFunction call functions ---------------------------------- */
400
401
PyObject *
402
_PyFunction_Vectorcall(PyObject *func, PyObject* const* stack,
403
                       size_t nargsf, PyObject *kwnames)
404
220M
{
405
220M
    assert(PyFunction_Check(func));
406
220M
    PyFunctionObject *f = (PyFunctionObject *)func;
407
220M
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
408
220M
    assert(nargs >= 0);
409
220M
    PyThreadState *tstate = _PyThreadState_GET();
410
220M
    assert(nargs == 0 || stack != NULL);
411
220M
    EVAL_CALL_STAT_INC(EVAL_CALL_FUNCTION_VECTORCALL);
412
220M
    if (((PyCodeObject *)f->func_code)->co_flags & CO_OPTIMIZED) {
413
220M
        return _PyEval_Vector(tstate, f, NULL, stack, nargs, kwnames);
414
220M
    }
415
0
    else {
416
0
        return _PyEval_Vector(tstate, f, f->func_globals, stack, nargs, kwnames);
417
0
    }
418
220M
}
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
127k
{
462
127k
    PyThreadState *tstate = _PyThreadState_GET();
463
127k
    assert(!_PyErr_Occurred(tstate));
464
127k
    if (args == NULL) {
465
0
        return _PyObject_CallNoArgsTstate(tstate, callable);
466
0
    }
467
127k
    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
127k
    return _PyObject_Call(tstate, callable, args, NULL);
473
127k
}
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
57.1M
{
481
57.1M
    assert(PyTuple_Check(args));
482
483
57.1M
    PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
484
57.1M
    PyObject **stack;
485
486
57.1M
    Py_ssize_t argcount = PyTuple_GET_SIZE(args);
487
57.1M
    if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
488
56.9M
        stack = small_stack;
489
56.9M
    }
490
232k
    else {
491
232k
        stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
492
232k
        if (stack == NULL) {
493
0
            PyErr_NoMemory();
494
0
            return NULL;
495
0
        }
496
232k
    }
497
498
    /* use borrowed references */
499
57.1M
    stack[0] = obj;
500
57.1M
    memcpy(&stack[1],
501
57.1M
           _PyTuple_ITEMS(args),
502
57.1M
           argcount * sizeof(PyObject *));
503
504
57.1M
    PyObject *result = _PyObject_VectorcallDictTstate(tstate, callable,
505
57.1M
                                                      stack, argcount + 1,
506
57.1M
                                                      kwargs);
507
57.1M
    if (stack != small_stack) {
508
232k
        PyMem_Free(stack);
509
232k
    }
510
57.1M
    return result;
511
57.1M
}
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
765k
{
520
765k
    PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
521
765k
    const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
522
765k
    PyObject **stack;
523
765k
    Py_ssize_t nargs, i;
524
765k
    PyObject *result;
525
526
765k
    if (callable == NULL) {
527
0
        return null_error(tstate);
528
0
    }
529
530
765k
    if (!format || !*format) {
531
1.92k
        return _PyObject_CallNoArgsTstate(tstate, callable);
532
1.92k
    }
533
534
763k
    stack = _Py_VaBuildStack(small_stack, small_stack_len,
535
763k
                             format, va, &nargs);
536
763k
    if (stack == NULL) {
537
0
        return NULL;
538
0
    }
539
763k
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable);
540
763k
    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
20.7k
        PyObject *args = stack[0];
546
20.7k
        result = _PyObject_VectorcallTstate(tstate, callable,
547
20.7k
                                            _PyTuple_ITEMS(args),
548
20.7k
                                            PyTuple_GET_SIZE(args),
549
20.7k
                                            NULL);
550
20.7k
    }
551
742k
    else {
552
742k
        result = _PyObject_VectorcallTstate(tstate, callable,
553
742k
                                            stack, nargs, NULL);
554
742k
    }
555
556
4.02M
    for (i = 0; i < nargs; ++i) {
557
3.26M
        Py_DECREF(stack[i]);
558
3.26M
    }
559
763k
    if (stack != small_stack) {
560
204
        PyMem_Free(stack);
561
204
    }
562
763k
    return result;
563
763k
}
564
565
566
PyObject *
567
PyObject_CallFunction(PyObject *callable, const char *format, ...)
568
763k
{
569
763k
    va_list va;
570
763k
    PyObject *result;
571
763k
    PyThreadState *tstate = _PyThreadState_GET();
572
573
763k
    va_start(va, format);
574
763k
    result = _PyObject_CallFunctionVa(tstate, callable, format, va);
575
763k
    va_end(va);
576
577
763k
    return result;
578
763k
}
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
2.40k
{
618
2.40k
    assert(callable != NULL);
619
2.40k
    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
2.40k
    return _PyObject_CallFunctionVa(tstate, callable, format, va);
627
2.40k
}
628
629
PyObject *
630
PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
631
1.96k
{
632
1.96k
    PyThreadState *tstate = _PyThreadState_GET();
633
634
1.96k
    if (obj == NULL || name == NULL) {
635
0
        return null_error(tstate);
636
0
    }
637
638
1.96k
    PyObject *callable = PyObject_GetAttrString(obj, name);
639
1.96k
    if (callable == NULL) {
640
0
        return NULL;
641
0
    }
642
643
1.96k
    va_list va;
644
1.96k
    va_start(va, format);
645
1.96k
    PyObject *retval = callmethod(tstate, callable, format, va);
646
1.96k
    va_end(va);
647
648
1.96k
    Py_DECREF(callable);
649
1.96k
    return retval;
650
1.96k
}
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
436
{
682
436
    PyThreadState *tstate = _PyThreadState_GET();
683
436
    if (obj == NULL || name == NULL) {
684
0
        return null_error(tstate);
685
0
    }
686
687
436
    PyObject *callable = PyObject_GetAttr(obj, name);
688
436
    if (callable == NULL) {
689
0
        return NULL;
690
0
    }
691
692
436
    va_list va;
693
436
    va_start(va, format);
694
436
    PyObject *retval = callmethod(tstate, callable, format, va);
695
436
    va_end(va);
696
697
436
    Py_DECREF(callable);
698
436
    return retval;
699
436
}
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
290k
{
773
290k
    PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
774
290k
    PyObject **stack;
775
290k
    Py_ssize_t nargs;
776
290k
    PyObject *result;
777
290k
    Py_ssize_t i;
778
290k
    va_list countva;
779
780
290k
    if (callable == NULL) {
781
0
        return null_error(tstate);
782
0
    }
783
784
    /* Count the number of arguments */
785
290k
    va_copy(countva, vargs);
786
290k
    nargs = base ? 1 : 0;
787
1.66M
    while (1) {
788
1.66M
        PyObject *arg = va_arg(countva, PyObject *);
789
1.66M
        if (arg == NULL) {
790
290k
            break;
791
290k
        }
792
1.37M
        nargs++;
793
1.37M
    }
794
290k
    va_end(countva);
795
796
    /* Copy arguments */
797
290k
    if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
798
84.3k
        stack = small_stack;
799
84.3k
    }
800
205k
    else {
801
205k
        stack = PyMem_Malloc(nargs * sizeof(stack[0]));
802
205k
        if (stack == NULL) {
803
0
            PyErr_NoMemory();
804
0
            return NULL;
805
0
        }
806
205k
    }
807
808
290k
    i = 0;
809
290k
    if (base) {
810
38.1k
        stack[i++] = base;
811
38.1k
    }
812
813
1.66M
    for (; i < nargs; ++i) {
814
1.37M
        stack[i] = va_arg(vargs, PyObject *);
815
1.37M
    }
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
290k
    result = _PyObject_VectorcallTstate(tstate, callable, stack, nargs, NULL);
824
825
290k
    if (stack != small_stack) {
826
205k
        PyMem_Free(stack);
827
205k
    }
828
290k
    return result;
829
290k
}
830
831
832
PyObject *
833
PyObject_VectorcallMethod(PyObject *name, PyObject *const *args,
834
                           size_t nargsf, PyObject *kwnames)
835
1.37M
{
836
1.37M
    assert(name != NULL);
837
1.37M
    assert(args != NULL);
838
1.37M
    assert(PyVectorcall_NARGS(nargsf) >= 1);
839
840
1.37M
    PyThreadState *tstate = _PyThreadState_GET();
841
1.37M
    _PyCStackRef method;
842
1.37M
    _PyThreadState_PushCStackRef(tstate, &method);
843
    /* Use args[0] as "self" argument */
844
1.37M
    int unbound = _PyObject_GetMethodStackRef(tstate, args[0], name, &method.ref);
845
1.37M
    if (PyStackRef_IsNull(method.ref)) {
846
5
        _PyThreadState_PopCStackRef(tstate, &method);
847
5
        return NULL;
848
5
    }
849
1.37M
    PyObject *callable = PyStackRef_AsPyObjectBorrow(method.ref);
850
851
1.37M
    if (unbound) {
852
        /* We must remove PY_VECTORCALL_ARGUMENTS_OFFSET since
853
         * that would be interpreted as allowing to change args[-1] */
854
1.25M
        nargsf &= ~PY_VECTORCALL_ARGUMENTS_OFFSET;
855
1.25M
    }
856
113k
    else {
857
        /* Skip "self". We can keep PY_VECTORCALL_ARGUMENTS_OFFSET since
858
         * args[-1] in the onward call is args[0] here. */
859
113k
        args++;
860
113k
        nargsf--;
861
113k
    }
862
1.37M
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_METHOD, callable);
863
1.37M
    PyObject *result = _PyObject_VectorcallTstate(tstate, callable,
864
1.37M
                                                  args, nargsf, kwnames);
865
1.37M
    _PyThreadState_PopCStackRef(tstate, &method);
866
1.37M
    return result;
867
1.37M
}
868
869
870
PyObject *
871
PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
872
63.8k
{
873
63.8k
    PyThreadState *tstate = _PyThreadState_GET();
874
63.8k
    if (obj == NULL || name == NULL) {
875
0
        return null_error(tstate);
876
0
    }
877
878
63.8k
    _PyCStackRef method;
879
63.8k
    _PyThreadState_PushCStackRef(tstate, &method);
880
63.8k
    int is_method = _PyObject_GetMethodStackRef(tstate, obj, name, &method.ref);
881
63.8k
    if (PyStackRef_IsNull(method.ref)) {
882
0
        _PyThreadState_PopCStackRef(tstate, &method);
883
0
        return NULL;
884
0
    }
885
63.8k
    PyObject *callable = PyStackRef_AsPyObjectBorrow(method.ref);
886
63.8k
    obj = is_method ? obj : NULL;
887
888
63.8k
    va_list vargs;
889
63.8k
    va_start(vargs, name);
890
63.8k
    PyObject *result = object_vacall(tstate, obj, callable, vargs);
891
63.8k
    va_end(vargs);
892
893
63.8k
    _PyThreadState_PopCStackRef(tstate, &method);
894
63.8k
    return result;
895
63.8k
}
896
897
898
PyObject *
899
PyObject_CallFunctionObjArgs(PyObject *callable, ...)
900
226k
{
901
226k
    PyThreadState *tstate = _PyThreadState_GET();
902
226k
    va_list vargs;
903
226k
    PyObject *result;
904
905
226k
    va_start(vargs, callable);
906
226k
    result = object_vacall(tstate, NULL, callable, vargs);
907
226k
    va_end(vargs);
908
909
226k
    return result;
910
226k
}
911
912
913
/* --- PyStack functions ------------------------------------------ */
914
915
PyObject *
916
_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
917
11.3M
{
918
11.3M
    Py_ssize_t nkwargs;
919
920
11.3M
    assert(kwnames != NULL);
921
11.3M
    nkwargs = PyTuple_GET_SIZE(kwnames);
922
11.3M
    return _PyDict_FromItems(&PyTuple_GET_ITEM(kwnames, 0), 1,
923
11.3M
                             values, 1, nkwargs);
924
11.3M
}
925
926
927
/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple).
928
929
   Allocate a new argument vector and keyword names tuple. Return the argument
930
   vector; return NULL with exception set on error. Return the keyword names
931
   tuple in *p_kwnames.
932
933
   This also checks that all keyword names are strings. If not, a TypeError is
934
   raised.
935
936
   The newly allocated argument vector supports PY_VECTORCALL_ARGUMENTS_OFFSET.
937
938
   The positional arguments are borrowed references from the input array
939
   (which must be kept alive by the caller). The keyword argument values
940
   are new references.
941
942
   When done, you must call _PyStack_UnpackDict_Free(stack, nargs, kwnames) */
943
PyObject *const *
944
_PyStack_UnpackDict(PyThreadState *tstate,
945
                    PyObject *const *args, Py_ssize_t nargs,
946
                    PyObject *kwargs, PyObject **p_kwnames)
947
14.2M
{
948
14.2M
    assert(nargs >= 0);
949
14.2M
    assert(kwargs != NULL);
950
14.2M
    assert(PyDict_Check(kwargs));
951
952
14.2M
    Py_ssize_t nkwargs = PyDict_GET_SIZE(kwargs);
953
    /* Check for overflow in the PyMem_Malloc() call below. The subtraction
954
     * in this check cannot overflow: both maxnargs and nkwargs are
955
     * non-negative signed integers, so their difference fits in the type. */
956
14.2M
    Py_ssize_t maxnargs = PY_SSIZE_T_MAX / sizeof(args[0]) - 1;
957
14.2M
    if (nargs > maxnargs - nkwargs) {
958
0
        _PyErr_NoMemory(tstate);
959
0
        return NULL;
960
0
    }
961
962
    /* Add 1 to support PY_VECTORCALL_ARGUMENTS_OFFSET */
963
14.2M
    PyObject **stack = PyMem_Malloc((1 + nargs + nkwargs) * sizeof(args[0]));
964
14.2M
    if (stack == NULL) {
965
0
        _PyErr_NoMemory(tstate);
966
0
        return NULL;
967
0
    }
968
969
14.2M
    PyObject *kwnames = PyTuple_New(nkwargs);
970
14.2M
    if (kwnames == NULL) {
971
0
        PyMem_Free(stack);
972
0
        return NULL;
973
0
    }
974
975
14.2M
    stack++;  /* For PY_VECTORCALL_ARGUMENTS_OFFSET */
976
977
    /* Copy positional arguments (borrowed references) */
978
26.7M
    for (Py_ssize_t i = 0; i < nargs; i++) {
979
12.4M
        stack[i] = args[i];
980
12.4M
    }
981
982
14.2M
    PyObject **kwstack = stack + nargs;
983
    /* This loop doesn't support lookup function mutating the dictionary
984
       to change its size. It's a deliberate choice for speed, this function is
985
       called in the performance critical hot code. */
986
14.2M
    Py_ssize_t pos = 0, i = 0;
987
14.2M
    PyObject *key, *value;
988
14.2M
    unsigned long keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS;
989
32.0M
    while (PyDict_Next(kwargs, &pos, &key, &value)) {
990
17.7M
        keys_are_strings &= Py_TYPE(key)->tp_flags;
991
17.7M
        PyTuple_SET_ITEM(kwnames, i, Py_NewRef(key));
992
17.7M
        kwstack[i] = Py_NewRef(value);
993
17.7M
        i++;
994
17.7M
    }
995
996
    /* keys_are_strings has the value Py_TPFLAGS_UNICODE_SUBCLASS if that
997
     * flag is set for all keys. Otherwise, keys_are_strings equals 0.
998
     * We do this check once at the end instead of inside the loop above
999
     * because it simplifies the deallocation in the failing case.
1000
     * It happens to also make the loop above slightly more efficient. */
1001
14.2M
    if (!keys_are_strings) {
1002
0
        _PyErr_SetString(tstate, PyExc_TypeError,
1003
0
                         "keywords must be strings");
1004
0
        _PyStack_UnpackDict_Free(stack, nargs, kwnames);
1005
0
        return NULL;
1006
0
    }
1007
1008
14.2M
    *p_kwnames = kwnames;
1009
14.2M
    return stack;
1010
14.2M
}
1011
1012
void
1013
_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs,
1014
                         PyObject *kwnames)
1015
14.1M
{
1016
    /* Only decref kwargs values, positional args are borrowed */
1017
14.1M
    Py_ssize_t nkwargs = PyTuple_GET_SIZE(kwnames);
1018
31.7M
    for (Py_ssize_t i = 0; i < nkwargs; i++) {
1019
17.5M
        Py_DECREF(stack[nargs + i]);
1020
17.5M
    }
1021
14.1M
    _PyStack_UnpackDict_FreeNoDecRef(stack, kwnames);
1022
14.1M
}
1023
1024
void
1025
_PyStack_UnpackDict_FreeNoDecRef(PyObject *const *stack, PyObject *kwnames)
1026
14.2M
{
1027
14.2M
    PyMem_Free((PyObject **)stack - 1);
1028
14.2M
    Py_DECREF(kwnames);
1029
14.2M
}
1030
1031
// Export for the stable ABI
1032
#undef PyVectorcall_NARGS
1033
Py_ssize_t
1034
PyVectorcall_NARGS(size_t n)
1035
0
{
1036
0
    return _PyVectorcall_NARGS(n);
1037
0
}