diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2017-03-14 20:37:20 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-14 20:37:20 (GMT) |
commit | 0f7b0b397e12514ee213bc727c9939b66585cbe2 (patch) | |
tree | 786e7994f6128c4cba34a9d20c7d9aa5a96ba566 /Objects/call.c | |
parent | d4914e9041cb9455592facba2a1afa6d905f1c01 (diff) | |
download | cpython-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.c | 16 |
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) { |