Skip to content

Commit 25e80e4

Browse files
committed
x
1 parent 3113d84 commit 25e80e4

File tree

4 files changed

+13
-118
lines changed

4 files changed

+13
-118
lines changed

compiler/codegen/src/compile.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ impl Compiler<'_> {
434434
.filter(|(_, s)| s.scope == SymbolScope::Cell)
435435
.map(|(var, _)| var.clone())
436436
.collect();
437-
let mut freevar_cache: IndexSet<String> = table
437+
let freevar_cache = table
438438
.symbols
439439
.iter()
440440
.filter(|(_, s)| {
@@ -443,16 +443,6 @@ impl Compiler<'_> {
443443
.map(|(var, _)| var.clone())
444444
.collect();
445445

446-
// For PEP 695 class bodies, we need to add .type_params as a free variable
447-
// Check if this is a class inside a TypeParams scope
448-
if table.typ == symboltable::SymbolTableType::Class && self.symbol_table_stack.len() >= 2 {
449-
let parent_table = &self.symbol_table_stack[self.symbol_table_stack.len() - 2];
450-
if parent_table.typ == symboltable::SymbolTableType::TypeParams {
451-
// This is a PEP 695 class, add .type_params as a free variable
452-
freevar_cache.insert(".type_params".to_string());
453-
}
454-
}
455-
456446
let info = ir::CodeInfo {
457447
flags,
458448
posonlyarg_count,
@@ -1896,7 +1886,6 @@ impl Compiler<'_> {
18961886
);
18971887

18981888
// Skip CopyFreeVars for now - it's not properly implemented
1899-
// Instead, we'll use LoadFromDictOrDeref which should work with our closure setup
19001889

19011890
let (doc_str, body) = split_doc(body, &self.opts);
19021891
let qualified_name = self.qualified_path.join(".");

compiler/codegen/src/symboltable.rs

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@ enum SymbolUsage {
557557
AnnotationParameter,
558558
AssignedNamedExprInComprehension,
559559
Iter,
560+
TypeParam,
560561
}
561562

562563
struct SymbolTableBuilder<'src> {
@@ -1267,15 +1268,8 @@ impl SymbolTableBuilder<'_> {
12671268
}
12681269

12691270
fn scan_type_params(&mut self, type_params: &TypeParams) -> SymbolTableResult {
1270-
// Register .type_params as a local variable in the TypeParams scope
1271-
self.register_name(".type_params", SymbolUsage::Assigned, type_params.range)?;
1272-
1273-
// Mark .type_params as a cell variable for PEP 695
1274-
if let Some(table) = self.tables.last_mut() {
1275-
if let Some(symbol) = table.symbols.get_mut(".type_params") {
1276-
symbol.scope = SymbolScope::Cell;
1277-
}
1278-
}
1271+
// Register .type_params as a type parameter (automatically becomes cell variable)
1272+
self.register_name(".type_params", SymbolUsage::TypeParam, type_params.range)?;
12791273

12801274
// First register all type parameters
12811275
for type_param in &type_params.type_params {
@@ -1286,13 +1280,7 @@ impl SymbolTableBuilder<'_> {
12861280
range: type_var_range,
12871281
..
12881282
}) => {
1289-
self.register_name(name.as_str(), SymbolUsage::Assigned, *type_var_range)?;
1290-
// Mark as cell variable for PEP 695
1291-
if let Some(table) = self.tables.last_mut() {
1292-
if let Some(symbol) = table.symbols.get_mut(name.as_str()) {
1293-
symbol.scope = SymbolScope::Cell;
1294-
}
1295-
}
1283+
self.register_name(name.as_str(), SymbolUsage::TypeParam, *type_var_range)?;
12961284
if let Some(binding) = bound {
12971285
self.scan_expression(binding, ExpressionContext::Load)?;
12981286
}
@@ -1302,26 +1290,14 @@ impl SymbolTableBuilder<'_> {
13021290
range: param_spec_range,
13031291
..
13041292
}) => {
1305-
self.register_name(name, SymbolUsage::Assigned, *param_spec_range)?;
1306-
// Mark as cell variable for PEP 695
1307-
if let Some(table) = self.tables.last_mut() {
1308-
if let Some(symbol) = table.symbols.get_mut(name.as_str()) {
1309-
symbol.scope = SymbolScope::Cell;
1310-
}
1311-
}
1293+
self.register_name(name, SymbolUsage::TypeParam, *param_spec_range)?;
13121294
}
13131295
TypeParam::TypeVarTuple(TypeParamTypeVarTuple {
13141296
name,
13151297
range: type_var_tuple_range,
13161298
..
13171299
}) => {
1318-
self.register_name(name, SymbolUsage::Assigned, *type_var_tuple_range)?;
1319-
// Mark as cell variable for PEP 695
1320-
if let Some(table) = self.tables.last_mut() {
1321-
if let Some(symbol) = table.symbols.get_mut(name.as_str()) {
1322-
symbol.scope = SymbolScope::Cell;
1323-
}
1324-
}
1300+
self.register_name(name, SymbolUsage::TypeParam, *type_var_tuple_range)?;
13251301
}
13261302
}
13271303
}
@@ -1572,6 +1548,11 @@ impl SymbolTableBuilder<'_> {
15721548
SymbolUsage::Iter => {
15731549
flags.insert(SymbolFlags::ITER);
15741550
}
1551+
SymbolUsage::TypeParam => {
1552+
// Type parameters are always cell variables in their scope
1553+
symbol.scope = SymbolScope::Cell;
1554+
flags.insert(SymbolFlags::ASSIGNED);
1555+
}
15751556
}
15761557

15771558
// and even more checking

compiler/core/src/bytecode.rs

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -442,12 +442,7 @@ pub enum Instruction {
442442
LoadGlobal(Arg<NameIdx>),
443443
LoadDeref(Arg<NameIdx>),
444444
LoadClassDeref(Arg<NameIdx>),
445-
LoadFromDictOrDeref(Arg<NameIdx>),
446445
StoreFast(Arg<NameIdx>),
447-
StoreFastLoadFast {
448-
store_idx: Arg<NameIdx>,
449-
load_idx: Arg<NameIdx>,
450-
},
451446
StoreLocal(Arg<NameIdx>),
452447
StoreGlobal(Arg<NameIdx>),
453448
StoreDeref(Arg<NameIdx>),
@@ -1263,14 +1258,8 @@ impl Instruction {
12631258
ImportName { .. } | ImportNameless => -1,
12641259
ImportStar => -1,
12651260
ImportFrom { .. } => 1,
1266-
LoadFast(_)
1267-
| LoadNameAny(_)
1268-
| LoadGlobal(_)
1269-
| LoadDeref(_)
1270-
| LoadClassDeref(_)
1271-
| LoadFromDictOrDeref(_) => 1,
1261+
LoadFast(_) | LoadNameAny(_) | LoadGlobal(_) | LoadDeref(_) | LoadClassDeref(_) => 1,
12721262
StoreFast(_) | StoreLocal(_) | StoreGlobal(_) | StoreDeref(_) => -1,
1273-
StoreFastLoadFast { .. } => 0, // Stores then loads, net effect 0
12741263
DeleteFast(_) | DeleteLocal(_) | DeleteGlobal(_) | DeleteDeref(_) => 0,
12751264
LoadClosure(_) => 1,
12761265
Subscript => -1,
@@ -1473,20 +1462,7 @@ impl Instruction {
14731462
LoadGlobal(idx) => w!(LoadGlobal, name = idx),
14741463
LoadDeref(idx) => w!(LoadDeref, cell_name = idx),
14751464
LoadClassDeref(idx) => w!(LoadClassDeref, cell_name = idx),
1476-
LoadFromDictOrDeref(idx) => w!(LoadFromDictOrDeref, name = idx),
14771465
StoreFast(idx) => w!(StoreFast, varname = idx),
1478-
StoreFastLoadFast {
1479-
store_idx,
1480-
load_idx,
1481-
} => {
1482-
write!(f, "StoreFastLoadFast(")?;
1483-
write!(
1484-
f,
1485-
"store={}, load={})",
1486-
store_idx.get(arg),
1487-
load_idx.get(arg)
1488-
)
1489-
}
14901466
StoreLocal(idx) => w!(StoreLocal, name = idx),
14911467
StoreGlobal(idx) => w!(StoreGlobal, name = idx),
14921468
StoreDeref(idx) => w!(StoreDeref, cell_name = idx),

vm/src/frame.rs

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -611,62 +611,11 @@ impl ExecutingFrame<'_> {
611611
});
612612
Ok(None)
613613
}
614-
bytecode::Instruction::LoadFromDictOrDeref(idx) => {
615-
let name = self.code.names[idx.get(arg) as usize];
616-
let dict = self.locals.as_object();
617-
let value = match dict.get_item(name, vm) {
618-
Ok(value) => value,
619-
Err(_) => {
620-
// Try to load from deref if not in dict
621-
let i = self
622-
.code
623-
.cellvars
624-
.iter()
625-
.position(|n| n == &name)
626-
.or_else(|| {
627-
self.code
628-
.freevars
629-
.iter()
630-
.position(|n| n == &name)
631-
.map(|i| i + self.code.cellvars.len())
632-
})
633-
.ok_or_else(|| {
634-
vm.new_name_error(
635-
format!("name '{}' is not defined", name),
636-
name.to_owned(),
637-
)
638-
})?;
639-
self.cells_frees[i]
640-
.get()
641-
.ok_or_else(|| self.unbound_cell_exception(i, vm))?
642-
}
643-
};
644-
self.push_value(value);
645-
Ok(None)
646-
}
647614
bytecode::Instruction::StoreFast(idx) => {
648615
let value = self.pop_value();
649616
self.fastlocals.lock()[idx.get(arg) as usize] = Some(value);
650617
Ok(None)
651618
}
652-
bytecode::Instruction::StoreFastLoadFast {
653-
store_idx,
654-
load_idx,
655-
} => {
656-
let value = self.pop_value();
657-
658-
// Store the value at store_idx
659-
let mut fastlocals = self.fastlocals.lock();
660-
fastlocals[store_idx.get(arg) as usize] = Some(value);
661-
662-
// Load from load_idx (which might be the same as store_idx)
663-
let loaded = fastlocals[load_idx.get(arg) as usize]
664-
.clone()
665-
.expect("must exist");
666-
drop(fastlocals); // Release the lock before pushing
667-
self.push_value(loaded);
668-
Ok(None)
669-
}
670619
bytecode::Instruction::StoreLocal(idx) => {
671620
let name = self.code.names[idx.get(arg) as usize];
672621
let value = self.pop_value();

0 commit comments

Comments
 (0)