From f6eb1168bc180415ed68314527d7468a2ddd1b8f Mon Sep 17 00:00:00 2001 From: lynskylate Date: Sat, 8 Aug 2020 01:53:13 +0800 Subject: [PATCH] Fix scope error --- src/compile.rs | 10 +++++++++- src/symboltable.rs | 2 -- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/compile.rs b/src/compile.rs index 69adf4d..26eca75 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -298,7 +298,15 @@ impl Compiler { SymbolScope::Global => bytecode::NameScope::Global, SymbolScope::Nonlocal => bytecode::NameScope::NonLocal, SymbolScope::Unknown => bytecode::NameScope::Free, - SymbolScope::Local => bytecode::NameScope::Local, + SymbolScope::Local => { + // Only in function block, we use load local + // https://github.com/python/cpython/blob/master/Python/compile.c#L3582 + if self.ctx.in_func() { + bytecode::NameScope::Local + } else { + bytecode::NameScope::Free + } + } } } diff --git a/src/symboltable.rs b/src/symboltable.rs index d121fa1..fd23427 100644 --- a/src/symboltable.rs +++ b/src/symboltable.rs @@ -281,8 +281,6 @@ impl<'a> SymbolTableAnalyzer<'a> { fn analyze_unknown_symbol(&self, symbol: &mut Symbol) { if symbol.is_assigned || symbol.is_parameter { symbol.scope = SymbolScope::Local; - } else if symbol.is_referenced { - symbol.scope = SymbolScope::Unknown; } else { // Interesting stuff about the __class__ variable: // https://docs.python.org/3/reference/datamodel.html?highlight=__class__#creating-the-class-object