perf(ast): #[ast] macro use #[repr(transparent)] for single-field structs#17052
Conversation
How to use the Graphite Merge QueueAdd either label to this PR to merge it via the merge queue:
You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. This stack of pull requests is managed by Graphite. Learn more about stacking. |
There was a problem hiding this comment.
Pull request overview
This PR optimizes the #[ast] procedural macro to use #[repr(transparent)] instead of #[repr(C)] for single-field structs. This optimization can improve performance by changing the ABI for passing these structs to functions, potentially using more efficient register allocation.
Key Changes
- The macro now checks the field count and applies
#[repr(transparent)]for single-field structs - Multi-field structs continue to use
#[repr(C)]as before - Updated documentation comment to reflect the new behavior
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
CodSpeed Performance ReportMerging #17052 will not alter performanceComparing Summary
Footnotes
|
|
I'm confident that benchmark changes are just noise. |
Merge activity
|
… structs (#17052) `#[ast]` macro adds `#[repr(C)]` to structs. For structs with a single field, use `#[repr(transparent)]` instead. This does not alter memory layout, but can change the ABI, which can make it more performant to pass such structs to functions in some cases, as it can change the registers used for passing. This will help with making lexer tokens serializable (#17025), since `Token` will have `#[ast]` added to it, and we need it to continue to be `#[repr(transparent)]`.
a499d27 to
1f3b19b
Compare
### 🚀 Features - d209c21 allocator: Add cap to FixedSizeAllocatorPool and block when exhausted (#17023) (Cameron) - fb2af91 allocator: Add bitset utils (#17042) (zhaoting zhou) - c16082c tasks/compat_data: Integrate `node-compat-table` (#16831) (Boshen) - 5586823 span: Extract TS declaration file check to its own function (#17037) (camchenry) - 3d2b492 minifier: Fold iife arrow functions in call expressions (#16477) (Armano) - 67e9f9e codegen: Keep comments on the export specifiers (#16943) (夕舞八弦) - cb515fa parser: Improve error message for `yield` as identifier usage (#16950) (sapphi-red) - dcc856b parser: Add help for `new_dynamic_import` error (#16949) (sapphi-red) - c3c79f8 parser: Improve import attribute value error message (#16948) (sapphi-red) - 291b57b ast_tools: Generate TS declaration files for deserializer and walk files (#16912) (camc314) - 74eae13 minifier: Remove unused import specifiers (#16797) (camc314) ### 🐛 Bug Fixes - fb9e193 linter: OOM problems with custom plugins (#17082) (overlookmotel) - e59132b parser/napi: Fix lazy deser (#17069) (overlookmotel) - a92faf0 ast_tools: Support `u128` in `assert_layouts` generator (#17050) (overlookmotel) - 47b4c2f minifier/docs: Correct hyperlink path in OPTIMIZATIONS.md (#16986) (GRK) - 3002649 transformer/typescript: Remove unused import equals declaration (#16776) (Dunqing) - 5a2af88 regular_expression: Correct named capture group reference error (#16952) (sapphi-red) ### ⚡ Performance - b657bb6 allocator: Reduce time `Mutex` lock is held in `FixedSizeAllocatorPool::get` (#17079) (overlookmotel) - 1f3b19b ast: `#[ast]` macro use `#[repr(transparent)]` for single-field structs (#17052) (overlookmotel) - 225f229 parser: Use SmallVec for duplicate default export detection (#16801) (camc314) ### 📚 Documentation - a9c419f traverse: Update safety comments (#16944) (overlookmotel) Co-authored-by: overlookmotel <[email protected]>

#[ast]macro adds#[repr(C)]to structs. For structs with a single field, use#[repr(transparent)]instead. This does not alter memory layout, but can change the ABI, which can make it more performant to pass such structs to functions in some cases, as it can change the registers used for passing.This will help with making lexer tokens serializable (#17025), since
Tokenwill have#[ast]added to it, and we need it to continue to be#[repr(transparent)].