Skip to content

Commit dcd79c4

Browse files
authored
[mypyc] Make some generated classes implicitly final (#19235)
Classes used for generators, async functions and nested functions are now final. This may slightly improve performance when using separate compilation.
1 parent f295bb8 commit dcd79c4

File tree

3 files changed

+6
-3
lines changed

3 files changed

+6
-3
lines changed

mypyc/irbuild/callable_class.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class for the nested function.
5555
# Define the actual callable class ClassIR, and set its
5656
# environment to point at the previously defined environment
5757
# class.
58-
callable_class_ir = ClassIR(name, builder.module_name, is_generated=True)
58+
callable_class_ir = ClassIR(name, builder.module_name, is_generated=True, is_final_class=True)
5959

6060
# The functools @wraps decorator attempts to call setattr on
6161
# nested functions, so we create a dict for these nested

mypyc/irbuild/env_class.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ class is generated, the function environment has not yet been
4343
containing a nested function.
4444
"""
4545
env_class = ClassIR(
46-
f"{builder.fn_info.namespaced_name()}_env", builder.module_name, is_generated=True
46+
f"{builder.fn_info.namespaced_name()}_env",
47+
builder.module_name,
48+
is_generated=True,
49+
is_final_class=True,
4750
)
4851
env_class.attributes[SELF_NAME] = RInstance(env_class)
4952
if builder.fn_info.is_nested:

mypyc/irbuild/generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def instantiate_generator_class(builder: IRBuilder) -> Value:
155155
def setup_generator_class(builder: IRBuilder) -> ClassIR:
156156
name = f"{builder.fn_info.namespaced_name()}_gen"
157157

158-
generator_class_ir = ClassIR(name, builder.module_name, is_generated=True)
158+
generator_class_ir = ClassIR(name, builder.module_name, is_generated=True, is_final_class=True)
159159
if builder.fn_info.can_merge_generator_and_env_classes():
160160
builder.fn_info.env_class = generator_class_ir
161161
else:

0 commit comments

Comments
 (0)