wasmer_compiler/
traits.rs1use crate::types::target::CpuFeature;
4use crate::Features;
5use enumset::EnumSet;
6use std::any::Any;
7use std::sync::Arc;
8use wasmer_types::entity::PrimaryMap;
9use wasmer_types::SerializeError;
10use wasmer_types::{
11 DataInitializerLike, MemoryIndex, MemoryStyle, ModuleInfo, TableIndex, TableStyle,
12};
13
14pub trait ArtifactCreate<'a>: Send + Sync + Upcastable {
21 type OwnedDataInitializer: DataInitializerLike<'a> + 'a;
23 type OwnedDataInitializerIterator: Iterator<Item = Self::OwnedDataInitializer>;
25
26 fn create_module_info(&'a self) -> Arc<ModuleInfo>;
28
29 fn set_module_info_name(&'a mut self, name: String) -> bool;
31
32 fn module_info(&'a self) -> &ModuleInfo;
34
35 fn features(&'a self) -> &Features;
37
38 fn cpu_features(&'a self) -> EnumSet<CpuFeature>;
40
41 fn memory_styles(&'a self) -> &PrimaryMap<MemoryIndex, MemoryStyle>;
43
44 fn table_styles(&'a self) -> &PrimaryMap<TableIndex, TableStyle>;
46
47 fn data_initializers(&'a self) -> Self::OwnedDataInitializerIterator;
49
50 fn serialize(&'a self) -> Result<Vec<u8>, SerializeError>;
52}
53
54pub trait Upcastable {
57 fn upcast_any_ref(&'_ self) -> &'_ dyn Any;
59 fn upcast_any_mut(&'_ mut self) -> &'_ mut dyn Any;
61 fn upcast_any_box(self: Box<Self>) -> Box<dyn Any>;
63}
64
65impl<T: Any + Send + Sync + 'static> Upcastable for T {
66 #[inline]
67 fn upcast_any_ref(&'_ self) -> &'_ dyn Any {
68 self
69 }
70 #[inline]
71 fn upcast_any_mut(&'_ mut self) -> &'_ mut dyn Any {
72 self
73 }
74 #[inline]
75 fn upcast_any_box(self: Box<Self>) -> Box<dyn Any> {
76 self
77 }
78}
79
80impl<'a, O, I>
81 dyn ArtifactCreate<'a, OwnedDataInitializer = O, OwnedDataInitializerIterator = I> + 'static
82{
83 #[inline]
85 pub fn downcast_ref<T: 'static>(&'a self) -> Option<&'a T> {
86 self.upcast_any_ref().downcast_ref::<T>()
87 }
88
89 #[inline]
91 pub fn downcast_mut<T: 'static>(&'a mut self) -> Option<&'a mut T> {
92 self.upcast_any_mut().downcast_mut::<T>()
93 }
94}