[Python-checkins] cpython: Argument Clinic: Use METH_FASTCALL for boring positionals

victor.stinner python-checkins at python.org
Mon Jan 16 20:48:45 EST 2017


https://hg.python.org/cpython/rev/905e902bd47e
changeset:   106181:905e902bd47e
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Tue Jan 17 02:35:41 2017 +0100
summary:
  Argument Clinic: Use METH_FASTCALL for boring positionals

Issue #29286. Use METH_FASTCALL calling convention instead of METH_VARARGS to
parse "boring" position arguments. METH_FASTCALL is faster since it avoids the
creation of a temporary tuple to pass positional arguments.

Replace PyArg_UnpackTuple() with _PyArg_UnpackStack()+_PyArg_NoStackKeywords().

files:
  Tools/clinic/clinic.py |  36 +++++++++++++++++++++--------
  1 files changed, 26 insertions(+), 10 deletions(-)


diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -825,16 +825,32 @@
             # and nothing but normal objects:
             # PyArg_UnpackTuple!
 
-            flags = "METH_VARARGS"
-            parser_prototype = parser_prototype_varargs
-
-            parser_definition = parser_body(parser_prototype, normalize_snippet("""
-                if (!PyArg_UnpackTuple(args, "{name}",
-                    {unpack_min}, {unpack_max},
-                    {parse_arguments})) {{
-                    goto exit;
-                }}
-                """, indent=4))
+            if not new_or_init:
+                flags = "METH_FASTCALL"
+                parser_prototype = parser_prototype_fastcall
+
+                parser_definition = parser_body(parser_prototype, normalize_snippet("""
+                    if (!_PyArg_UnpackStack(args, nargs, "{name}",
+                        {unpack_min}, {unpack_max},
+                        {parse_arguments})) {{
+                        goto exit;
+                    }}
+
+                    if ({self_type_check}!_PyArg_NoStackKeywords("{name}", kwnames)) {{
+                        goto exit;
+                    }}
+                    """, indent=4))
+            else:
+                flags = "METH_VARARGS"
+                parser_prototype = parser_prototype_varargs
+
+                parser_definition = parser_body(parser_prototype, normalize_snippet("""
+                    if (!PyArg_UnpackTuple(args, "{name}",
+                        {unpack_min}, {unpack_max},
+                        {parse_arguments})) {{
+                        goto exit;
+                    }}
+                    """, indent=4))
 
         elif positional:
             if not new_or_init:

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list