use super::VirtualMachine;
use crate::VirtualMachineResult;
use stoffel_vm_types::core_types::{ArrayRef, ObjectRef, TableMemoryView, TableRef, Value};
impl VirtualMachine {
pub fn table_memory_view(&self) -> Option<&dyn TableMemoryView> {
self.state.table_memory_view()
}
pub fn read_table_field(
&mut self,
table_ref: TableRef,
key: &Value,
) -> VirtualMachineResult<Option<Value>> {
Ok(self.state.read_table_field(table_ref, key)?)
}
pub fn read_array_ref_len(&mut self, array_ref: ArrayRef) -> VirtualMachineResult<usize> {
self.read_array_len(array_ref)
}
pub fn read_array_len(&mut self, array_ref: ArrayRef) -> VirtualMachineResult<usize> {
Ok(self.state.read_array_ref_len(array_ref)?)
}
pub fn read_object_ref_len(&mut self, object_ref: ObjectRef) -> VirtualMachineResult<usize> {
self.read_object_len(object_ref)
}
pub fn read_object_len(&mut self, object_ref: ObjectRef) -> VirtualMachineResult<usize> {
Ok(self.state.read_object_ref_len(object_ref)?)
}
pub fn read_object_ref_entries(
&mut self,
object_ref: ObjectRef,
limit: usize,
) -> VirtualMachineResult<Vec<(Value, Value)>> {
self.read_object_entries(object_ref, limit)
}
pub fn read_object_entries(
&mut self,
object_ref: ObjectRef,
limit: usize,
) -> VirtualMachineResult<Vec<(Value, Value)>> {
Ok(self.state.read_object_ref_entries(object_ref, limit)?)
}
pub fn read_byte_array(&mut self, value: &Value) -> VirtualMachineResult<Vec<u8>> {
Ok(self.state.read_byte_array(value)?)
}
pub fn create_byte_array(&mut self, bytes: &[u8]) -> VirtualMachineResult<Value> {
Ok(self.state.create_byte_array(bytes)?)
}
pub fn create_object_ref(&mut self) -> VirtualMachineResult<ObjectRef> {
Ok(self.state.create_object_ref()?)
}
pub fn create_array_ref(&mut self, capacity: usize) -> VirtualMachineResult<ArrayRef> {
Ok(self.state.create_array_ref(capacity)?)
}
pub fn create_object(&mut self) -> VirtualMachineResult<Value> {
Ok(Value::from(self.create_object_ref()?))
}
pub fn create_array(&mut self, capacity: usize) -> VirtualMachineResult<Value> {
Ok(Value::from(self.create_array_ref(capacity)?))
}
pub fn set_table_field(
&mut self,
table_ref: TableRef,
key: Value,
value: Value,
) -> VirtualMachineResult<()> {
Ok(self.state.set_table_field(table_ref, key, value)?)
}
pub fn push_array_ref_values(
&mut self,
array_ref: ArrayRef,
values: &[Value],
) -> VirtualMachineResult<usize> {
self.push_array_values(array_ref, values)
}
pub fn push_array_values(
&mut self,
array_ref: ArrayRef,
values: &[Value],
) -> VirtualMachineResult<usize> {
Ok(self.state.push_array_ref_values(array_ref, values)?)
}
pub fn create_object_with_fields<I>(&mut self, fields: I) -> VirtualMachineResult<Value>
where
I: IntoIterator<Item = (Value, Value)>,
{
let object_ref = self.create_object_ref()?;
let table_ref = TableRef::from(object_ref);
for (key, value) in fields {
self.set_table_field(table_ref, key, value)?;
}
Ok(Value::from(object_ref))
}
}