Skip to content

Commit 62dd3ca

Browse files
committed
Expose symbol scopes through _symtable
Pack symbol scopes with definition flags in _symtable.symbols for Lib/symtable.py. Assisted-by: Codex:gpt-5
1 parent aaeab4f commit 62dd3ca

2 files changed

Lines changed: 3 additions & 8 deletions

File tree

Lib/test/test_symtable.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,6 @@ def test_lineno(self):
247247
self.assertEqual(self.top.get_lineno(), 0)
248248
self.assertEqual(self.spam.get_lineno(), 14)
249249

250-
@unittest.expectedFailure # TODO: RUSTPYTHON; AssertionError: Lists differ: [] != ['a', 'b', 'internal', 'kw', 'other_internal', 'some_var', 'var', 'x']
251250
def test_function_info(self):
252251
func = self.spam
253252
self.assertEqual(sorted(func.get_parameters()), ["a", "b", "kw", "var"])
@@ -256,7 +255,6 @@ def test_function_info(self):
256255
self.assertEqual(sorted(func.get_globals()), ["bar", "glob", "some_assigned_global_var"])
257256
self.assertEqual(self.internal.get_frees(), ("x",))
258257

259-
@unittest.expectedFailure # TODO: RUSTPYTHON
260258
def test_globals(self):
261259
self.assertTrue(self.spam.lookup("glob").is_global())
262260
self.assertFalse(self.spam.lookup("glob").is_declared_global())
@@ -275,15 +273,13 @@ def test_nonlocal(self):
275273
expected = ("some_var",)
276274
self.assertEqual(self.other_internal.get_nonlocals(), expected)
277275

278-
@unittest.expectedFailure # TODO: RUSTPYTHON
279276
def test_local(self):
280277
self.assertTrue(self.spam.lookup("x").is_local())
281278
self.assertFalse(self.spam.lookup("bar").is_local())
282279
# Module-scope globals are both global and local
283280
self.assertTrue(self.top.lookup("some_non_assigned_global_var").is_local())
284281
self.assertTrue(self.top.lookup("some_assigned_global_var").is_local())
285282

286-
@unittest.expectedFailure # TODO: RUSTPYTHON
287283
def test_free(self):
288284
self.assertTrue(self.internal.lookup("x").is_free())
289285

@@ -328,7 +324,6 @@ def test_assigned(self):
328324
self.assertTrue(self.Mine.lookup("a_method").is_assigned())
329325
self.assertFalse(self.internal.lookup("x").is_assigned())
330326

331-
@unittest.expectedFailure # TODO: RUSTPYTHON; IndexError: list index out of range
332327
def test_annotated(self):
333328
st1 = symtable.symtable('def f():\n x: int\n', 'test', 'exec')
334329
st2 = st1.get_children()[1]
@@ -493,7 +488,6 @@ def test_symtable_repr(self):
493488
self.assertEqual(str(self.top), "<SymbolTable for module ?>")
494489
self.assertEqual(str(self.spam), "<Function SymbolTable for spam in ?>")
495490

496-
@unittest.expectedFailure # TODO: RUSTPYTHON; AssertionError: AssertionError: "<symbol 'glob': 0, DEF_GLOBAL>" != "<symbol 'glob': GLOBAL_IMPLICIT, USE>"
497491
def test_symbol_repr(self):
498492
self.assertEqual(repr(self.spam.lookup("glob")),
499493
"<symbol 'glob': GLOBAL_IMPLICIT, USE>")

crates/vm/src/stdlib/_symtable.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,9 @@ mod _symtable {
185185
fn symbols(&self, vm: &VirtualMachine) -> PyDictRef {
186186
let dict = vm.ctx.new_dict();
187187
for (name, symbol) in &self.symtable.symbols {
188-
dict.set_item(name, vm.new_pyobj(symbol.flags.bits()), vm)
189-
.unwrap();
188+
let packed_flags =
189+
i32::from(symbol.flags.bits()) | (symbol.scope.as_i32() << SCOPE_OFFSET);
190+
dict.set_item(name, vm.new_pyobj(packed_flags), vm).unwrap();
190191
}
191192
dict
192193
}

0 commit comments

Comments
 (0)