summaryrefslogtreecommitdiff
path: root/engine-macros
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-06-17 15:29:22 +0200
committerHampusM <hampus@hampusmat.com>2026-06-17 15:29:22 +0200
commitf82a35702cb85da7ace298960024b773a2da6d85 (patch)
tree0263a76cdb02e18a95507a59e70726f73941b57c /engine-macros
parentc79f7883c099f1624f9666fb8691ffc5022c1bf5 (diff)
feat(engine): add tagged union info to enum reflection
Diffstat (limited to 'engine-macros')
-rw-r--r--engine-macros/src/reflection/enum_impl.rs25
1 files changed, 11 insertions, 14 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
}