mirror of
https://github.com/RustPython/Parser.git
synced 2025-07-14 00:25:17 +00:00
Fix class scopes by modifying symboltable
This commit is contained in:
parent
acce23b79b
commit
d7f99dc7b1
2 changed files with 7 additions and 9 deletions
|
@ -975,7 +975,7 @@ impl<O: OutputStream> Compiler<O> {
|
|||
|
||||
// Turn code object into function object:
|
||||
self.emit(Instruction::MakeFunction {
|
||||
flags: bytecode::FunctionOpArg::IS_CLASS,
|
||||
flags: bytecode::FunctionOpArg::empty(),
|
||||
});
|
||||
|
||||
self.emit(Instruction::LoadConst {
|
||||
|
|
|
@ -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)?
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue