summaryrefslogtreecommitdiffstats
path: root/Objects/call.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2017-03-14 20:37:20 (GMT)
committerGitHub <noreply@github.com>2017-03-14 20:37:20 (GMT)
commit0f7b0b397e12514ee213bc727c9939b66585cbe2 (patch)
tree786e7994f6128c4cba34a9d20c7d9aa5a96ba566 /Objects/call.c
parentd4914e9041cb9455592facba2a1afa6d905f1c01 (diff)
downloadcpython-0f7b0b397e12514ee213bc727c9939b66585cbe2.zip
cpython-0f7b0b397e12514ee213bc727c9939b66585cbe2.tar.gz
cpython-0f7b0b397e12514ee213bc727c9939b66585cbe2.tar.bz2
bpo-29735: Optimize partial_call(): avoid tuple (#516)
* Add _PyObject_HasFastCall() * partial_call() now avoids temporary tuple to pass positional arguments if the callable supports the FASTCALL calling convention for positional arguments. * Fix also a performance regression in partial_call() if the callable doesn't support FASTCALL.
Diffstat (limited to 'Objects/call.c')
-rw-r--r--Objects/call.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/Objects/call.c b/Objects/call.c
index f1b1408..dd022ec 100644
--- a/Objects/call.c
+++ b/Objects/call.c
@@ -2,6 +2,22 @@
#include "frameobject.h"
+int
+_PyObject_HasFastCall(PyObject *callable)
+{
+ if (PyFunction_Check(callable)) {
+ return 1;
+ }
+ else if (PyCFunction_Check(callable)) {
+ return !(PyCFunction_GET_FLAGS(callable) & METH_VARARGS);
+ }
+ else {
+ assert (PyCallable_Check(callable));
+ return 0;
+ }
+}
+
+
static PyObject *
null_error(void)
{