-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Closed
Labels
A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsArea: Documentation for any part of the project, including the compiler, standard library, and toolsE-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.Call for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.
Description
Lines 1 to 27 in a605441
//! The AST pointer. | |
//! | |
//! Provides `P<T>`, a frozen owned smart pointer, as a replacement for `@T` in | |
//! the AST. | |
//! | |
//! # Motivations and benefits | |
//! | |
//! * **Identity**: sharing AST nodes is problematic for the various analysis | |
//! passes (e.g., one may be able to bypass the borrow checker with a shared | |
//! `ExprKind::AddrOf` node taking a mutable borrow). The only reason `@T` in the | |
//! AST hasn't caused issues is because of inefficient folding passes which | |
//! would always deduplicate any such shared nodes. Even if the AST were to | |
//! switch to an arena, this would still hold, i.e., it couldn't use `&'a T`, | |
//! but rather a wrapper like `P<'a, T>`. | |
//! | |
//! * **Immutability**: `P<T>` disallows mutating its inner `T`, unlike `Box<T>` | |
//! (unless it contains an `Unsafe` interior, but that may be denied later). | |
//! This mainly prevents mistakes, but can also enforces a kind of "purity". | |
//! | |
//! * **Efficiency**: folding can reuse allocation space for `P<T>` and `Vec<T>`, | |
//! the latter even when the input and output types differ (as it would be the | |
//! case with arenas or a GADT AST using type parameters to toggle features). | |
//! | |
//! * **Maintainability**: `P<T>` provides a fixed interface - `Deref`, | |
//! `and_then` and `map` - which can remain fully functional even if the | |
//! implementation changes (using a special thread-local heap, for example). | |
//! Moreover, a switch to, e.g., `P<'a, T>` would be easy and mostly automated. |
The comments are quite old and probably need some small updates to reflect @T
having been removed from the language.
This issue has been assigned to @matthew-healy via this comment.
Metadata
Metadata
Assignees
Labels
A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsArea: Documentation for any part of the project, including the compiler, standard library, and toolsE-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.Call for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.