use crate::Result;
use core::ops::Range;
use crate::runtime::vm::stack_switching::VMHostArray;
use crate::runtime::vm::{VMContext, VMFuncRef, ValRaw};
cfg_if::cfg_if! {
if #[cfg(all(feature = "stack-switching", unix, target_arch = "x86_64"))] {
mod unix;
use unix as imp;
} else {
mod dummy;
use dummy as imp;
}
}
#[derive(Debug)]
#[repr(C)]
pub struct VMContinuationStack(imp::VMContinuationStack);
impl VMContinuationStack {
pub fn new(size: usize) -> Result<Self> {
Ok(Self(imp::VMContinuationStack::new(size)?))
}
pub fn unallocated() -> Self {
Self(imp::VMContinuationStack::unallocated())
}
pub fn is_unallocated(&self) -> bool {
imp::VMContinuationStack::is_unallocated(&self.0)
}
pub unsafe fn from_raw_parts(bottom: *mut u8, guard_size: usize, len: usize) -> Result<Self> {
Ok(Self(unsafe {
imp::VMContinuationStack::from_raw_parts(bottom, guard_size, len)?
}))
}
pub fn is_from_raw_parts(&self) -> bool {
self.0.is_from_raw_parts()
}
pub fn top(&self) -> Option<*mut u8> {
self.0.top()
}
pub fn range(&self) -> Option<Range<usize>> {
self.0.range()
}
pub fn control_context_instruction_pointer(&self) -> usize {
self.0.control_context_instruction_pointer()
}
pub fn control_context_frame_pointer(&self) -> usize {
self.0.control_context_frame_pointer()
}
pub fn control_context_stack_pointer(&self) -> usize {
self.0.control_context_stack_pointer()
}
pub fn initialize(
&self,
func_ref: *const VMFuncRef,
caller_vmctx: *mut VMContext,
args: *mut VMHostArray<ValRaw>,
parameter_count: u32,
return_value_count: u32,
) {
self.0.initialize(
func_ref,
caller_vmctx,
args,
parameter_count,
return_value_count,
)
}
}