-
Notifications
You must be signed in to change notification settings - Fork 137
Introduce ProjectField trait
#2886
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
base: main
Are you sure you want to change the base?
Conversation
Summary of ChangesHello @jswrenn, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request introduces the Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces a new unsafe trait ProjectField to facilitate invariant-respecting projections over Ptrs. The new trait is well-defined and documented. My review includes a suggestion to correct a minor inconsistency in the documentation for the project method, where the parameter name used in the comments differs from the one in the function signature. Aligning these will improve clarity, which is crucial for an unsafe trait.
7261c75 to
30859f4
Compare
bb6f84e to
c6f7382
Compare
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #2886 +/- ##
==========================================
- Coverage 91.90% 91.71% -0.19%
==========================================
Files 20 20
Lines 5877 5903 +26
==========================================
+ Hits 5401 5414 +13
- Misses 476 489 +13 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
c6f7382 to
dc4cfc8
Compare
c37d1c9 to
105108b
Compare
dc4cfc8 to
dbdce80
Compare
4c71ea4 to
7850e9f
Compare
dbdce80 to
16c5cd9
Compare
e9aba20 to
3389089
Compare
3389089 to
0ea7f5e
Compare
9ee7b9e to
86ed3f5
Compare
86ed3f5 to
0208eba
Compare
| unsafe { #core::ptr::addr_of_mut!((*slf).#ident) } | ||
| unsafe { #zerocopy_crate::util::macro_util::core_reexport::ptr::addr_of_mut!((*slf).#ident) } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Revert this?
| let fields_preserve_alignment = StructUnionRepr::from_attrs(&ctx.ast.attrs) | ||
| .map(|repr| repr.get_packed().is_none()) | ||
| .unwrap(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Move this to the else if matches!(&ctx.ast.data, Data::Struct(..)) branch below since it's only used there?
|
/gemini review |
This trait powers invariant-respecting projection over `Ptr`s. gherrit-pr-id: Gb6fa34cec5080caffa0980ed1d3e1ae273550f44
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
The pull request introduces the ProjectField trait, which is a significant and positive change for invariant-respecting projection over Ptrs. This refactoring allows for more granular control and safety guarantees when projecting fields, especially with fallible projections. The introduction of the into_inner! macro for infallible Result unwrapping is also a good addition.
| invariants: parse_quote!((Aliasing, Alignment, #zerocopy_crate::invariant::Initialized)), | ||
| }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The ProjectField implementation for enum fields uses (Aliasing, Alignment, #zerocopy_crate::invariant::Initialized) for type Invariants. This means that projecting an enum field will always result in an Initialized pointer, even if the original Ptr had Valid invariants and the field itself is Valid. This could lead to a loss of the stronger Valid invariant, which might be an unnecessary restriction or potentially incorrect if Valid could be preserved.
| invariants: parse_quote!((Aliasing, Alignment, #zerocopy_crate::invariant::Initialized)), | |
| }, | |
| invariants: parse_quote!((Aliasing, Alignment, I::Validity)), |
| // `Initialized`, so too is the validity of its fields. | ||
| type Invariants = (Aliasing, #alignment, #zerocopy_crate::invariant::Initialized); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Similar to the enum field projection, the ProjectField implementation for struct fields also uses (Aliasing, #alignment, #zerocopy_crate::invariant::Initialized) for type Invariants. This has the same potential issue of losing the Valid invariant if the original Ptr was Valid and the field is also Valid. The invariant propagation should ideally preserve the strongest possible validity.
| // `Initialized`, so too is the validity of its fields. | |
| type Invariants = (Aliasing, #alignment, #zerocopy_crate::invariant::Initialized); | |
| type Invariants = (Aliasing, #alignment, I::Validity); |
| unsafe { self.cast_unchecked::<_, C>() } | ||
| } | ||
|
|
||
| // FIXME(#196): Support all validity invariants (not just those that are |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please fix.
0208eba to
7f5262d
Compare
| /// Is the given field projectable from `ptr`? | ||
| /// | ||
| /// This method must be overriden if the field's projectability depends on | ||
| /// the value of the bytes in `ptr`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Update these docs (and maybe the name of the name of the method) given the new signature (which returns Ptr in the Ok variant)?
joshlf
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please resolve remaining comments before merging.
This trait powers invariant-respecting projection over
Ptrs.invariant::Validtoinvariant::Safe#2913ProjectFieldtrait #2886Latest Update: v21 — Compare vs v20
📚 Full Patch History
Links show the diff between the row version and the column version.