From: Victor Stinner Date: Tue, 17 Jan 2017 01:35:41 +0000 (+0100) Subject: Argument Clinic: Use METH_FASTCALL for boring positionals X-Git-Tag: v3.7.0a1~1537 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=093119e4eb8424451ef24a5a5a3ce9881d77abd5;p=python 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(). --- diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 7c4b388efe..894d1c5d99 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -825,16 +825,32 @@ class CLanguage(Language): # and nothing but normal objects: # PyArg_UnpackTuple! - flags = "METH_VARARGS" - parser_prototype = parser_prototype_varargs + if not new_or_init: + flags = "METH_FASTCALL" + parser_prototype = parser_prototype_fastcall - parser_definition = parser_body(parser_prototype, normalize_snippet(""" - if (!PyArg_UnpackTuple(args, "{name}", - {unpack_min}, {unpack_max}, - {parse_arguments})) {{ - goto exit; - }} - """, indent=4)) + 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: