Skip to main content

runmat_vm/interpreter/dispatch/
stack.rs

1use crate::bytecode::EmitLabel;
2use crate::bytecode::ExecutionContext;
3use crate::ops::stack as stack_ops;
4use runmat_builtins::Value;
5use runmat_runtime::RuntimeError;
6use std::collections::HashMap;
7
8pub async fn emit_stack_top(
9    stack: &[Value],
10    label: &EmitLabel,
11    var_names: &HashMap<usize, String>,
12) -> Result<(), RuntimeError> {
13    stack_ops::emit_stack_top(stack, label, var_names).await
14}
15
16pub async fn emit_var(
17    vars: &[Value],
18    var_index: usize,
19    label: &EmitLabel,
20    var_names: &HashMap<usize, String>,
21) -> Result<(), RuntimeError> {
22    stack_ops::emit_var(vars, var_index, label, var_names).await
23}
24
25pub fn load_const(stack: &mut Vec<Value>, value: f64) {
26    stack_ops::load_const(stack, value);
27}
28
29pub fn load_complex(stack: &mut Vec<Value>, re: f64, im: f64) {
30    stack_ops::load_complex(stack, re, im);
31}
32
33pub fn load_bool(stack: &mut Vec<Value>, value: bool) {
34    stack_ops::load_bool(stack, value);
35}
36
37pub fn load_string(stack: &mut Vec<Value>, value: String) {
38    stack_ops::load_string(stack, value);
39}
40
41pub fn load_char_row(stack: &mut Vec<Value>, value: String) -> Result<(), RuntimeError> {
42    stack_ops::load_char_row(stack, value)
43}
44
45pub fn load_var(stack: &mut Vec<Value>, vars: &[Value], index: usize) {
46    stack_ops::load_var(stack, vars, index);
47}
48
49pub fn load_local(
50    stack: &mut Vec<Value>,
51    context: &ExecutionContext,
52    vars: &[Value],
53    offset: usize,
54) -> Result<(), RuntimeError> {
55    stack_ops::load_local(stack, context, vars, offset)
56}
57
58pub fn store_var<BeforeOverwrite, AfterStore>(
59    stack: &mut Vec<Value>,
60    vars: &mut Vec<Value>,
61    index: usize,
62    var_names: &HashMap<usize, String>,
63    before_overwrite: BeforeOverwrite,
64    after_store: AfterStore,
65) -> Result<(), RuntimeError>
66where
67    BeforeOverwrite: FnMut(&Value, &Value),
68    AfterStore: FnMut(usize, &Value),
69{
70    stack_ops::store_var(stack, vars, index, var_names, before_overwrite, after_store)
71}
72
73pub fn store_local<BeforeLocalOverwrite, BeforeVarOverwrite, AfterFallbackStore>(
74    stack: &mut Vec<Value>,
75    context: &mut ExecutionContext,
76    vars: &mut Vec<Value>,
77    offset: usize,
78    before_local_overwrite: BeforeLocalOverwrite,
79    before_var_overwrite: BeforeVarOverwrite,
80    after_fallback_store: AfterFallbackStore,
81) -> Result<(), RuntimeError>
82where
83    BeforeLocalOverwrite: FnMut(&Value, &Value),
84    BeforeVarOverwrite: FnMut(&Value, &Value),
85    AfterFallbackStore: FnMut(&str, usize, &Value),
86{
87    stack_ops::store_local(
88        stack,
89        context,
90        vars,
91        offset,
92        before_local_overwrite,
93        before_var_overwrite,
94        after_fallback_store,
95    )
96}