corevm-engine 0.1.28

CoreVM engine that drives program execution either on the builder or CoreVM service side
Documentation
use crate::{Engine, HostCallError, KernelContext, OuterVm};
use corevm_host::Outcome;
use log::trace;
use polkakernel::{Kernel, SyscallOutcome};

pub fn syscall<O: OuterVm>(engine: &mut Engine<O>) -> Result<(), HostCallError> {
	let state = engine.work_output.take_kernel_state()?;
	let context = KernelContext { engine, error: None };
	let mut kernel = Kernel::new(context, state);
	let outcome = kernel.handle_syscall()?;
	let state = kernel.state;
	let error = kernel.context.error;
	engine.work_output.return_kernel_state(state);
	if let Some(e) = error {
		return Err(e);
	}
	match outcome {
		SyscallOutcome::Exit(0) => {
			trace!("Exited with code 0");
			Err(HostCallError::Outcome(Outcome::Halt))
		},
		SyscallOutcome::Exit(ret) => {
			trace!("Exited with code {ret}");
			Err(HostCallError::Outcome(Outcome::Panic))
		},
		SyscallOutcome::Continue => Ok(()),
	}
}