Backed out changeset 0e4f26083bbb (PyObject_CallMethodObjArgs)

This commit is contained in:
Victor Stinner 2016-08-24 00:59:40 +02:00
parent f0cba67d0b
commit d48af09043

View file

@ -2499,52 +2499,32 @@ _PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name,
return retval;
}
static PyObject **
objargs_mkstack(PyObject **small_stack, Py_ssize_t small_stack_size,
va_list va, Py_ssize_t *p_nargs)
static PyObject *
objargs_mktuple(va_list va)
{
Py_ssize_t i, n;
int i, n = 0;
va_list countva;
PyObject **stack;
PyObject *result, *tmp;
/* Count the number of arguments */
Py_VA_COPY(countva, va);
Py_VA_COPY(countva, va);
n = 0;
while (1) {
PyObject *arg = (PyObject *)va_arg(countva, PyObject *);
if (arg == NULL) {
break;
}
n++;
}
*p_nargs = n;
/* Copy arguments */
if (small_stack_size <= n) {
stack = small_stack;
}
else {
stack = PyMem_Malloc(n * sizeof(PyObject**));
if (stack == NULL) {
PyErr_NoMemory();
return NULL;
while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
++n;
result = PyTuple_New(n);
if (result != NULL && n > 0) {
for (i = 0; i < n; ++i) {
tmp = (PyObject *)va_arg(va, PyObject *);
PyTuple_SET_ITEM(result, i, tmp);
Py_INCREF(tmp);
}
}
for (i = 0; i < n; ++i) {
stack[i] = va_arg(va, PyObject *);
}
return stack;
return result;
}
PyObject *
PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
{
PyObject *small_stack[5];
PyObject **stack;
Py_ssize_t nargs;
PyObject *result;
PyObject *args, *tmp;
va_list vargs;
if (callable == NULL || name == NULL) {
@ -2557,31 +2537,24 @@ PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
/* count the args */
va_start(vargs, name);
stack = objargs_mkstack(small_stack, Py_ARRAY_LENGTH(small_stack),
vargs, &nargs);
args = objargs_mktuple(vargs);
va_end(vargs);
if (stack == NULL) {
if (args == NULL) {
Py_DECREF(callable);
return NULL;
}
result = _PyObject_FastCall(callable, stack, nargs);
tmp = PyObject_Call(callable, args, NULL);
Py_DECREF(args);
Py_DECREF(callable);
if (stack != small_stack) {
PyMem_Free(stack);
}
return result;
return tmp;
}
PyObject *
_PyObject_CallMethodIdObjArgs(PyObject *callable,
struct _Py_Identifier *name, ...)
{
PyObject *small_stack[5];
PyObject **stack;
Py_ssize_t nargs;
PyObject *result;
PyObject *args, *tmp;
va_list vargs;
if (callable == NULL || name == NULL) {
@ -2594,30 +2567,23 @@ _PyObject_CallMethodIdObjArgs(PyObject *callable,
/* count the args */
va_start(vargs, name);
stack = objargs_mkstack(small_stack, Py_ARRAY_LENGTH(small_stack),
vargs, &nargs);
args = objargs_mktuple(vargs);
va_end(vargs);
if (stack == NULL) {
if (args == NULL) {
Py_DECREF(callable);
return NULL;
}
result = _PyObject_FastCall(callable, stack, nargs);
tmp = PyObject_Call(callable, args, NULL);
Py_DECREF(args);
Py_DECREF(callable);
if (stack != small_stack) {
PyMem_Free(stack);
}
return result;
return tmp;
}
PyObject *
PyObject_CallFunctionObjArgs(PyObject *callable, ...)
{
PyObject *small_stack[5];
PyObject **stack;
Py_ssize_t nargs;
PyObject *result;
PyObject *args, *tmp;
va_list vargs;
if (callable == NULL) {
@ -2626,19 +2592,14 @@ PyObject_CallFunctionObjArgs(PyObject *callable, ...)
/* count the args */
va_start(vargs, callable);
stack = objargs_mkstack(small_stack, Py_ARRAY_LENGTH(small_stack),
vargs, &nargs);
args = objargs_mktuple(vargs);
va_end(vargs);
if (stack == NULL) {
if (args == NULL)
return NULL;
}
tmp = PyObject_Call(callable, args, NULL);
Py_DECREF(args);
result = _PyObject_FastCall(callable, stack, nargs);
if (stack != small_stack) {
PyMem_Free(stack);
}
return result;
return tmp;
}