wars_rt/func/
value.rs

1use super::*;
2pub trait ForLt<'a>{
3    type ForLt;
4}
5#[non_exhaustive]
6pub enum Value<C: CtxSpec,R: for<'a>ForLt<'a>> {
7    I32(u32),
8    I64(u64),
9    F32(f32),
10    F64(f64),
11    FunRef(
12        Arc<
13            dyn for<'a> Fn(
14                    &'a mut C,
15                    Vec<Value<C,R > >,
16                ) -> <R as ForLt<'a>>::ForLt
17                + Send
18                + Sync
19                + 'static,
20        >,
21    ),
22    Null,
23    ExRef(C::ExternRef),
24    #[cfg(feature = "dumpster")]
25    Gc(crate::gc::GcCore<Value<C,R>>),
26}
27#[cfg(feature = "dumpster")]
28const _: () = {
29    use dumpster::Trace;
30    unsafe impl<C: CtxSpec<ExternRef: Trace>,R:for<'a>ForLt<'a>> Trace for Value<C,R> {
31        fn accept<V: dumpster::Visitor>(&self, visitor: &mut V) -> Result<(), ()> {
32            match self {
33                Self::ExRef(e) => e.accept(visitor),
34                Self::Gc(g) => g.accept(visitor),
35                _ => Ok(()),
36            }
37        }
38    }
39};
40impl<C: CtxSpec,R:for<'a>ForLt<'a>> Traverse<C> for Value<C,R> {
41    fn traverse<'a>(&'a self) -> Box<dyn Iterator<Item = &'a <C as CtxSpec>::ExternRef> + 'a> {
42        match self {
43            Value::ExRef(e) => Box::new(once(e)),
44            #[cfg(feature = "dumpster")]
45            Value::Gc(g) => g.traverse(),
46            _ => Box::new(empty()),
47        }
48    }
49    fn traverse_mut<'a>(
50        &'a mut self,
51    ) -> Box<dyn Iterator<Item = &'a mut <C as CtxSpec>::ExternRef> + 'a> {
52        match self {
53            Value::ExRef(e) => Box::new(once(e)),
54            #[cfg(feature = "dumpster")]
55            Value::Gc(g) => g.traverse_mut(),
56            _ => Box::new(empty()),
57        }
58    }
59}
60impl<C: CtxSpec,R: for<'a>ForLt<'a>> Clone for Value<C,R> {
61    fn clone(&self) -> Self {
62        match self {
63            Self::I32(arg0) => Self::I32(arg0.clone()),
64            Self::I64(arg0) => Self::I64(arg0.clone()),
65            Self::F32(arg0) => Self::F32(arg0.clone()),
66            Self::F64(arg0) => Self::F64(arg0.clone()),
67            Self::FunRef(arg0) => Self::FunRef(arg0.clone()),
68            Self::Null => Self::Null,
69            Self::ExRef(e) => Self::ExRef(e.clone()),
70            #[cfg(feature = "dumpster")]
71            Self::Gc(c) => Self::Gc(c.clone()),
72        }
73    }
74}