diff options
| author | HampusM <hampus@hampusmat.com> | 2026-06-17 15:29:22 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-06-17 15:29:22 +0200 |
| commit | f82a35702cb85da7ace298960024b773a2da6d85 (patch) | |
| tree | 0263a76cdb02e18a95507a59e70726f73941b57c | |
| parent | c79f7883c099f1624f9666fb8691ffc5022c1bf5 (diff) | |
feat(engine): add tagged union info to enum reflection
| -rw-r--r-- | engine-macros/src/reflection/enum_impl.rs | 25 | ||||
| -rw-r--r-- | engine-reflection/src/lib.rs | 23 |
2 files changed, 32 insertions, 16 deletions
diff --git a/engine-macros/src/reflection/enum_impl.rs b/engine-macros/src/reflection/enum_impl.rs index 611da6d..5dbb176 100644 --- a/engine-macros/src/reflection/enum_impl.rs +++ b/engine-macros/src/reflection/enum_impl.rs @@ -219,23 +219,21 @@ pub fn generate(input: syn::ItemEnum) -> proc_macro2::TokenStream &engine_crate_path, ); - let discriminant_layout = if is_unit_only { - quote! { - std::alloc::Layout::new::<Self>() - } - } else { - quote! { - std::alloc::Layout::new::<#mod_name::Discriminant>() - } - }; - - let fields_layout = if is_unit_only { + let tagged_union = if is_unit_only { quote! { None } } else { quote! { - Some(std::alloc::Layout::new::<#mod_name::Fields>()) + Some(#engine_crate_path::reflection::EnumTaggedUnion { + discriminant_layout: std::alloc::Layout::new::<#mod_name::Discriminant>(), + discriminant_byte_offset: + std::mem::offset_of!(#mod_name::Equivalent #type_generics, tag), + fields_layout: + std::alloc::Layout::new::<#mod_name::Fields #type_generics>(), + fields_byte_offset: + std::mem::offset_of!(#mod_name::Equivalent #type_generics, payload), + }) } }; @@ -256,8 +254,7 @@ pub fn generate(input: syn::ItemEnum) -> proc_macro2::TokenStream #engine_crate_path::reflection::Enum { variants: &[#(#variants),*], is_unit_only: #is_unit_only, - discriminant_layout: #discriminant_layout, - fields_layout: #fields_layout, + tagged_union: #tagged_union, get_default_value: || { #get_default_value_fn } diff --git a/engine-reflection/src/lib.rs b/engine-reflection/src/lib.rs index 4e5e8d8..3bd6f97 100644 --- a/engine-reflection/src/lib.rs +++ b/engine-reflection/src/lib.rs @@ -119,8 +119,7 @@ pub struct Enum /// The enum only contains unit variants. pub is_unit_only: bool, - pub discriminant_layout: Layout, - pub fields_layout: Option<Layout>, + pub tagged_union: Option<EnumTaggedUnion>, pub get_default_value: fn() -> Option<DefaultValueFn>, } @@ -141,6 +140,15 @@ impl Enum } #[derive(Debug, Clone)] +pub struct EnumTaggedUnion +{ + pub discriminant_layout: Layout, + pub discriminant_byte_offset: usize, + pub fields_layout: Layout, + pub fields_byte_offset: usize, +} + +#[derive(Debug, Clone)] pub struct EnumVariant { pub name: &'static str, @@ -164,6 +172,17 @@ pub enum EnumVariantFields }, } +impl EnumVariantFields +{ + pub fn fields(&self) -> &'static [Field] + { + match self { + Self::Named { fields } => fields, + Self::Unnamed { fields } => fields, + } + } +} + /// The discriminant of a enum variant. #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct EnumDiscriminant |
