Skip to content

Commit 2a7c068

Browse files
committed
de-duplicate prototypes
1 parent b1cd7b6 commit 2a7c068

1 file changed

Lines changed: 13 additions & 23 deletions

File tree

Tools/clinic/libclinic/parse_args.py

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from libclinic import fail, warn
66
from libclinic.function import (
77
Function, Parameter,
8-
GETTER, SETTER, METHOD_NEW, METHOD_INIT)
8+
GETTER, SETTER, METHOD_INIT)
99
from libclinic.converter import CConverter
1010
from libclinic.converters import (
1111
defining_class_converter, object_converter, self_converter)
@@ -99,20 +99,11 @@ def declare_parser(
9999

100100
NO_VARARG: Final[str] = "PY_SSIZE_T_MAX"
101101
PARSER_PROTOTYPE_KEYWORD: Final[str] = libclinic.normalize_snippet("""
102-
static PyObject *
103-
{c_basename}({self_type}{self_name}, PyObject *args, PyObject *kwargs)
104-
""")
105-
PARSER_PROTOTYPE_KEYWORD___INIT__: Final[str] = libclinic.normalize_snippet("""
106-
static int
102+
static {return_type}
107103
{c_basename}({self_type}{self_name}, PyObject *args, PyObject *kwargs)
108104
""")
109105
PARSER_PROTOTYPE_KEYWORD_HELPER: Final[str] = libclinic.normalize_snippet("""
110-
static PyObject *
111-
{c_basename}_parse_args({self_type}{self_name}, PyObject *const *args,
112-
Py_ssize_t nargs, Py_ssize_t nkw, PyObject *kwargs, PyObject *kwnames)
113-
""")
114-
PARSER_PROTOTYPE_KEYWORD___INIT___HELPER: Final[str] = libclinic.normalize_snippet("""
115-
static int
106+
static {return_type}
116107
{c_basename}_parse_args({self_type}{self_name}, PyObject *const *args,
117108
Py_ssize_t nargs, Py_ssize_t nkw, PyObject *kwargs, PyObject *kwnames)
118109
""")
@@ -357,6 +348,10 @@ def init_limited_capi(self) -> None:
357348
warn(f"Function {self.func.full_name} cannot use limited C API")
358349
self.limited_capi = False
359350

351+
def _keyword_prototype(self, template: str) -> str:
352+
return_type = "int" if self.func.kind is METHOD_INIT else "PyObject *"
353+
return template.replace("{return_type}", return_type)
354+
360355
def parser_body(
361356
self,
362357
*fields: str,
@@ -623,7 +618,7 @@ def parse_pos_only(self) -> None:
623618

624619
def parse_var_keyword(self) -> None:
625620
self.flags = "METH_VARARGS|METH_KEYWORDS"
626-
self.parser_prototype = PARSER_PROTOTYPE_KEYWORD
621+
self.parser_prototype = self._keyword_prototype(PARSER_PROTOTYPE_KEYWORD)
627622
nargs = 'PyTuple_GET_SIZE(args)'
628623

629624
parser_code = []
@@ -707,10 +702,7 @@ def parse_general(self, clang: CLanguage) -> None:
707702
# calling conventions; both the tuple/dict entry point and
708703
# the vectorcall entry point call this helper.
709704
self.flags = "METH_VARARGS|METH_KEYWORDS"
710-
if self.func.kind is METHOD_INIT:
711-
self.parser_prototype = PARSER_PROTOTYPE_KEYWORD___INIT___HELPER
712-
else:
713-
self.parser_prototype = PARSER_PROTOTYPE_KEYWORD_HELPER
705+
self.parser_prototype = self._keyword_prototype(PARSER_PROTOTYPE_KEYWORD_HELPER)
714706
argsname = 'fastargs'
715707
argname_fmt = 'fastargs[%d]'
716708
self.declarations = declare_parser(self.func, codegen=self.codegen)
@@ -724,7 +716,7 @@ def parse_general(self, clang: CLanguage) -> None:
724716
else:
725717
# positional-or-keyword arguments
726718
self.flags = "METH_VARARGS|METH_KEYWORDS"
727-
self.parser_prototype = PARSER_PROTOTYPE_KEYWORD
719+
self.parser_prototype = self._keyword_prototype(PARSER_PROTOTYPE_KEYWORD)
728720
argsname = 'fastargs'
729721
argname_fmt = 'fastargs[%d]'
730722
self.declarations = declare_parser(self.func, codegen=self.codegen)
@@ -826,7 +818,7 @@ def parse_general(self, clang: CLanguage) -> None:
826818
# positional-or-keyword arguments
827819
assert not self.fastcall
828820
self.flags = "METH_VARARGS|METH_KEYWORDS"
829-
self.parser_prototype = PARSER_PROTOTYPE_KEYWORD
821+
self.parser_prototype = self._keyword_prototype(PARSER_PROTOTYPE_KEYWORD)
830822
parser_code = [libclinic.normalize_snippet("""
831823
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "{format_units}:{name}", _keywords,
832824
{parse_arguments}))
@@ -886,11 +878,9 @@ def copy_includes(self) -> None:
886878
def handle_new_or_init(self) -> None:
887879
self.methoddef_define = ''
888880

889-
if self.func.kind is METHOD_NEW:
890-
entry_prototype = PARSER_PROTOTYPE_KEYWORD
891-
else:
881+
if self.func.kind is METHOD_INIT:
892882
self.return_value_declaration = "int return_value = -1;"
893-
entry_prototype = PARSER_PROTOTYPE_KEYWORD___INIT__
883+
entry_prototype = self._keyword_prototype(PARSER_PROTOTYPE_KEYWORD)
894884

895885
parses_keywords = 'METH_KEYWORDS' in self.flags
896886

0 commit comments

Comments
 (0)