displayname = parameters[0].get_displayname(0)
parsearg = converters[0].parse_arg(argname, displayname, limited_capi=limited_capi)
if parsearg is None:
+ converters[0].use_converter()
parsearg = """
if (!PyArg_Parse(%s, "{format_units}:{name}", {parse_arguments})) {{
goto exit;
if has_optional:
parser_code.append("skip_optional:")
else:
+ for parameter in parameters:
+ parameter.converter.use_converter()
+
if limited_capi:
fastcall = False
if fastcall:
if add_label:
parser_code.append("%s:" % add_label)
else:
+ for parameter in parameters:
+ parameter.converter.use_converter()
+
declarations = declare_parser(f, clinic=clinic,
hasformat=True,
limited_capi=limited_capi)
fmt = fmt.replace('{bad_argument2}', bad_argument2)
return fmt.format(argname=argname, paramname=self.parser_name, **kwargs)
+ def use_converter(self) -> None:
+ """Method called when self.converter is used to parse an argument."""
+ pass
+
def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
if self.format_unit == 'O&':
+ self.use_converter()
return self.format_code("""
if (!{converter}({argname}, &{paramname})) {{{{
goto exit;
self.format_unit = 'H'
else:
self.converter = '_PyLong_UnsignedShort_Converter'
+
+ def use_converter(self) -> None:
+ if self.converter == '_PyLong_UnsignedShort_Converter':
self.add_include('pycore_long.h',
'_PyLong_UnsignedShort_Converter()')
self.format_unit = 'I'
else:
self.converter = '_PyLong_UnsignedInt_Converter'
+
+ def use_converter(self) -> None:
+ if self.converter == '_PyLong_UnsignedInt_Converter':
self.add_include('pycore_long.h',
'_PyLong_UnsignedInt_Converter()')
self.format_unit = 'k'
else:
self.converter = '_PyLong_UnsignedLong_Converter'
+
+ def use_converter(self) -> None:
+ if self.converter == '_PyLong_UnsignedLong_Converter':
self.add_include('pycore_long.h',
'_PyLong_UnsignedLong_Converter()')
self.format_unit = 'K'
else:
self.converter = '_PyLong_UnsignedLongLong_Converter'
+
+ def use_converter(self) -> None:
+ if self.converter == '_PyLong_UnsignedLongLong_Converter':
self.add_include('pycore_long.h',
'_PyLong_UnsignedLongLong_Converter()')
if accept == {int}:
self.format_unit = 'n'
self.default_type = int
- self.add_include('pycore_abstract.h', '_PyNumber_Index()')
elif accept == {int, NoneType}:
self.converter = '_Py_convert_optional_to_ssize_t'
- self.add_include('pycore_abstract.h',
- '_Py_convert_optional_to_ssize_t()')
else:
fail(f"Py_ssize_t_converter: illegal 'accept' argument {accept!r}")
+ def use_converter(self) -> None:
+ if self.converter == '_Py_convert_optional_to_ssize_t':
+ self.add_include('pycore_abstract.h',
+ '_Py_convert_optional_to_ssize_t()')
+
def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
if self.format_unit == 'n':
if limited_capi:
PyNumber_Index = 'PyNumber_Index'
else:
PyNumber_Index = '_PyNumber_Index'
+ self.add_include('pycore_abstract.h', '_PyNumber_Index()')
return self.format_code("""
{{{{
Py_ssize_t ival = -1;
converter = '_PyLong_Size_t_Converter'
c_ignored_default = "0"
- def converter_init(self, *, accept: TypeSet = {int, NoneType}) -> None:
+ def use_converter(self) -> None:
self.add_include('pycore_long.h',
'_PyLong_Size_t_Converter()')
type = 'int'
converter = '_PyLong_FileDescriptor_Converter'
+ def use_converter(self) -> None:
+ self.add_include('pycore_fileutils.h',
+ '_PyLong_FileDescriptor_Converter()')
+
def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
if limited_capi:
return self.format_code("""
""",
argname=argname)
else:
- self.add_include('pycore_fileutils.h',
- '_PyLong_FileDescriptor_Converter()')
return super().parse_arg(argname, displayname, limited_capi=limited_capi)