Coverage Report

Created: 2025-12-07 07:03

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