From 5ca3fc79f47dd1040b11467cd96391a8f0606e4a Mon Sep 17 00:00:00 2001 From: lynskylate Date: Sat, 18 Jul 2020 04:02:42 +0800 Subject: [PATCH 1/3] Try to use loadname local replace loadname free --- src/compile.rs | 2 +- src/symboltable.rs | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/compile.rs b/src/compile.rs index 66d3081..69adf4d 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -298,7 +298,7 @@ impl Compiler { SymbolScope::Global => bytecode::NameScope::Global, SymbolScope::Nonlocal => bytecode::NameScope::NonLocal, SymbolScope::Unknown => bytecode::NameScope::Free, - SymbolScope::Local => bytecode::NameScope::Free, + SymbolScope::Local => bytecode::NameScope::Local, } } diff --git a/src/symboltable.rs b/src/symboltable.rs index 5714367..1b9707d 100644 --- a/src/symboltable.rs +++ b/src/symboltable.rs @@ -276,6 +276,8 @@ 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 @@ -680,11 +682,11 @@ impl SymbolTableBuilder { self.scan_expressions(vals, context)?; } Subscript { a, b } => { - self.scan_expression(a, context)?; + self.scan_expression(a, &ExpressionContext::Load)?; self.scan_expression(b, context)?; } Attribute { value, .. } => { - self.scan_expression(value, context)?; + self.scan_expression(value, &ExpressionContext::Load)?; } Dict { elements } => { for (key, value) in elements { From f6eb1168bc180415ed68314527d7468a2ddd1b8f Mon Sep 17 00:00:00 2001 From: lynskylate Date: Sat, 8 Aug 2020 01:53:13 +0800 Subject: [PATCH 2/3] 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 From 2b54fa871ff739027ca06165754451a58429721f Mon Sep 17 00:00:00 2001 From: lynskylate Date: Sat, 8 Aug 2020 13:08:13 +0800 Subject: [PATCH 3/3] Fix load context --- src/symboltable.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/symboltable.rs b/src/symboltable.rs index fd23427..75a8c06 100644 --- a/src/symboltable.rs +++ b/src/symboltable.rs @@ -699,7 +699,7 @@ impl SymbolTableBuilder { } Subscript { a, b } => { self.scan_expression(a, &ExpressionContext::Load)?; - self.scan_expression(b, context)?; + self.scan_expression(b, &ExpressionContext::Load)?; } Attribute { value, .. } => { self.scan_expression(value, &ExpressionContext::Load)?;