Skip to content

Add symtable.py from 3.13.5 #6048

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Aug 1, 2025
Merged

Conversation

ShaharNaveh
Copy link
Contributor

@ShaharNaveh ShaharNaveh commented Jul 29, 2025

Summary by CodeRabbit

  • New Features

    • Added a comprehensive set of symbol and scope constants to the symbol table module, now accessible as Python attributes.
  • Refactor

    • Simplified the PySymbolTable interface by replacing several explicit methods with Python-style properties.
    • Renamed and adjusted properties for easier access to attributes like name, type, line number, children, identifiers, symbols, nested status, and a new id property.
  • Chores

    • Updated the module registration name from "symtable" to "_symtable".

Copy link
Contributor

coderabbitai bot commented Jul 29, 2025

Walkthrough

The changes update the symbol table module in the standard library. The module's registration key is renamed from "symtable" to "_symtable". The PySymbolTable class is refactored to use property getters instead of explicit methods, adds symbol table constants, and removes or renames several methods to align with Python conventions.

Changes

Cohort / File(s) Change Summary
Module Registration Key Update
vm/src/stdlib/mod.rs
Renamed the symbol table module registration key from "symtable" to "_symtable" in the standard library initialization map.
Symbol Table Refactor & Constants
vm/src/stdlib/symtable.rs
Added symbol and scope constants reflecting CPython internals; refactored PySymbolTable to use Python-style property getters instead of explicit methods; removed methods like lookup and has_children; added new properties including id, nested, children, identifiers, and symbols; changed method signatures and names for consistency.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Poem

In the warren where symbols dwell,
A rabbit hops with tales to tell.
Properties bloom where methods once grew,
Constants abound, all shiny and new.
"_symtable" whispers with pride—
Refactored and tidy, with nothing to hide!
🐇✨

Note

⚡️ Unit Test Generation is now available in beta!

Learn more here, or try it out under "Finishing Touches" below.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Member

@youknowone youknowone left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did we have test_symtable but no symtable.py? How did it work before?


Alias = find_block(top, "Alias")
GenericAlias = find_block(top, "GenericAlias")
# TODO(RUSTPYTHON)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# TODO(RUSTPYTHON)
# XXX: RUSTPYTHON

We don't have a strict rule for this, but conventionally using this to distinguish local patch from failing tests.

# U = find_block(GenericMine, "U")


# TODO(RUSTPYTHON)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# TODO(RUSTPYTHON)
# TODO: RUSTPYTHON

The notation itself looks good.
But we use search tools for this comment. Keeping consistency will be helpful

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Old habits die hard 😅

@ShaharNaveh
Copy link
Contributor Author

Did we have test_symtable but no symtable.py?

Correct

How did it work before?

We had implemented symtable.py in rust:)


# TODO: RUSTPYTHON
@unittest.expectedFailure
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we had test-passing symtable before, can these tests be easily fixed?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think so, I think the main issue is that "symbols" attribute used to return a list, now it's a dict. I'll investigate a bit more about the structure. For now I'll set the PR as a draft

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you so much!

Copy link
Contributor Author

@ShaharNaveh ShaharNaveh Jul 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now more tests pass. But we still have a difference between our impl and cpython. but this is a change that needs to be made at compiler/codegen/src/symboltable.rs, I think it's a bit out of scope for this PR. I'll try to do a followup PR to fix it

@ShaharNaveh ShaharNaveh marked this pull request as draft July 30, 2025 12:35
@ShaharNaveh ShaharNaveh marked this pull request as ready for review July 30, 2025 16:43
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: .coderabbit.yml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 09a7fcf and 16f7737.

⛔ Files ignored due to path filters (1)
  • Lib/test/test_symtable.py is excluded by !Lib/**
📒 Files selected for processing (1)
  • vm/src/stdlib/symtable.rs (3 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.rs

📄 CodeRabbit Inference Engine (.github/copilot-instructions.md)

**/*.rs: Follow the default rustfmt code style (cargo fmt to format)
Always run clippy to lint code (cargo clippy) before completing tasks. Fix any warnings or lints that are introduced by your changes
Follow Rust best practices for error handling and memory management
Use the macro system (pyclass, pymodule, pyfunction, etc.) when implementing Python functionality in Rust

Files:

  • vm/src/stdlib/symtable.rs
🧠 Learnings (1)
vm/src/stdlib/symtable.rs (3)

Learnt from: moreal
PR: #5847
File: vm/src/stdlib/stat.rs:547-567
Timestamp: 2025-06-27T14:47:28.810Z
Learning: In RustPython's stat module implementation, platform-specific constants like SF_SUPPORTED and SF_SYNTHETIC should be conditionally declared only for the platforms where they're available (e.g., macOS), following CPython's approach of optional declaration using #ifdef checks rather than providing fallback values for other platforms.

Learnt from: moreal
PR: #5847
File: vm/src/stdlib/stat.rs:547-567
Timestamp: 2025-06-27T14:47:28.810Z
Learning: In RustPython's stat module implementation, platform-specific constants like SF_SUPPORTED and SF_SYNTHETIC should be conditionally declared only for the platforms where they're available (e.g., macOS), following CPython's approach of optional declaration rather than providing fallback values for other platforms.

Learnt from: CR
PR: RustPython/RustPython#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-07-19T03:16:56.511Z
Learning: Applies to **/*.rs : Use the macro system (pyclass, pymodule, pyfunction, etc.) when implementing Python functionality in Rust

🔇 Additional comments (4)
vm/src/stdlib/symtable.rs (4)

5-11: LGTM!

The import additions are appropriate for the new functionality - PyDictRef supports the symbols property and the explicit compiler import improves code clarity.


13-105: Excellent alignment with CPython's symtable constants.

The comprehensive set of constants mirrors CPython's internal symtable definitions, ensuring compatibility. The bit-shifting patterns and flag combinations are mathematically correct and follow established conventions.


144-184: Excellent refactoring to Python-style properties.

The conversion from explicit methods to properties using #[pygetset] aligns perfectly with Python conventions. The use of #[pygetset(name = "type")] properly handles Rust keyword conflicts.


186-194: Clean implementation of symbols property.

The new symbols property correctly creates a dictionary mapping symbol names to their flag bits, providing a proper Python-style interface to the symbol information.

Comment on lines +170 to 173
#[pygetset]
fn id(&self) -> usize {
self as *const Self as *const std::ffi::c_void as usize
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Consider security implications of exposing memory addresses.

The id property exposes raw memory addresses, which could potentially be used for memory layout attacks or information disclosure in security-sensitive contexts.

Consider whether this aligns with CPython's behavior and if there are security implications for your use case:


🌐 Web query:

What does Python's symtable SymbolTable.id property return and are there security considerations?

💡 Result:

The id property (retrievable via get_id()) of Python's symtable.SymbolTable returns the table’s identifier, which is an internal value associated with that specific symbol table instance[1][2][5][6]. This identifier is primarily intended for internal use, such as distinguishing between different symbol table objects generated during code analysis.

Details:

  • What does get_id() return?

    • The value returned by SymbolTable.get_id() is an identifier for that block's symbol table instance. It does not return the name of the function, class, or module—that is provided by get_name(). Instead, it gives an ID unique to the table, but published documentation does not specify if this is guaranteed to be globally unique, stable between runs, or even meaningful outside the context of the current symbol table introspection session[1][2][5][6].
    • Source-level guides and sample code (see [6]) show the use of get_id() alongside type and name to help programmers identify and differentiate symbol tables while traversing nested scopes.
  • Security considerations:

    • There is no evidence in official documentation that the id or the value returned by get_id() contains sensitive information such as memory addresses, code contents, or pointers to user data[1][2][5][6].
    • However, since this is an internal identifier of a compiler structure, it is conceivable (though not specified) that in some Python implementations or versions, this ID could reveal patterns such as traversal order, or, hypothetically, even leak implementation details if misused.
    • In regular usage (introspecting Python source structures for tooling or analysis), exposure of the symbol table ID should not represent a direct security vulnerability, but best practice is to treat all such internal or undocumented identifiers as an implementation detail—do not expose them in sensitive contexts (such as web output, logs with user data, etc.) unless necessary.

Summary Table of Relevant SymbolTable Methods:

Method Purpose
get_id() Returns the symbol table's internal identifier
get_name() Returns the name of the scope (top for module, function/class name otherwise)
get_type() Returns the table's type ('module', 'class', or 'function')
get_lineno() Returns the first line number of the scope

If you require a value that is stable and reveals no internal information, prefer using get_name() or a custom mapping on your analysis layer instead of exposing the value from get_id().

References:
[1][2][5][6]: Python's official symtable module documentation and tutorials.

Citations:


Align SymbolTable.id() with CPython’s get_id(): avoid exposing raw pointers

The current implementation in vm/src/stdlib/symtable.rs returns the struct’s memory address as a usize, which diverges from CPython’s symtable.SymbolTable.get_id() (an internal, opaque identifier) and can leak pointer layouts.

Suggested changes:

  • Replace the pointer cast in fn id(&self) -> usize with a dedicated, incrementing identifier (e.g., an AtomicUsize counter or per‐table UID stored on creation).
  • Ensure IDs are unique within a run but do not expose raw addresses.
  • Update documentation to note that id() returns an internal symbol-table ID, not a memory address.

Locations to update:

  • vm/src/stdlib/symtable.rs, lines ~170–173 (the fn id(&self) definition)

Example diff sketch:

-   #[pygetset]
-   fn id(&self) -> usize {
-       self as *const Self as *const std::ffi::c_void as usize
-   }
+   // Use an internal counter instead of raw pointer to avoid leaking memory addresses
+   #[pygetset]
+   fn id(&self) -> usize {
+       self.inner_id  // populated from a global AtomicUsize at creation
+   }

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In vm/src/stdlib/symtable.rs around lines 170 to 173, the id() method currently
returns the raw memory address cast to usize, which exposes internal pointer
details and differs from CPython's opaque get_id(). To fix this, replace the
pointer cast with a unique internal identifier generated via a static
AtomicUsize counter incremented for each new SymbolTable instance or assign a
unique ID at creation stored in the struct. Update the id() method to return
this stored unique ID instead of the pointer. Also, revise the method's
documentation to clarify that id() returns an internal symbol table identifier,
not a memory address.

@ShaharNaveh ShaharNaveh requested a review from youknowone July 31, 2025 15:15
Comment on lines -66 to -76
#[pymethod]
const fn is_nested(&self) -> bool {
self.symtable.is_nested
}

#[pymethod]
const fn is_optimized(&self) -> bool {
matches!(
self.symtable.typ,
CompilerScope::Function | CompilerScope::AsyncFunction
)
Copy link
Member

@youknowone youknowone Aug 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's not delete these methods but change to getset, just like get_name and get_lineno.
Unlike other more complex cases, the deletion of these 2 methods cause unnecessary regression.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix this. And made type to return an int instead of a String, so now more tests pass

@ShaharNaveh ShaharNaveh requested a review from youknowone August 1, 2025 09:37
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
vm/src/stdlib/symtable.rs (1)

181-184: Security concern with id() method exposing raw memory addresses.

The id() method returns raw memory addresses, which could potentially be used for memory layout attacks or information disclosure in security-sensitive contexts.

📜 Review details

Configuration used: .coderabbit.yml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 16f7737 and e66d264.

⛔ Files ignored due to path filters (1)
  • Lib/test/test_symtable.py is excluded by !Lib/**
📒 Files selected for processing (1)
  • vm/src/stdlib/symtable.rs (3 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.rs

📄 CodeRabbit Inference Engine (.github/copilot-instructions.md)

**/*.rs: Follow the default rustfmt code style (cargo fmt to format)
Always run clippy to lint code (cargo clippy) before completing tasks. Fix any warnings or lints that are introduced by your changes
Follow Rust best practices for error handling and memory management
Use the macro system (pyclass, pymodule, pyfunction, etc.) when implementing Python functionality in Rust

Files:

  • vm/src/stdlib/symtable.rs
🧠 Learnings (3)
📚 Learning: in rustpython's stat module implementation, platform-specific constants like sf_supported and sf_syn...
Learnt from: moreal
PR: RustPython/RustPython#5847
File: vm/src/stdlib/stat.rs:547-567
Timestamp: 2025-06-27T14:47:28.810Z
Learning: In RustPython's stat module implementation, platform-specific constants like SF_SUPPORTED and SF_SYNTHETIC should be conditionally declared only for the platforms where they're available (e.g., macOS), following CPython's approach of optional declaration using #ifdef checks rather than providing fallback values for other platforms.

Applied to files:

  • vm/src/stdlib/symtable.rs
📚 Learning: in rustpython's stat module implementation, platform-specific constants like sf_supported and sf_syn...
Learnt from: moreal
PR: RustPython/RustPython#5847
File: vm/src/stdlib/stat.rs:547-567
Timestamp: 2025-06-27T14:47:28.810Z
Learning: In RustPython's stat module implementation, platform-specific constants like SF_SUPPORTED and SF_SYNTHETIC should be conditionally declared only for the platforms where they're available (e.g., macOS), following CPython's approach of optional declaration rather than providing fallback values for other platforms.

Applied to files:

  • vm/src/stdlib/symtable.rs
📚 Learning: applies to **/*.rs : use the macro system (`pyclass`, `pymodule`, `pyfunction`, etc.) when implement...
Learnt from: CR
PR: RustPython/RustPython#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-07-19T03:16:56.511Z
Learning: Applies to **/*.rs : Use the macro system (`pyclass`, `pymodule`, `pyfunction`, etc.) when implementing Python functionality in Rust

Applied to files:

  • vm/src/stdlib/symtable.rs
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (11)
  • GitHub Check: Check the WASM package and demo
  • GitHub Check: Run tests under miri
  • GitHub Check: Run snippets and cpython tests (ubuntu-latest)
  • GitHub Check: Run rust tests (windows-latest)
  • GitHub Check: Run snippets and cpython tests (macos-latest)
  • GitHub Check: Ensure compilation on various targets
  • GitHub Check: Run snippets and cpython tests (windows-latest)
  • GitHub Check: Check Rust code with rustfmt and clippy
  • GitHub Check: Run rust tests (macos-latest)
  • GitHub Check: Run snippets and cpython tests on wasm-wasi
  • GitHub Check: Run rust tests (ubuntu-latest)
🔇 Additional comments (5)
vm/src/stdlib/symtable.rs (5)

149-152: LGTM! Method to property conversion aligns with feedback.

Converting get_name to a name property using #[pygetset] aligns well with the previous review feedback to use getset instead of deleting methods.


171-179: LGTM! Children property correctly replaces get_children method.

The children property properly converts sub-tables to Python objects and aligns with the goal of using properties instead of explicit methods.


186-195: LGTM! Identifiers property conversion is appropriate.

Converting get_identifiers to an identifiers property maintains the same functionality while following the property-based interface pattern.


207-210: LGTM! Nested property appropriately replaces is_nested method.

The nested property correctly exposes the symbol table's nested status, following the pattern established by other property conversions.


15-110: Constants section matches CPython internal definitions

The bit shifts and composite values (e.g. DEF_BOUND, SCOPE_MASK) exactly mirror those in CPython’s pycore_symtable.h. No changes needed here.

Comment on lines +154 to 163
#[pygetset(name = "type")]
fn typ(&self) -> i32 {
match self.symtable.typ {
CompilerScope::Function => TYPE_FUNCTION,
CompilerScope::Class => TYPE_CLASS,
CompilerScope::Module => TYPE_MODULE,
CompilerScope::TypeParams => TYPE_TYPE_PARAMETERS,
_ => -1, // TODO: missing types from the C implementation
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify integer constant mapping for type property.

The typ() method now returns integer constants instead of strings, which is a significant interface change. The mapping looks reasonable, but the fallback to -1 for unhandled cases may not align with CPython's behavior.


🏁 Script executed:

#!/bin/bash
# Check CPython's SymbolTable.get_type() return values
python3 -c "
import symtable
st = symtable.symtable('def f(): pass', '<string>', 'exec')
print('Module type:', repr(st.get_type()))
for child in st.get_children():
    print('Function type:', repr(child.get_type()))
"

Length of output: 297


Ensure type property matches CPython’s string-based API

CPython’s SymbolTable.get_type() returns strings like "module" and "function", not integer codes. Our Rust typ() currently returns integer constants and falls back to -1 for any unhandled cases, which:

  • Breaks compatibility with existing users expecting string values
  • Omits several type names (e.g. comprehensions, lambdas, generators) that CPython exposes

Please update the implementation to either:

  • Return Python strings matching CPython’s names, or
  • If you intentionally switch to integers, document the change clearly and replace the -1 fallback with a dedicated TYPE_UNKNOWN constant—and add mappings for all types in CPython’s C implementation.

Points to address:

  • Decide on integer vs. string return type and update docs accordingly
  • Remove the // TODO and implement mappings for missing CPython types (generator, lambda, comprehension, etc.)
  • Eliminate the -1 fallback or replace it with a well-defined default constant
🤖 Prompt for AI Agents
In vm/src/stdlib/symtable.rs lines 154 to 163, the typ() function currently
returns integer constants and uses -1 as a fallback, which breaks compatibility
with CPython's string-based SymbolTable.get_type() API and omits several type
names. To fix this, change the return type to Python strings matching CPython's
type names (e.g., "module", "function", "class", "generator", "lambda",
"comprehension"), remove the -1 fallback, and implement mappings for all missing
CPython types. Also update any related documentation to reflect the string
return type and remove the TODO comment.

Comment on lines +197 to 205
#[pygetset]
fn symbols(&self, vm: &VirtualMachine) -> PyResult<PyDictRef> {
let dict = vm.ctx.new_dict();
for (name, symbol) in &self.symtable.symbols {
dict.set_item(name, vm.new_pyobj(symbol.flags.bits()), vm)
.unwrap();
}
Ok(dict)
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Significant interface change: symbols now returns dictionary instead of list.

The symbols property now returns a dictionary mapping symbol names to their flag bits, which is a major change from the previous list-based return. This appears to align better with how symbols are typically accessed.


🏁 Script executed:

#!/bin/bash
# Verify CPython's SymbolTable.get_symbols() return type and structure
python3 -c "
import symtable
st = symtable.symtable('x = 1', '<string>', 'exec')
symbols = st.get_symbols()
print('Type:', type(symbols))
if symbols:
    print('First symbol type:', type(symbols[0]))
    print('First symbol methods:', [m for m in dir(symbols[0]) if not m.startswith('_')])
"

Length of output: 639


Breaking change: symbols now returns dict instead of list

You’ve changed the symbols getter in vm/src/stdlib/symtable.rs (lines 197–205) from a list of Symbol objects to a dict[str, int]. In CPython, symtable.symtable(...).get_symbols() returns a list[Symbol] (each with methods like is_assigned(), get_name(), etc.), not a mapping of names to flag bits.

This will break any existing code that:

  • Iterates over symbols as Symbol instances
  • Calls methods on Symbol objects
  • Relies on the return being a list

Please address this by one of the following:

  • Revert symbols to return PyListRef of Symbol objects (e.g. vm.new_pyobj(symbol)) for compatibility
  • Introduce a new method/property (e.g. symbol_flags) for the dict view, and preserve symbols as the list of Symbol
  • If this breaking change is intentional, update the documentation/changelog to call it out clearly
🤖 Prompt for AI Agents
In vm/src/stdlib/symtable.rs around lines 197 to 205, the symbols getter was
changed to return a dict mapping symbol names to flag bits, but in CPython it
returns a list of Symbol objects. To fix this, revert the symbols method to
return a PyListRef of Symbol objects by creating a list and adding each symbol
object (e.g. using vm.new_pyobj(symbol)) to it, preserving compatibility. If the
dict view is needed, add a new method or property like symbol_flags for that
purpose instead of changing symbols.

Copy link
Member

@youknowone youknowone left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!

@youknowone youknowone merged commit 7f1fc36 into RustPython:main Aug 1, 2025
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants