fix(allocator): move allocation tracking into Bump#21342
Conversation
Merging this PR will not alter performance
Comparing Footnotes
|
There was a problem hiding this comment.
Pull request overview
This PR moves arena allocation/reallocation tracking from Allocator into the underlying Bump, removing the previous unsound offset-based approach and centralizing accounting at the point where allocations actually occur (used by tasks/track_memory_allocations).
Changes:
- Add allocation stats storage and recording directly inside
Bump(including realloc-specific adjustments). - Remove allocation tracking fields/offset hacks and per-API manual recording from
Allocator/Allocpaths. - Update the
track_memory_allocationssnapshot to reflect corrected allocation counts.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tasks/track_memory_allocations/allocs_parser.snap | Updates expected allocation counts in the snapshot output. |
| crates/oxc_allocator/src/tracking.rs | Removes unsound stats access and delegates stats retrieval via Bump. |
| crates/oxc_allocator/src/bump.rs | Stores AllocationStats in Bump and records alloc/realloc events centrally. |
| crates/oxc_allocator/src/allocator.rs | Removes AllocationStats from Allocator and simplifies constructors/reset. |
| crates/oxc_allocator/src/alloc.rs | Removes unsound tracking hooks from the Alloc trait implementation. |
Merge activity
|
Previously we tracked allocations (`just allocs`) using unsound code in `Allocator`. That was necessary previously because we used `bumpalo` as the underlying allocator. Now we have control of `Bump`, we can remove this unsoundness, and just track allocations directly in `Bump`. This also fixes some places where allocations failed to be counted. Unclear exactly where that discrepancy comes from, but likely from some route into `Bump` which went via `allocator_api2::Allocator` or `Alloc` traits. Now that tracking is centralized in `Bump` where the allocations actually occur, it's much simpler to ensure they're counted correctly.
…l` function (#21341) Pure refactor. Add a helper function `Bump::new_impl`which creates a `Bump`. Use that helper instead of constructing `Bump`s directly in various places. This has little benefit in itself, but reduces the amount of repeated code required to move allocation tracking into `Bump` (next PR #21342).
ecc4100 to
9129a0a
Compare
15bda35 to
b43250a
Compare
### 💥 BREAKING CHANGES - 36cdc31 str: [**BREAKING**] Remove identity `FromIn` impl for `Ident` (#21251) (overlookmotel) - 382958a span: [**BREAKING**] Remove re-exports of string types from `oxc_span` crate (#21246) (overlookmotel) - c4aedfa str: [**BREAKING**] Add `static_ident!` macro (#21245) (overlookmotel) ### 🚀 Features - e7e1aea transformer/typescript: Add `optimize_enums` option for regular enum inlining (#20539) (Dunqing) - 679f57f transformer/typescript: Implement const enum inlining and declaration removal (#20508) (Dunqing) - 6dd061c semantic: Extend `MemberWriteTarget` to cover all property modification patterns (#21205) (Dunqing) - f134e24 minifier: Support `property_write_side_effects` option to drop unused property assignments (#20773) (Dunqing) - 75663c0 semantic: Add enum member value evaluation for const enum support (#20602) (Dunqing) - 3cfe8ed semantic: Add `MemberWriteTarget` flag to `ReferenceFlags` (#20772) (Dunqing) ### 🐛 Bug Fixes - af1a586 transformer/class-properties: Use correct property name when converting parameter properties (#21268) (Amal Jossy) - b43250a allocator: Move allocation tracking into `Bump` (#21342) (overlookmotel) - 36f505f allocator: `StringBuilder` use `Allocator::alloc_layout` (#21340) (overlookmotel) - 7a08a6f allocator: Fix allocation counting in `Allocator::alloc_concat_strs_array` (#21336) (overlookmotel) - 2338e28 ecmascript: Treat `this` as potentially having side effects (#21297) (sapphi-red) - bd8bd39 allocator: Remove unsafe hacks from `from_raw_parts` methods (#21283) (overlookmotel) - 8f4c340 allocator: Remove dangerous pointer const to mut cast (#21279) (overlookmotel) - aa9259f parser: Add missing error code for optional param diagnostic (#21258) (camc314) - 04b3c2f str: Fix unsound casting const pointers to mut pointers (#21242) (overlookmotel) - ceadf6c str: Make `Ident::from_raw` an unsafe function (#21241) (overlookmotel) - eab13b3 transformer/decorators: Avoid accessor storage name collisions (#21106) (Dunqing) - 07e8a30 transformer/react-refresh: Handle parenthesized variable initializers (#21047) (camc314) ### ⚡ Performance - c3ca6f6 allocator: `StringBuilder::from_strs_array_in` check for 0 length earlier (#21338) (overlookmotel) - c2422bb allocator: `Allocator::alloc_concat_strs_array` check for 0 length earlier (#21337) (overlookmotel) - 04b0fdc allocator: Mark `Allocator::alloc_layout` as `#[inline(always)]` (#21335) (overlookmotel) - 17aee9e allocator: Use `offset_from_unsigned` in `ChunkFooter::as_raw_parts` (#21280) (overlookmotel) - 61adedd minifier: Fix O(n²) perf on very many var decls (#21062) (Gunnlaugur Thor Briem) - addcd02 napi/parser, linter/plugins: Raw transfer deserializer for `Vec`s use shift instead of multiply where possible (#21142) (overlookmotel) - 3068ded napi/parser, linter/plugins: Shift before add when calculating positions in raw transfer deserializer (#21141) (overlookmotel) - eb400b8 napi/parser, linter/plugins: Remove `uint32` buffer view (#21140) (overlookmotel) - 2675085 napi/parser: Lazy deserialization use only `Int32Array` (#21139) (overlookmotel) - 5b35a53 napi/parser: Deserializing tokens use only `int32` array (#21138) (overlookmotel) - f163d10 parser: Tokens raw deserialization use `Int32Array` (#21137) (overlookmotel) - 7a86613 linter/plugins: Use `Int32Array`s for tokens and comments buffers (#21136) (overlookmotel) - 8c51121 napi/parser, linter/plugins: Raw transfer deserialize `Span` fields as `i32`s (#21135) (overlookmotel) - bc1bcdd napi/parser, linter/plugins: Inline trivial raw transfer field deserializers into node object definitions (#21134) (overlookmotel) - c0278ab napi/parser, linter/plugins: Use `Int32Array` in raw transfer deserializer (#21132) (overlookmotel) - 43482c7 linter/plugins: Use `>>` not `>>>` in binary search loops (#21129) (overlookmotel) ### 📚 Documentation - f5e1845 allocator: Upgrade headers in doc comments for `Bump` (#21263) (overlookmotel) - 2870174 allocator: Upper case `SAFETY` in comments (#21253) (overlookmotel) - 01bc269 str: Reformat `Ident` doc comments (#21240) (overlookmotel) - dd47359 allocator: Add doc comments for panics and errors (#21230) (overlookmotel)

Previously we tracked allocations (
just allocs) using unsound code inAllocator. That was necessary previously because we usedbumpaloas the underlying allocator. Now we have control ofBump, we can remove this unsoundness, and just track allocations directly inBump.This also fixes some places where allocations failed to be counted. Unclear exactly where that discrepancy comes from, but likely from some route into
Bumpwhich went viaallocator_api2::AllocatororAlloctraits. Now that tracking is centralized inBumpwhere the allocations actually occur, it's much simpler to ensure they're counted correctly.