cpython: 401f59a7020b (original) (raw)
--- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2499,32 +2499,52 @@ PyObject * return retval; } -static PyObject * -objargs_mktuple(va_list va) +static PyObject ** +objargs_mkstack(PyObject **small_stack, Py_ssize_t small_stack_size,
va_list va, Py_ssize_t *p_nargs)[](#l1.11)
Py_VA_COPY(countva, va);[](#l1.18)
- while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
++n;[](#l1.21)
- result = PyTuple_New(n);
- if (result != NULL && n > 0) {
for (i = 0; i < n; ++i) {[](#l1.24)
tmp = (PyObject *)va_arg(va, PyObject *);[](#l1.25)
PyTuple_SET_ITEM(result, i, tmp);[](#l1.26)
Py_INCREF(tmp);[](#l1.27)
- n = 0;
- while (1) {
PyObject *arg = (PyObject *)va_arg(countva, PyObject *);[](#l1.35)
if (arg == NULL) {[](#l1.36)
break;[](#l1.37)
}[](#l1.38)
n++;[](#l1.39)
- }
- *p_nargs = n;
- /* Copy arguments */
- if (n <= small_stack_size) {
stack = small_stack;[](#l1.45)
- }
- else {
stack = PyMem_Malloc(n * sizeof(stack[0]));[](#l1.48)
if (stack == NULL) {[](#l1.49)
PyErr_NoMemory();[](#l1.50)
}return NULL;[](#l1.51) }[](#l1.52)
} PyObject * PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...) {
- PyObject *small_stack[5];
- PyObject **stack;
- Py_ssize_t nargs;
- PyObject *result; va_list vargs; if (callable == NULL || name == NULL) { @@ -2537,24 +2557,31 @@ PyObject_CallMethodObjArgs(PyObject cal / count the args */ va_start(vargs, name);
- stack = objargs_mkstack(small_stack, Py_ARRAY_LENGTH(small_stack),
va_end(vargs);vargs, &nargs);[](#l1.79)
} PyObject * _PyObject_CallMethodIdObjArgs(PyObject *callable, struct _Py_Identifier *name, ...) {
- PyObject *small_stack[5];
- PyObject **stack;
- Py_ssize_t nargs;
- PyObject *result; va_list vargs; if (callable == NULL || name == NULL) { @@ -2567,23 +2594,30 @@ PyObject / count the args */ va_start(vargs, name);
- stack = objargs_mkstack(small_stack, Py_ARRAY_LENGTH(small_stack),
va_end(vargs);vargs, &nargs);[](#l1.118)
} PyObject * PyObject_CallFunctionObjArgs(PyObject *callable, ...) {
- PyObject *small_stack[5];
- PyObject **stack;
- Py_ssize_t nargs;
- PyObject *result; va_list vargs; if (callable == NULL) { @@ -2592,14 +2626,19 @@ PyObject_CallFunctionObjArgs(PyObject c / count the args */ va_start(vargs, callable);
- stack = objargs_mkstack(small_stack, Py_ARRAY_LENGTH(small_stack),
va_end(vargs);vargs, &nargs);[](#l1.156)