diff --git a/src/compile.rs b/src/compile.rs index 66d3081..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::Free, + 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 e8b80f0..75a8c06 100644 --- a/src/symboltable.rs +++ b/src/symboltable.rs @@ -698,11 +698,11 @@ impl SymbolTableBuilder { self.scan_expressions(vals, context)?; } Subscript { a, b } => { - self.scan_expression(a, context)?; - self.scan_expression(b, context)?; + self.scan_expression(a, &ExpressionContext::Load)?; + self.scan_expression(b, &ExpressionContext::Load)?; } Attribute { value, .. } => { - self.scan_expression(value, context)?; + self.scan_expression(value, &ExpressionContext::Load)?; } Dict { elements } => { for (key, value) in elements {