summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engine-macros/src/reflection/enum_impl.rs25
-rw-r--r--engine-reflection/src/lib.rs23
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