wasmtime_environ/gc/
copying.rs1use super::*;
4use core::mem;
5
6pub const HEADER_SIZE: u32 = 16;
12
13pub const ALIGN: u32 = 16;
17
18pub const ARRAY_LENGTH_OFFSET: u32 = HEADER_SIZE;
20
21pub const EXCEPTION_TAG_INSTANCE_OFFSET: u32 = HEADER_SIZE;
23
24pub const EXCEPTION_TAG_DEFINED_OFFSET: u32 = HEADER_SIZE + 4;
26
27pub const HEADER_COPIED_BIT: u32 = 1 << 0;
31
32pub const FORWARDING_REF_OFFSET: u32 = HEADER_SIZE;
36
37pub const MIN_OBJECT_SIZE: u32 = FORWARDING_REF_OFFSET + mem::size_of::<u32>() as u32;
40
41#[derive(Default)]
43pub struct CopyingTypeLayouts;
44
45impl GcTypeLayouts for CopyingTypeLayouts {
46 fn array_length_field_offset(&self) -> u32 {
47 ARRAY_LENGTH_OFFSET
48 }
49
50 fn exception_tag_instance_offset(&self) -> u32 {
51 EXCEPTION_TAG_INSTANCE_OFFSET
52 }
53
54 fn exception_tag_defined_offset(&self) -> u32 {
55 EXCEPTION_TAG_DEFINED_OFFSET
56 }
57
58 fn array_layout(&self, ty: &WasmArrayType) -> GcArrayLayout {
59 let mut layout = common_array_layout(ty, HEADER_SIZE, ALIGN, ARRAY_LENGTH_OFFSET);
60 debug_assert!(layout.align <= ALIGN);
61 layout.align = ALIGN;
62 debug_assert!(layout.base_size >= MIN_OBJECT_SIZE);
63 layout
64 }
65
66 fn struct_layout(&self, ty: &WasmStructType) -> GcStructLayout {
67 let mut layout = common_struct_layout(ty, HEADER_SIZE, ALIGN);
68 if layout.size < MIN_OBJECT_SIZE {
71 layout.size = MIN_OBJECT_SIZE;
72 }
73 layout.size = layout.size.next_multiple_of(ALIGN);
74 debug_assert!(layout.align <= ALIGN);
75 layout.align = ALIGN;
76 debug_assert!(layout.size >= MIN_OBJECT_SIZE);
77 layout
78 }
79
80 fn exn_layout(&self, ty: &WasmExnType) -> GcStructLayout {
81 let mut layout = common_exn_layout(ty, HEADER_SIZE, ALIGN);
82 layout.size = layout.size.next_multiple_of(ALIGN);
83 debug_assert!(layout.align <= ALIGN);
84 layout.align = ALIGN;
85 debug_assert!(layout.size >= MIN_OBJECT_SIZE);
86 layout
87 }
88}