Skip to content

perf(napi/parser): lazy deserialization use only Int32Array#21139

Merged
graphite-app[bot] merged 1 commit intomainfrom
om/04-07-perf_napi_parser_lazy_deserialization_use_only_int32array_
Apr 7, 2026
Merged

perf(napi/parser): lazy deserialization use only Int32Array#21139
graphite-app[bot] merged 1 commit intomainfrom
om/04-07-perf_napi_parser_lazy_deserialization_use_only_int32array_

Conversation

@overlookmotel
Copy link
Copy Markdown
Member

@overlookmotel overlookmotel commented Apr 7, 2026

Continuation of #21132. Use Int32Array view of the buffer for all code in lazy deserialization. Lazy deserialization is not currently in use, but keeping it in line with the main raw transfer deserializer allows removing the Unint32Array view of the buffer entirely in #21140 without breaking the lazy deserializer tests.

Copy link
Copy Markdown
Member Author

overlookmotel commented Apr 7, 2026


How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • 0-merge - adds this PR to the back of the merge queue
  • hotfix - for urgent changes, fast-track this PR to the front of 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.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR continues the raw-transfer deserialization performance work by aligning the lazy deserializer with the main deserializer’s use of Int32Array reads, reducing reliance on Uint32Array buffer views and preparing for removal of the uint32 view in a follow-up.

Changes:

  • Update the lazy raw-transfer code generator to prefer int32 buffer reads (including Span start/end handling).
  • Switch the lazy runtime entry (lazy.js) to read the root pointer from buffer.int32.
  • Regenerate lazy walk/constructor outputs to use int32 access patterns in most places.

Reviewed changes

Copilot reviewed 2 out of 4 changed files in this pull request and generated 1 comment.

File Description
tasks/ast_tools/src/generators/raw_transfer_lazy.rs Updates the JS code generator to emit int32 reads for lazy raw-transfer deserialization patterns (notably strings/vec/box/option and Span).
napi/parser/src-js/raw-transfer/lazy.js Switches root data pointer load to buffer.int32[...] in the lazy constructor path.
napi/parser/src-js/generated/lazy/walk.js Regenerated walker code to use ast.buffer.int32 instead of uint32.
napi/parser/src-js/generated/lazy/constructors.js Regenerated constructors/getters to use constructI32 for span positions and int32 view in most helpers.

Comment thread tasks/ast_tools/src/generators/raw_transfer_lazy.rs
@overlookmotel overlookmotel force-pushed the om/04-07-perf_napi_parser_lazy_deserialization_use_only_int32array_ branch from 0c6a41f to 952b881 Compare April 7, 2026 16:39
@overlookmotel overlookmotel force-pushed the om/04-07-perf_napi_parser_deserializing_tokens_use_only_int32_array branch from 43fd2d8 to 0493ecf Compare April 7, 2026 16:39
@overlookmotel overlookmotel self-assigned this Apr 7, 2026
@overlookmotel overlookmotel force-pushed the om/04-07-perf_napi_parser_lazy_deserialization_use_only_int32array_ branch from 952b881 to d3816b0 Compare April 7, 2026 16:51
@overlookmotel overlookmotel force-pushed the om/04-07-perf_napi_parser_deserializing_tokens_use_only_int32_array branch from 0493ecf to e9db279 Compare April 7, 2026 16:51
@overlookmotel overlookmotel force-pushed the om/04-07-perf_napi_parser_lazy_deserialization_use_only_int32array_ branch 2 times, most recently from 01fb7e8 to 653387e Compare April 7, 2026 17:05
@graphite-app graphite-app Bot added the 0-merge Merge with Graphite Merge Queue label Apr 7, 2026
@graphite-app
Copy link
Copy Markdown
Contributor

graphite-app Bot commented Apr 7, 2026

Merge activity

  • Apr 7, 5:10 PM UTC: The merge label '0-merge' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • Apr 7, 5:29 PM UTC: graphite-app added this pull request to the Graphite merge queue.
  • Apr 7, 5:43 PM UTC: The Graphite merge queue removed this pull request due to downstack failures on PR #21136.
  • Apr 7, 5:43 PM UTC: The Graphite merge queue removed this pull request due to downstack failures on PR #21136.
  • Apr 7, 11:04 PM UTC: The merge label '0-merge' was removed. This PR will no longer be merged by the Graphite merge queue
  • Apr 7, 11:04 PM UTC: The merge label '0-merge' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • Apr 7, 11:09 PM UTC: overlookmotel added this pull request to the Graphite merge queue.
  • Apr 7, 11:22 PM UTC: Merged by the Graphite merge queue.

@graphite-app graphite-app Bot force-pushed the om/04-07-perf_napi_parser_deserializing_tokens_use_only_int32_array branch from e9db279 to 75fa7e7 Compare April 7, 2026 17:21
@graphite-app graphite-app Bot requested a review from camc314 as a code owner April 7, 2026 17:21
@graphite-app graphite-app Bot force-pushed the om/04-07-perf_napi_parser_lazy_deserialization_use_only_int32array_ branch from 653387e to becba3a Compare April 7, 2026 17:21
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Apr 7, 2026
@overlookmotel overlookmotel force-pushed the om/04-07-perf_napi_parser_lazy_deserialization_use_only_int32array_ branch from becba3a to 5f01dba Compare April 7, 2026 23:03
@overlookmotel overlookmotel force-pushed the om/04-07-perf_napi_parser_deserializing_tokens_use_only_int32_array branch from 75fa7e7 to 8f0a9fe Compare April 7, 2026 23:03
@overlookmotel overlookmotel added the 0-merge Merge with Graphite Merge Queue label Apr 7, 2026 — with Graphite App
Continuation of #21132. Use `Int32Array` view of the buffer for all code in lazy deserialization. Lazy deserialization is not currently in use, but keeping it in line with the main raw transfer deserializer allows removing the `Unint32Array` view of the buffer entirely in #21140 without breaking the lazy deserializer tests.
@graphite-app graphite-app Bot force-pushed the om/04-07-perf_napi_parser_deserializing_tokens_use_only_int32_array branch from 8f0a9fe to 5b35a53 Compare April 7, 2026 23:15
@graphite-app graphite-app Bot force-pushed the om/04-07-perf_napi_parser_lazy_deserialization_use_only_int32array_ branch from 5f01dba to 2675085 Compare April 7, 2026 23:15
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Apr 7, 2026
Base automatically changed from om/04-07-perf_napi_parser_deserializing_tokens_use_only_int32_array to main April 7, 2026 23:20
@graphite-app graphite-app Bot merged commit 2675085 into main Apr 7, 2026
65 of 67 checks passed
@graphite-app graphite-app Bot deleted the om/04-07-perf_napi_parser_lazy_deserialization_use_only_int32array_ branch April 7, 2026 23:22
camc314 pushed a commit that referenced this pull request Apr 13, 2026
### 💥 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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-ast-tools Area - AST tools A-parser Area - Parser C-performance Category - Solution not expected to change functional behavior, only performance

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants