diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/arena.rs | 124 |
1 files changed, 62 insertions, 62 deletions
diff --git a/src/librustc/arena.rs b/src/librustc/arena.rs index 897a587fce8..6805742fe44 100644 --- a/src/librustc/arena.rs +++ b/src/librustc/arena.rs @@ -179,6 +179,18 @@ macro_rules! arena_for_type { }; } +macro_rules! which_arena_for_type { + ([][$arena:expr]) => { + Some($arena) + }; + ([few$(, $attrs:ident)*][$arena:expr]) => { + None + }; + ([$ignore:ident$(, $attrs:ident)*]$args:tt) => { + which_arena_for_type!([$($attrs),*]$args) + }; +} + macro_rules! declare_arena { ([], [$($a:tt $name:ident: $ty:ty,)*], $tcx:lifetime) => { #[derive(Default)] @@ -188,6 +200,24 @@ macro_rules! declare_arena { $($name: arena_for_type!($a[$ty]),)* } + #[marker] + pub trait ArenaAllocatable {} + + impl<T: Copy> ArenaAllocatable for T {} + + unsafe trait ArenaField<'tcx>: Sized { + /// Returns a specific arena to allocate from. + /// If `None` is returned, the `DropArena` will be used. + fn arena<'a>(arena: &'a Arena<'tcx>) -> Option<&'a TypedArena<Self>>; + } + + unsafe impl<'tcx, T> ArenaField<'tcx> for T { + #[inline] + default fn arena<'a>(_: &'a Arena<'tcx>) -> Option<&'a TypedArena<Self>> { + panic!() + } + } + $( impl ArenaAllocatable for $ty {} unsafe impl<$tcx> ArenaField<$tcx> for $ty { @@ -197,71 +227,41 @@ macro_rules! declare_arena { } } )* - } -} - -macro_rules! which_arena_for_type { - ([][$arena:expr]) => { - Some($arena) - }; - ([few$(, $attrs:ident)*][$arena:expr]) => { - None - }; - ([$ignore:ident$(, $attrs:ident)*]$args:tt) => { - which_arena_for_type!([$($attrs),*]$args) - }; -} - -arena_types!(declare_arena, [], 'tcx); - -#[marker] -pub trait ArenaAllocatable {} - -impl<T: Copy> ArenaAllocatable for T {} -unsafe trait ArenaField<'tcx>: Sized { - /// Returns a specific arena to allocate from. - /// If `None` is returned, the `DropArena` will be used. - fn arena<'a>(arena: &'a Arena<'tcx>) -> Option<&'a TypedArena<Self>>; -} - -unsafe impl<'tcx, T> ArenaField<'tcx> for T { - #[inline] - default fn arena<'a>(_: &'a Arena<'tcx>) -> Option<&'a TypedArena<Self>> { - panic!() - } -} - -impl<'tcx> Arena<'tcx> { - #[inline] - pub fn alloc<T: ArenaAllocatable>(&self, value: T) -> &mut T { - if !mem::needs_drop::<T>() { - return self.dropless.alloc(value); - } - match <T as ArenaField<'tcx>>::arena(self) { - Some(arena) => arena.alloc(value), - None => unsafe { self.drop.alloc(value) }, - } - } + impl<'tcx> Arena<'tcx> { + #[inline] + pub fn alloc<T: ArenaAllocatable>(&self, value: T) -> &mut T { + if !mem::needs_drop::<T>() { + return self.dropless.alloc(value); + } + match <T as ArenaField<'tcx>>::arena(self) { + Some(arena) => arena.alloc(value), + None => unsafe { self.drop.alloc(value) }, + } + } - #[inline] - pub fn alloc_slice<T: Copy>(&self, value: &[T]) -> &mut [T] { - if value.is_empty() { - return &mut []; - } - self.dropless.alloc_slice(value) - } + #[inline] + pub fn alloc_slice<T: Copy>(&self, value: &[T]) -> &mut [T] { + if value.is_empty() { + return &mut []; + } + self.dropless.alloc_slice(value) + } - pub fn alloc_from_iter<T: ArenaAllocatable, I: IntoIterator<Item = T>>( - &'a self, - iter: I, - ) -> &'a mut [T] { - if !mem::needs_drop::<T>() { - return self.dropless.alloc_from_iter(iter); - } - match <T as ArenaField<'tcx>>::arena(self) { - Some(arena) => arena.alloc_from_iter(iter), - None => unsafe { self.drop.alloc_from_iter(iter) }, + pub fn alloc_from_iter<T: ArenaAllocatable, I: IntoIterator<Item = T>>( + &'a self, + iter: I, + ) -> &'a mut [T] { + if !mem::needs_drop::<T>() { + return self.dropless.alloc_from_iter(iter); + } + match <T as ArenaField<'tcx>>::arena(self) { + Some(arena) => arena.alloc_from_iter(iter), + None => unsafe { self.drop.alloc_from_iter(iter) }, + } + } } } } + +arena_types!(declare_arena, [], 'tcx); |
