stoffel-vm 0.1.0

Register-based virtual machine runtime and MPC execution engine for Stoffel programs
Documentation
use super::VMState;
use crate::error::VmResult;
use crate::mpc_values::byte_arrays;
use stoffel_vm_types::core_types::{
    ArrayRef, ObjectRef, TableMemoryResult, TableMemoryView, TableRef, Value,
};

impl VMState {
    pub(crate) fn table_memory_view(&self) -> Option<&dyn TableMemoryView> {
        self.table_memory.as_table_memory_view()
    }

    pub(crate) fn read_table_field(
        &mut self,
        table_ref: TableRef,
        key: &Value,
    ) -> VmResult<Option<Value>> {
        Ok(self.try_read_table_field(table_ref, key)?)
    }

    pub(crate) fn try_read_table_field(
        &mut self,
        table_ref: TableRef,
        key: &Value,
    ) -> TableMemoryResult<Option<Value>> {
        self.table_memory.read_table_field(table_ref, key)
    }

    pub(crate) fn read_array_ref_len(&mut self, array_ref: ArrayRef) -> VmResult<usize> {
        Ok(self.try_read_array_ref_len(array_ref)?)
    }

    pub(crate) fn try_read_array_ref_len(
        &mut self,
        array_ref: ArrayRef,
    ) -> TableMemoryResult<usize> {
        self.table_memory.read_array_ref_len(array_ref)
    }

    pub(crate) fn read_object_ref_len(&mut self, object_ref: ObjectRef) -> VmResult<usize> {
        Ok(self.try_read_object_ref_len(object_ref)?)
    }

    pub(crate) fn try_read_object_ref_len(
        &mut self,
        object_ref: ObjectRef,
    ) -> TableMemoryResult<usize> {
        self.table_memory.read_object_ref_len(object_ref)
    }

    pub(crate) fn read_object_ref_entries(
        &mut self,
        object_ref: ObjectRef,
        limit: usize,
    ) -> VmResult<Vec<(Value, Value)>> {
        Ok(self.try_read_object_ref_entries(object_ref, limit)?)
    }

    pub(crate) fn try_read_object_ref_entries(
        &mut self,
        object_ref: ObjectRef,
        limit: usize,
    ) -> TableMemoryResult<Vec<(Value, Value)>> {
        self.table_memory.read_object_ref_entries(object_ref, limit)
    }

    pub(crate) fn read_byte_array(&mut self, value: &Value) -> VmResult<Vec<u8>> {
        Ok(byte_arrays::extract_byte_array(
            self.table_memory.as_mut(),
            value,
        )?)
    }

    pub(crate) fn create_byte_array(&mut self, bytes: &[u8]) -> VmResult<Value> {
        Ok(Value::from(byte_arrays::create_byte_array_ref(
            self.table_memory.as_mut(),
            bytes,
        )?))
    }

    pub(crate) fn create_object_ref(&mut self) -> VmResult<ObjectRef> {
        Ok(self.table_memory.create_object_ref()?)
    }

    pub(crate) fn create_array_ref(&mut self, capacity: usize) -> VmResult<ArrayRef> {
        if capacity == 0 {
            Ok(self.table_memory.create_array_ref()?)
        } else {
            Ok(self.table_memory.create_array_ref_with_capacity(capacity)?)
        }
    }

    pub(crate) fn set_table_field(
        &mut self,
        table_ref: TableRef,
        key: Value,
        value: Value,
    ) -> VmResult<()> {
        Ok(self.table_memory.set_table_field(table_ref, key, value)?)
    }

    pub(crate) fn push_array_ref_values(
        &mut self,
        array_ref: ArrayRef,
        values: &[Value],
    ) -> VmResult<usize> {
        Ok(self.table_memory.push_array_ref_values(array_ref, values)?)
    }

    pub(crate) fn pop_array_ref_value(
        &mut self,
        array_ref: ArrayRef,
        index: usize,
    ) -> VmResult<Option<Value>> {
        Ok(self.table_memory.pop_array_ref_value(array_ref, index)?)
    }

    pub(crate) fn insert_array_ref_value(
        &mut self,
        array_ref: ArrayRef,
        index: usize,
        value: Value,
    ) -> VmResult<usize> {
        Ok(self
            .table_memory
            .insert_array_ref_value(array_ref, index, value)?)
    }

    pub(crate) fn replace_array_ref_values(
        &mut self,
        array_ref: ArrayRef,
        values: Vec<Value>,
    ) -> VmResult<usize> {
        Ok(self
            .table_memory
            .replace_array_ref_values(array_ref, values)?)
    }

    pub(crate) fn clear_array_ref(&mut self, array_ref: ArrayRef) -> VmResult<()> {
        Ok(self.table_memory.clear_array_ref(array_ref)?)
    }

    pub(crate) fn reverse_array_ref(&mut self, array_ref: ArrayRef) -> VmResult<()> {
        Ok(self.table_memory.reverse_array_ref(array_ref)?)
    }
}