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}