diff --git a/src/compile.rs b/src/compile.rs index 2324ac3..7194c88 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -975,7 +975,7 @@ impl Compiler { // Turn code object into function object: self.emit(Instruction::MakeFunction { - flags: bytecode::FunctionOpArg::IS_CLASS, + flags: bytecode::FunctionOpArg::empty(), }); self.emit(Instruction::LoadConst { diff --git a/src/symboltable.rs b/src/symboltable.rs index 312650f..43e0500 100644 --- a/src/symboltable.rs +++ b/src/symboltable.rs @@ -61,7 +61,7 @@ impl SymbolTable { } } -#[derive(Clone)] +#[derive(Clone, PartialEq)] pub enum SymbolTableType { Module, Class, @@ -241,12 +241,10 @@ impl SymbolTableAnalyzer { } else { // Interesting stuff about the __class__ variable: // https://docs.python.org/3/reference/datamodel.html?highlight=__class__#creating-the-class-object - let found_in_outer_scope = (symbol.name == "__class__") - || self - .tables - .iter() - .skip(1) - .any(|t| t.symbols.contains_key(&symbol.name)); + let found_in_outer_scope = symbol.name == "__class__" + || self.tables.iter().skip(1).any(|t| { + t.typ != SymbolTableType::Class && t.symbols.contains_key(&symbol.name) + }); if found_in_outer_scope { // Symbol is in some outer scope. @@ -387,7 +385,6 @@ impl SymbolTableBuilder { keywords, decorator_list, } => { - self.register_name(name, SymbolUsage::Assigned)?; self.enter_scope(name, SymbolTableType::Class, statement.location.row()); self.scan_statements(body)?; self.leave_scope(); @@ -396,6 +393,7 @@ impl SymbolTableBuilder { self.scan_expression(&keyword.value, &ExpressionContext::Load)?; } self.scan_expressions(decorator_list, &ExpressionContext::Load)?; + self.register_name(name, SymbolUsage::Assigned)?; } Expression { expression } => { self.scan_expression(expression, &ExpressionContext::Load)?