use super::*;
use core::mem;
pub const HEADER_SIZE: u32 = 16;
pub const ALIGN: u32 = 16;
pub const ARRAY_LENGTH_OFFSET: u32 = HEADER_SIZE;
pub const EXCEPTION_TAG_INSTANCE_OFFSET: u32 = HEADER_SIZE;
pub const EXCEPTION_TAG_DEFINED_OFFSET: u32 = HEADER_SIZE + 4;
pub const HEADER_COPIED_BIT: u32 = 1 << 0;
pub const FORWARDING_REF_OFFSET: u32 = HEADER_SIZE;
pub const MIN_OBJECT_SIZE: u32 = FORWARDING_REF_OFFSET + mem::size_of::<u32>() as u32;
#[derive(Default)]
pub struct CopyingTypeLayouts;
impl GcTypeLayouts for CopyingTypeLayouts {
fn array_length_field_offset(&self) -> u32 {
ARRAY_LENGTH_OFFSET
}
fn exception_tag_instance_offset(&self) -> u32 {
EXCEPTION_TAG_INSTANCE_OFFSET
}
fn exception_tag_defined_offset(&self) -> u32 {
EXCEPTION_TAG_DEFINED_OFFSET
}
fn array_layout(&self, ty: &WasmArrayType) -> GcArrayLayout {
let mut layout = common_array_layout(ty, HEADER_SIZE, ALIGN, ARRAY_LENGTH_OFFSET);
debug_assert!(layout.align <= ALIGN);
layout.align = ALIGN;
debug_assert!(layout.base_size >= MIN_OBJECT_SIZE);
layout
}
fn struct_layout(&self, ty: &WasmStructType) -> GcStructLayout {
let mut layout = common_struct_layout(ty, HEADER_SIZE, ALIGN);
if layout.size < MIN_OBJECT_SIZE {
layout.size = MIN_OBJECT_SIZE;
}
layout.size = layout.size.next_multiple_of(ALIGN);
debug_assert!(layout.align <= ALIGN);
layout.align = ALIGN;
debug_assert!(layout.size >= MIN_OBJECT_SIZE);
layout
}
fn exn_layout(&self, ty: &WasmExnType) -> GcStructLayout {
let mut layout = common_exn_layout(ty, HEADER_SIZE, ALIGN);
layout.size = layout.size.next_multiple_of(ALIGN);
debug_assert!(layout.align <= ALIGN);
layout.align = ALIGN;
debug_assert!(layout.size >= MIN_OBJECT_SIZE);
layout
}
}