wasm/execution/
resumable.rs1use core::num::NonZeroU64;
2
3use alloc::vec::Vec;
4
5use crate::{addrs::FuncAddr, value_stack::Stack, HaltExecutionError, Value};
6
7#[derive(Debug)]
16pub struct WasmResumable {
17 pub(crate) stack: Stack,
18 pub(crate) pc: usize,
19 pub(crate) stp: usize,
20 pub(crate) current_func_addr: FuncAddr,
21 pub(crate) maybe_fuel: Option<u64>,
22}
23
24#[derive(Debug)]
25pub struct HostResumable<T> {
26 pub(crate) func_addr: FuncAddr,
28 pub(crate) params: Vec<Value>,
31 pub(crate) hostcode: fn(&mut T, Vec<Value>) -> Result<Vec<Value>, HaltExecutionError>,
32 pub(crate) maybe_fuel: Option<u64>,
33}
34
35#[derive(Debug)]
36pub enum Resumable<T> {
37 Wasm(WasmResumable),
38 Host(HostResumable<T>),
39}
40
41impl<T> Resumable<T> {
42 pub fn fuel(&self) -> Option<u64> {
43 match self {
44 Resumable::Wasm(wasm_resumable) => wasm_resumable.maybe_fuel,
45 Resumable::Host(host_resumable) => host_resumable.maybe_fuel,
46 }
47 }
48
49 pub fn fuel_mut(&mut self) -> &mut Option<u64> {
50 match self {
51 Resumable::Wasm(wasm_resumable) => &mut wasm_resumable.maybe_fuel,
52 Resumable::Host(host_resumable) => &mut host_resumable.maybe_fuel,
53 }
54 }
55}
56
57pub enum RunState<T> {
59 Finished {
62 values: Vec<Value>,
63 maybe_remaining_fuel: Option<u64>,
64 },
65 Resumable {
68 resumable: Resumable<T>, required_fuel: NonZeroU64,
70 },
71}