mirror of
https://github.com/danbulant/oxc
synced 2026-05-25 04:42:10 +00:00
## Why
Due to the usage of `&'alloc mut T` in `oxc_allocator::Box`, and
`bumpalo::collections::Vec` in `oxc_allocator::Vec`, ast types are
currently invariant over their allocator lifetime `'a`. This prevents
`ouroboros` from generating `borrow_*` on ast type fields, leading to
the unfriendly `with_*` api:
c250b288ef/crates/oxc_parser/examples/multi-thread.rs (L82-L84)
## How
- For `oxc_allocator::Vec`, switch to `allocator_api2::vec::Vec`, which
has a covariant relationship with the allocator lifetime.
- For `oxc_allocator::Box`, use `std::ptr::NonNull` which is
specifically designed to be covariant. I don't use
`allocator_api2::boxed::Box` because it holds the allocator for
dropping, so the size is bigger.
## Downside
Now that `oxc_allocator::Box` uses the unsafe `NonNull`. It has to be a
private field to be safe. This make it impossible to do `Box(....)`
pattern matching.
26 lines
634 B
TOML
26 lines
634 B
TOML
[package]
|
|
name = "oxc_allocator"
|
|
version = "0.12.3"
|
|
authors.workspace = true
|
|
description.workspace = true
|
|
edition.workspace = true
|
|
homepage.workspace = true
|
|
keywords.workspace = true
|
|
license.workspace = true
|
|
repository.workspace = true
|
|
rust-version.workspace = true
|
|
categories.workspace = true
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[lib]
|
|
doctest = false
|
|
|
|
[dependencies]
|
|
bumpalo = { workspace = true, features = ["collections", "allocator-api2"] }
|
|
serde = { workspace = true }
|
|
allocator-api2 = { workspace = true }
|
|
|
|
[dev-dependencies]
|
|
serde_json = { workspace = true }
|