From 44858012f430c203f9fbedb96e288268a3543fcf Mon Sep 17 00:00:00 2001 From: youknowdot Date: Sat, 10 Oct 2026 14:05:21 -0700 Subject: [PATCH] Preserve missing caller modules in eager type aliases (#9073) Only lazy aliases may obtain their module from the evaluation function. Eager aliases without a caller __name__ must not inspect their stored value. Assisted-by: OpenAI Codex:model identifier unavailable --- crates/vm/src/stdlib/_typing.rs | 4 +++- extra_tests/snippets/stdlib_typing.py | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/crates/vm/src/stdlib/_typing.rs b/crates/vm/src/stdlib/_typing.rs index 863dd8367..fad43d8eb 100644 --- a/crates/vm/src/stdlib/_typing.rs +++ b/crates/vm/src/stdlib/_typing.rs @@ -321,7 +321,9 @@ pub(crate) mod decl { return module.clone(); } // Fall back to compute_value's __module__ (like PyFunction_GetModule) - if let Ok(module) = self.compute_value.get_attr("__module__", vm) { + if self.is_lazy + && let Ok(module) = self.compute_value.get_attr("__module__", vm) + { return module; } vm.ctx.none() diff --git a/extra_tests/snippets/stdlib_typing.py b/extra_tests/snippets/stdlib_typing.py index 4082d683f..8ba64844c 100644 --- a/extra_tests/snippets/stdlib_typing.py +++ b/extra_tests/snippets/stdlib_typing.py @@ -63,3 +63,24 @@ try: repr(nested) except RecursionError: pass + + +# Eager aliases without a caller module never inspect their aliased value. +alias_module_lookups = [] + + +class AliasModuleValue: + @property + def __module__(self): + alias_module_lookups.append(True) + return "unexpected_value_module" + + +for alias_value in (int, AliasModuleValue()): + alias_namespace = {"value": alias_value} + exec( + "from typing import TypeAliasType; alias = TypeAliasType('Alias', value)", + alias_namespace, + ) + assert alias_namespace["alias"].__module__ is None +assert alias_module_lookups == []