add LayoutRepr::Ptr

This commit is contained in:
Folkert 2023-06-18 15:44:40 +02:00
parent a9f7961b52
commit 17512873e8
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
18 changed files with 62 additions and 8 deletions

View file

@ -675,6 +675,7 @@ pub enum LayoutRepr<'a> {
Builtin(Builtin<'a>),
Struct(&'a [InLayout<'a>]),
Boxed(InLayout<'a>),
Ptr(InLayout<'a>),
Union(UnionLayout<'a>),
LambdaSet(LambdaSet<'a>),
RecursivePointer(InLayout<'a>),
@ -2555,7 +2556,7 @@ impl<'a> LayoutRepr<'a> {
LambdaSet(lambda_set) => interner
.get_repr(lambda_set.runtime_representation())
.safe_to_memcpy(interner),
Boxed(_) | RecursivePointer(_) => {
Boxed(_) | Ptr(_) | RecursivePointer(_) => {
// We cannot memcpy pointers, because then we would have the same pointer in multiple places!
false
}
@ -2646,6 +2647,7 @@ impl<'a> LayoutRepr<'a> {
.stack_size_without_alignment(interner),
RecursivePointer(_) => interner.target_info().ptr_width() as u32,
Boxed(_) => interner.target_info().ptr_width() as u32,
Ptr(_) => interner.target_info().ptr_width() as u32,
}
}
@ -2699,6 +2701,7 @@ impl<'a> LayoutRepr<'a> {
Builtin(builtin) => builtin.alignment_bytes(interner.target_info()),
RecursivePointer(_) => interner.target_info().ptr_width() as u32,
Boxed(_) => interner.target_info().ptr_width() as u32,
Ptr(_) => interner.target_info().ptr_width() as u32,
}
}
@ -2723,6 +2726,7 @@ impl<'a> LayoutRepr<'a> {
ptr_width,
interner.get_repr(*inner).alignment_bytes(interner),
),
Ptr(inner) => interner.get_repr(*inner).alignment_bytes(interner),
}
}
@ -2776,6 +2780,7 @@ impl<'a> LayoutRepr<'a> {
.contains_refcounted(interner),
RecursivePointer(_) => true,
Boxed(_) => true,
Ptr(inner) => interner.get_repr(*inner).contains_refcounted(interner),
}
}
@ -2831,7 +2836,7 @@ impl<'a> LayoutRepr<'a> {
}
},
LambdaSet(_) => return true,
Boxed(_) => {
Boxed(_) | Ptr(_) => {
// If there's any layer of indirection (behind a pointer), then it doesn't vary!
}
RecursivePointer(_) => {