use std::{ops::Range, sync::Arc};
use anyhow::Error;
use wasmtime_fiber::{RuntimeFiberStack, RuntimeFiberStackCreator};
pub unsafe trait StackCreator: Send + Sync {
fn new_stack(&self, size: usize) -> Result<Box<dyn StackMemory>, Error>;
}
#[derive(Clone)]
pub(crate) struct StackCreatorProxy(pub Arc<dyn StackCreator>);
unsafe impl RuntimeFiberStackCreator for StackCreatorProxy {
fn new_stack(&self, size: usize) -> Result<Box<dyn RuntimeFiberStack>, Error> {
let stack = self.0.new_stack(size)?;
Ok(Box::new(FiberStackProxy(stack)) as Box<dyn RuntimeFiberStack>)
}
}
pub unsafe trait StackMemory: Send + Sync {
fn top(&self) -> *mut u8;
fn range(&self) -> Range<usize>;
}
pub(crate) struct FiberStackProxy(pub Box<dyn StackMemory>);
unsafe impl RuntimeFiberStack for FiberStackProxy {
fn top(&self) -> *mut u8 {
self.0.top()
}
fn range(&self) -> Range<usize> {
self.0.range()
}
}