diff --git a/crates/oxc_allocator/src/arena.rs b/crates/oxc_allocator/src/arena.rs index 81459678c9e10..350fbf74d5b52 100644 --- a/crates/oxc_allocator/src/arena.rs +++ b/crates/oxc_allocator/src/arena.rs @@ -212,6 +212,21 @@ impl<'alloc, T: Hash> Hash for Vec<'alloc, T> { } } +/// Memory address of an AST node in arena. +/// +/// `Address` is generated from a `Box`. +/// AST nodes in a `Box` in an arena are guaranteed to never move in memory, +/// so this address acts as a unique identifier for the duration of the arena's existence. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct Address(usize); + +impl<'a, T> Box<'a, T> { + #[inline] + pub fn address(&self) -> Address { + Address(ptr::addr_of!(**self) as usize) + } +} + #[cfg(test)] mod test { use std::hash::{DefaultHasher, Hash, Hasher}; diff --git a/crates/oxc_allocator/src/lib.rs b/crates/oxc_allocator/src/lib.rs index 7ab4c8ff6d00e..4093dd75ddffb 100644 --- a/crates/oxc_allocator/src/lib.rs +++ b/crates/oxc_allocator/src/lib.rs @@ -9,7 +9,7 @@ mod convert; use bumpalo::Bump; -pub use arena::{Box, String, Vec}; +pub use arena::{Address, Box, String, Vec}; pub use clone_in::CloneIn; pub use convert::{FromIn, IntoIn};