(self, func: Function, codegen: CodeGen)
| 236 | parser_body_fields: tuple[str, ...] |
| 237 | |
| 238 | def __init__(self, func: Function, codegen: CodeGen) -> None: |
| 239 | self.func = func |
| 240 | self.codegen = codegen |
| 241 | |
| 242 | self.parameters = list(self.func.parameters.values()) |
| 243 | self_parameter = self.parameters.pop(0) |
| 244 | if not isinstance(self_parameter.converter, self_converter): |
| 245 | raise ValueError("the first parameter must use self_converter") |
| 246 | self.self_parameter_converter = self_parameter.converter |
| 247 | |
| 248 | self.requires_defining_class = False |
| 249 | if self.parameters and isinstance(self.parameters[0].converter, defining_class_converter): |
| 250 | self.requires_defining_class = True |
| 251 | del self.parameters[0] |
| 252 | |
| 253 | for i, p in enumerate(self.parameters): |
| 254 | if p.is_vararg(): |
| 255 | self.varpos = p |
| 256 | del self.parameters[i] |
| 257 | break |
| 258 | |
| 259 | for i, p in enumerate(self.parameters): |
| 260 | if p.is_var_keyword(): |
| 261 | self.var_keyword = p |
| 262 | del self.parameters[i] |
| 263 | break |
| 264 | |
| 265 | self.converters = [p.converter for p in self.parameters] |
| 266 | |
| 267 | if self.func.critical_section: |
| 268 | self.codegen.add_include('pycore_critical_section.h', |
| 269 | 'Py_BEGIN_CRITICAL_SECTION()') |
| 270 | |
| 271 | # Use fastcall if not disabled, except if in a __new__ or |
| 272 | # __init__ method, or if there is a **kwargs parameter. |
| 273 | if self.func.disable_fastcall: |
| 274 | self.fastcall = False |
| 275 | elif self.var_keyword is not None: |
| 276 | self.fastcall = False |
| 277 | else: |
| 278 | self.fastcall = not self.is_new_or_init() |
| 279 | |
| 280 | self.pos_only = 0 |
| 281 | self.min_pos = 0 |
| 282 | self.max_pos = 0 |
| 283 | self.min_kw_only = 0 |
| 284 | for i, p in enumerate(self.parameters, 1): |
| 285 | if p.is_keyword_only(): |
| 286 | assert not p.is_positional_only() |
| 287 | if not p.is_optional(): |
| 288 | self.min_kw_only = i - self.max_pos |
| 289 | else: |
| 290 | self.max_pos = i |
| 291 | if p.is_positional_only(): |
| 292 | self.pos_only = i |
| 293 | if not p.is_optional(): |
| 294 | self.min_pos = i |
| 295 |
nothing calls this directly
no test coverage detected