From 9064c85511c4110460c5f4ef07f68aa87b8d64a8 Mon Sep 17 00:00:00 2001 From: Jukka Lehtosalo Date: Wed, 4 Jun 2025 16:18:37 +0100 Subject: [PATCH] [mypyc] Make some generated classes implicitly final Classes used for generators, async functions and nested functions are now final. This may slightly improve performance when using separate compilation. --- mypyc/irbuild/callable_class.py | 2 +- mypyc/irbuild/env_class.py | 5 ++++- mypyc/irbuild/generator.py | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mypyc/irbuild/callable_class.py b/mypyc/irbuild/callable_class.py index 599dbb81f767..c7c3c7677cda 100644 --- a/mypyc/irbuild/callable_class.py +++ b/mypyc/irbuild/callable_class.py @@ -55,7 +55,7 @@ class for the nested function. # Define the actual callable class ClassIR, and set its # environment to point at the previously defined environment # class. - callable_class_ir = ClassIR(name, builder.module_name, is_generated=True) + callable_class_ir = ClassIR(name, builder.module_name, is_generated=True, is_final_class=True) # The functools @wraps decorator attempts to call setattr on # nested functions, so we create a dict for these nested diff --git a/mypyc/irbuild/env_class.py b/mypyc/irbuild/env_class.py index b0909f86686a..9e72f7efcf94 100644 --- a/mypyc/irbuild/env_class.py +++ b/mypyc/irbuild/env_class.py @@ -43,7 +43,10 @@ class is generated, the function environment has not yet been containing a nested function. """ env_class = ClassIR( - f"{builder.fn_info.namespaced_name()}_env", builder.module_name, is_generated=True + f"{builder.fn_info.namespaced_name()}_env", + builder.module_name, + is_generated=True, + is_final_class=True, ) env_class.attributes[SELF_NAME] = RInstance(env_class) if builder.fn_info.is_nested: diff --git a/mypyc/irbuild/generator.py b/mypyc/irbuild/generator.py index e9e6ac6fa548..ef538ee95949 100644 --- a/mypyc/irbuild/generator.py +++ b/mypyc/irbuild/generator.py @@ -155,7 +155,7 @@ def instantiate_generator_class(builder: IRBuilder) -> Value: def setup_generator_class(builder: IRBuilder) -> ClassIR: name = f"{builder.fn_info.namespaced_name()}_gen" - generator_class_ir = ClassIR(name, builder.module_name, is_generated=True) + generator_class_ir = ClassIR(name, builder.module_name, is_generated=True, is_final_class=True) if builder.fn_info.can_merge_generator_and_env_classes(): builder.fn_info.env_class = generator_class_ir else: