Skip to content

Commit ae7ff9c

Browse files
authored
codegen: module seed CodeInfo emits empty flags (#7782)
CPython convention: top-level module / interactive / expression code does not carry CO_NEWLOCALS or CO_OPTIMIZED. The per-scope mapping at enter_scope::CompilerScope::Module already returns empty flags, but Compiler::new seeded the root CodeInfo with CodeFlags::NEWLOCALS, forcing module code into the NEWLOCALS arm of frame.rs:725-731 so locals were allocated as a fresh empty dict instead of being bound to globals (the correct semantics for exec(code, globals)). Restore the seed to empty() so it matches the per-scope mapping and CPython's compiler_enter_scope for module scope.
1 parent d877c30 commit ae7ff9c

1 file changed

Lines changed: 9 additions & 1 deletion

File tree

crates/codegen/src/compile.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,15 @@ impl Compiler {
505505

506506
fn new(opts: CompileOpts, source_file: SourceFile, code_name: String) -> Self {
507507
let module_code = ir::CodeInfo {
508-
flags: bytecode::CodeFlags::NEWLOCALS,
508+
// CPython convention: top-level module / interactive /
509+
// expression code does not carry CO_NEWLOCALS or CO_OPTIMIZED.
510+
// (See `Python/compile.c compiler_enter_scope` for module
511+
// scope.) This matches the per-scope mapping at
512+
// enter_scope::CompilerScope::Module below, which also returns
513+
// empty flags. frame.rs:725-731 then binds locals to globals
514+
// for module/REPL frames whose `scope.locals` is None — the
515+
// correct semantics for `exec(code, globals)` and module init.
516+
flags: bytecode::CodeFlags::empty(),
509517
source_path: source_file.name().to_owned(),
510518
private: None,
511519
blocks: vec![ir::Block::default()],

0 commit comments

Comments
 (0)