Skip to content

[mypyc] Fix decorated __new__ in native classes - #22192

Open
rheard wants to merge 1 commit into
python:masterfrom
rheard:fix-mypyc-1249
Open

rheard wants to merge 1 commit into
python:masterfrom
rheard:fix-mypyc-1249

Conversation

@rheard

@rheard rheard commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Fixes mypyc/mypyc#1249.

A decorated method has no entry in ClassIR.method_decls, but the function below the decorators is in ClassIR.methods. For __new__ the code generator used both, and the result didn't work for any caller:

  • The constructor and tp_new called the function below the decorators directly, so a native call skipped the decorators.
  • The decorators were applied to the built-in __new__ function that calls tp_new. Setting the result on the class makes Python replace tp_new, which fails the safety check of that built-in function. Every call that isn't a native constructor call raised TypeError: C.__new__(C) is not safe, use object.__new__().
  • If __new__ takes other arguments than __init__, the generated C didn't compile (too many arguments to function 'CPyDef_C_____new__').
  • In a class with a built-in base class, __new__ in the type dict came from the method table, whose flags don't match the wrapper function of __new__. Instantiating the class crashed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Decorated __new__ of a native class is called without its decorator, or raises TypeError

1 participant