Merge pull request #1332 from RustPython/load_global_loading_local

load_global shouldn't load outermost locals.
This commit is contained in:
Adam authored and GitHub committed 2019-09-02 10:13:19 +01:00
commit 814260e7e4
3 files changed
+7 -10

No files matched your search

+4 -1
View File
@@ -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;
}
}
+3
View File
@@ -15,8 +15,11 @@ assert a == 4
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
-9
View File
@@ -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<PyObjectRef> {
// 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 {