diff -r 135e1a8144ec Include/abstract.h --- a/Include/abstract.h Mon Jan 09 11:21:37 2017 +0100 +++ b/Include/abstract.h Tue Jan 10 12:51:00 2017 +0100 @@ -187,17 +187,6 @@ PyAPI_FUNC(PyObject **) _PyStack_UnpackD PyObject **kwnames, PyObject *func); -/* Suggested size (number of positional arguments) for arrays of PyObject* - allocated on a C stack to avoid allocating memory on the heap memory. Such - array is used to pass positional arguments to call functions of the - _PyObject_FastCall() family. - - The size is chosen to not abuse the C stack and so limit the risk of stack - overflow. The size is also chosen to allow using the small stack for most - function calls of the Python standard library. On 64-bit CPU, it allocates - 40 bytes on the stack. */ -#define _PY_FASTCALL_SMALL_STACK 5 - /* Call the callable object 'callable' with the "fast call" calling convention: args is a C array for positional arguments (nargs is the number of positional arguments), kwargs is a dictionary for keyword arguments. diff -r 135e1a8144ec Objects/abstract.c --- a/Objects/abstract.c Mon Jan 09 11:21:37 2017 +0100 +++ b/Objects/abstract.c Tue Jan 10 12:51:00 2017 +0100 @@ -2337,7 +2337,6 @@ PyObject * _PyObject_Call_Prepend(PyObject *callable, PyObject *obj, PyObject *args, PyObject *kwargs) { - PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; PyObject **stack; Py_ssize_t argcount; PyObject *result; @@ -2345,29 +2344,22 @@ PyObject * assert(PyTuple_Check(args)); argcount = PyTuple_GET_SIZE(args); - if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { - stack = small_stack; - } - else { - stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *)); - if (stack == NULL) { - PyErr_NoMemory(); - return NULL; - } + stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *)); + if (stack == NULL) { + PyErr_NoMemory(); + return NULL; } /* use borrowed references */ stack[0] = obj; memcpy(&stack[1], - &PyTuple_GET_ITEM(args, 0), - argcount * sizeof(PyObject *)); + &PyTuple_GET_ITEM(args, 0), + argcount * sizeof(PyObject *)); result = _PyObject_FastCallDict(callable, stack, argcount + 1, kwargs); - if (stack != small_stack) { - PyMem_Free(stack); - } + PyMem_Free(stack); return result; } @@ -2522,8 +2514,6 @@ static PyObject * _PyObject_CallFunctionVa(PyObject *callable, const char *format, va_list va, int is_size_t) { - PyObject* small_stack[_PY_FASTCALL_SMALL_STACK]; - const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack); PyObject **stack; Py_ssize_t nargs, i; PyObject *result; @@ -2537,10 +2527,10 @@ static PyObject * } if (is_size_t) { - stack = _Py_VaBuildStack(small_stack, small_stack_len, format, va, &nargs); + stack = _Py_VaBuildStack(NULL, 0, format, va, &nargs); } else { - stack = _Py_VaBuildStack_SizeT(small_stack, small_stack_len, format, va, &nargs); + stack = _Py_VaBuildStack_SizeT(NULL, 0, format, va, &nargs); } if (stack == NULL) { return NULL; @@ -2563,9 +2553,6 @@ static PyObject * for (i = 0; i < nargs; ++i) { Py_DECREF(stack[i]); } - if (stack != small_stack) { - PyMem_Free(stack); - } return result; } @@ -2703,7 +2690,6 @@ PyObject * PyObject * _PyObject_VaCallFunctionObjArgs(PyObject *callable, va_list vargs) { - PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; PyObject **stack; Py_ssize_t nargs; PyObject *result; @@ -2727,15 +2713,10 @@ PyObject * va_end(countva); /* Copy arguments */ - if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { - stack = small_stack; - } - else { - stack = PyMem_Malloc(nargs * sizeof(stack[0])); - if (stack == NULL) { - PyErr_NoMemory(); - return NULL; - } + stack = PyMem_Malloc(nargs * sizeof(stack[0])); + if (stack == NULL) { + PyErr_NoMemory(); + return NULL; } for (i = 0; i < nargs; ++i) { @@ -2744,10 +2725,7 @@ PyObject * /* Call the function */ result = _PyObject_FastCall(callable, stack, nargs); - - if (stack != small_stack) { - PyMem_Free(stack); - } + PyMem_Free(stack); return result; } diff -r 135e1a8144ec Python/bltinmodule.c --- a/Python/bltinmodule.c Mon Jan 09 11:21:37 2017 +0100 +++ b/Python/bltinmodule.c Tue Jan 10 12:51:00 2017 +0100 @@ -1186,21 +1186,15 @@ map_traverse(mapobject *lz, visitproc vi static PyObject * map_next(mapobject *lz) { - PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; PyObject **stack; Py_ssize_t niters, nargs, i; PyObject *result = NULL; niters = PyTuple_GET_SIZE(lz->iters); - if (niters <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { - stack = small_stack; - } - else { - stack = PyMem_Malloc(niters * sizeof(stack[0])); - if (stack == NULL) { - PyErr_NoMemory(); - return NULL; - } + stack = PyMem_Malloc(niters * sizeof(stack[0])); + if (stack == NULL) { + PyErr_NoMemory(); + return NULL; } nargs = 0; @@ -1220,9 +1214,7 @@ exit: for (i=0; i < nargs; i++) { Py_DECREF(stack[i]); } - if (stack != small_stack) { - PyMem_Free(stack); - } + PyMem_Free(stack); return result; }