| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
WalkthroughThe pull request modifies object and type construction in RustPython. It replaces a hardcoded object-type check with a HAS_DICT flag check for dict allocation, inherits HAS_DICT from all bases in the MRO during type creation, introduces Python name mangling for private slot attributes, and adds new __slots__ and __init_subclass__ methods to the typing.Generic class. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes
Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
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. ❤️ ShareComment @coderabbitai help to get the list of available commands and usage tips. |
Sorry, something went wrong.
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)crates/vm/src/builtins/type.rs (1)📜 Review details1798-1808: Handle edge case when class name consists entirely of underscores.
When class_name consists only of underscores (e.g., _, __, ___), trim_start_matches('_') returns an empty string. This causes the code to produce "___x" for a name like "__x" in such a class, which diverges from CPython's behavior—CPython does not mangle names in classes whose names consist only of underscores and returns the original name unchanged.
Add a check after stripping the leading underscores:
fn mangle_name(class_name: &str, name: &str) -> String { // Only mangle names starting with __ and not ending with __ if !name.starts_with("__") || name.ends_with("__") || name.contains('.') { return name.to_string(); } // Strip leading underscores from class name let class_name = class_name.trim_start_matches('_'); + if class_name.is_empty() { + return name.to_string(); + } format!("_{}{}", class_name, name) }
Configuration used: Path: .coderabbit.yml
Review profile: CHILL
Plan: Pro
📥 CommitsReviewing files that changed from the base of the PR and between 98fff96 and 8718dc4.
⛔ Files ignored due to path filters (10)📄 CodeRabbit inference engine (.github/copilot-instructions.md)
**/*.rs: Follow the default rustfmt code style by running cargo fmt to format Rust code
Always run clippy to lint Rust code (cargo clippy) before completing tasks and fix any warnings or lints introduced by 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:
Learnt from: CR Repo: RustPython/RustPython PR: 0 File: .github/copilot-instructions.md:0-0 Timestamp: 2025-11-29T12:17:28.606Z Learning: Applies to **/*.rs : Use the macro system (`pyclass`, `pymodule`, `pyfunction`, etc.) when implementing Python functionality in Rust
Applied to files:
crates/vm/src/builtins/type.rs (3)crates/vm/src/builtins/object.rs (1)310-317: LGTM! Correct HAS_DICT inheritance from MRO.
The change from checking only the first base to checking any base in the MRO aligns with CPython's behavior. If any base class in the MRO has HAS_DICT, the subclass should inherit it too since it needs to support instance dictionaries from any base.
1188-1213: LGTM! Name mangling correctly applied to slot-backed member descriptors.
The implementation properly:
- Extracts the class name before processing slots
- Applies mangling to each slot attribute name
- Uses the mangled name consistently for both the PyMemberDef and the attribute key on the type
This matches CPython's behavior where __x in __slots__ becomes _ClassName__x as the actual attribute.
1233-1246: LGTM! Correct conditional addition of __dict__ descriptor.
The updated condition ensures the __dict__ descriptor is only added when:
- The base is not type (type subclasses inherit __dict__ from type)
- The class has the HAS_DICT flag (meaning __slots__ was not defined, or __dict__ was explicitly in __slots__)
This correctly implements the __slots__ xor __dict__ semantics.
crates/vm/src/stdlib/typevar.rs (3)69-79: LGTM! Dict creation now driven by HAS_DICT flag.
The change correctly ties instance dict creation to the HAS_DICT flag rather than a hardcoded type check. This ensures:
- Classes with __slots__ (no __dict__ in slots) → no instance dict
- Classes without __slots__ or with __dict__ in __slots__ → instance dict created
This aligns with the type initialization changes and properly implements Python's __slots__ semantics.
3-3: LGTM!
The Context import is required for the new __slots__ method signature.
975-978: LGTM! Empty __slots__ on Generic matches CPython.
Defining __slots__ = () on Generic prevents instances from having an instance dictionary, which is the expected behavior for this typing construct. Using #[pyattr] correctly defines this as a class attribute.
986-988: LGTM! __init_subclass__ delegation to typing module.
The implementation correctly delegates to _generic_init_subclass in the typing module, consistent with the existing __class_getitem__ pattern and CPython's behavior for handling Generic subclass initialization.
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.