55from libclinic import fail , warn
66from libclinic .function import (
77 Function , Parameter ,
8- GETTER , SETTER , METHOD_NEW , METHOD_INIT )
8+ GETTER , SETTER , METHOD_INIT )
99from libclinic .converter import CConverter
1010from libclinic .converters import (
1111 defining_class_converter , object_converter , self_converter )
@@ -99,20 +99,11 @@ def declare_parser(
9999
100100NO_VARARG : Final [str ] = "PY_SSIZE_T_MAX"
101101PARSER_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""" )
109105PARSER_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