Make hir::TyKind::TraitObject
use tagged ptr
This commit is contained in:
parent
3cd8fcbf87
commit
0f10ba60ff
20 changed files with 84 additions and 48 deletions
|
@ -28,6 +28,7 @@ use rustc_data_structures::packed::Pu128;
|
|||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use rustc_data_structures::tagged_ptr::Tag;
|
||||
use rustc_macros::{Decodable, Encodable, HashStable_Generic};
|
||||
pub use rustc_span::AttrId;
|
||||
use rustc_span::source_map::{Spanned, respan};
|
||||
|
@ -2269,10 +2270,32 @@ impl TyKind {
|
|||
|
||||
/// Syntax used to declare a trait object.
|
||||
#[derive(Clone, Copy, PartialEq, Encodable, Decodable, Debug, HashStable_Generic)]
|
||||
#[repr(u8)]
|
||||
pub enum TraitObjectSyntax {
|
||||
Dyn,
|
||||
DynStar,
|
||||
None,
|
||||
// SAFETY: When adding new variants make sure to update the `Tag` impl.
|
||||
Dyn = 0,
|
||||
DynStar = 1,
|
||||
None = 2,
|
||||
}
|
||||
|
||||
/// SAFETY: `TraitObjectSyntax` only has 3 data-less variants which means
|
||||
/// it can be represented with a `u2`. We use `repr(u8)` to guarantee the
|
||||
/// discriminants of the variants are no greater than `3`.
|
||||
unsafe impl Tag for TraitObjectSyntax {
|
||||
const BITS: u32 = 2;
|
||||
|
||||
fn into_usize(self) -> usize {
|
||||
self as u8 as usize
|
||||
}
|
||||
|
||||
unsafe fn from_usize(tag: usize) -> Self {
|
||||
match tag {
|
||||
0 => TraitObjectSyntax::Dyn,
|
||||
1 => TraitObjectSyntax::DynStar,
|
||||
2 => TraitObjectSyntax::None,
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue