diff --git a/compiler/src/symboltable.rs b/compiler/src/symboltable.rs index 3c70d4fc25..c07b5ae403 100644 --- a/compiler/src/symboltable.rs +++ b/compiler/src/symboltable.rs @@ -251,8 +251,11 @@ impl SymbolTableAnalyzer { if found_in_outer_scope { // Symbol is in some outer scope. symbol.is_free = true; + } else if self.tables.is_empty() { + // Don't make assumptions when we don't know. + symbol.scope = SymbolScope::Unknown; } else { - // Well, it must be a global then :) + // If there are scopes above we can assume global. symbol.scope = SymbolScope::Global; } } diff --git a/tests/snippets/global_nonlocal.py b/tests/snippets/global_nonlocal.py index ddf5e1ed22..1996f2e331 100644 --- a/tests/snippets/global_nonlocal.py +++ b/tests/snippets/global_nonlocal.py @@ -15,8 +15,11 @@ def b(): def x(): def y(): + global a nonlocal b + assert a == 4, a b = 3 + a = "no!" # a here shouldn't be seen by the global above. b = 2 y() return b diff --git a/vm/src/scope.rs b/vm/src/scope.rs index 3ba068f6e5..eda7ddc09b 100644 --- a/vm/src/scope.rs +++ b/vm/src/scope.rs @@ -179,15 +179,6 @@ impl NameProtocol for Scope { #[cfg_attr(feature = "flame-it", flame("Scope"))] /// Load a global name. fn load_global(&self, vm: &VirtualMachine, name: &str) -> Option { - // First, take a look in the outmost local scope (the scope at top level) - let last_local_dict = self.locals.iter().last(); - if let Some(local_dict) = last_local_dict { - if let Some(value) = local_dict.get_item_option(name, vm).unwrap() { - return Some(value); - } - } - - // Now, take a look at the globals or builtins. if let Some(value) = self.globals.get_item_option(name, vm).unwrap() { Some(value) } else {