Try to use loadname local replace loadname free

This commit is contained in:
lynskylate 2020-07-18 04:02:42 +08:00
parent f6e25fc0cb
commit 5ca3fc79f4
2 changed files with 5 additions and 3 deletions

View file

@ -298,7 +298,7 @@ impl<O: OutputStream> Compiler<O> {
SymbolScope::Global => bytecode::NameScope::Global, SymbolScope::Global => bytecode::NameScope::Global,
SymbolScope::Nonlocal => bytecode::NameScope::NonLocal, SymbolScope::Nonlocal => bytecode::NameScope::NonLocal,
SymbolScope::Unknown => bytecode::NameScope::Free, SymbolScope::Unknown => bytecode::NameScope::Free,
SymbolScope::Local => bytecode::NameScope::Free, SymbolScope::Local => bytecode::NameScope::Local,
} }
} }

View file

@ -276,6 +276,8 @@ impl<'a> SymbolTableAnalyzer<'a> {
fn analyze_unknown_symbol(&self, symbol: &mut Symbol) { fn analyze_unknown_symbol(&self, symbol: &mut Symbol) {
if symbol.is_assigned || symbol.is_parameter { if symbol.is_assigned || symbol.is_parameter {
symbol.scope = SymbolScope::Local; symbol.scope = SymbolScope::Local;
} else if symbol.is_referenced {
symbol.scope = SymbolScope::Unknown;
} else { } else {
// Interesting stuff about the __class__ variable: // Interesting stuff about the __class__ variable:
// https://docs.python.org/3/reference/datamodel.html?highlight=__class__#creating-the-class-object // 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)?; self.scan_expressions(vals, context)?;
} }
Subscript { a, b } => { Subscript { a, b } => {
self.scan_expression(a, context)?; self.scan_expression(a, &ExpressionContext::Load)?;
self.scan_expression(b, context)?; self.scan_expression(b, context)?;
} }
Attribute { value, .. } => { Attribute { value, .. } => {
self.scan_expression(value, context)?; self.scan_expression(value, &ExpressionContext::Load)?;
} }
Dict { elements } => { Dict { elements } => {
for (key, value) in elements { for (key, value) in elements {