bsharp_interp/
lib.rs

1use ir::*;
2use std::io::Write;
3
4mod values;
5use values::*;
6
7mod errors;
8use errors::*;
9
10mod fns;
11mod stmts;
12
13pub struct Interp {
14    pub stack: Vec<StackFrame>,
15    pub ir: IR,
16    pub out: Box<dyn Write>,
17}
18
19impl Interp {
20    pub fn new(ir: IR, out: Box<dyn Write>) -> Self {
21        Self {
22            stack: Vec::new(),
23            ir,
24            out,
25        }
26    }
27
28    pub fn run_fn(
29        &mut self,
30        func: usize,
31        args: Vec<Value>,
32        callpos: Pos,
33    ) -> Result<Value, InterpError> {
34        // Put in params
35        let mut frame = StackFrame::default();
36        frame.pos = callpos;
37        frame.func = func;
38        for (i, arg) in args.iter().enumerate() {
39            frame
40                .vars
41                .insert(self.ir.funcs[func].params[i], arg.clone());
42        }
43        self.stack.push(frame);
44
45        // Run
46        self.exec(&self.ir.funcs[func].body.clone())?;
47
48        // Get return
49        let ret = self.stack.last().unwrap().ret.clone();
50        self.stack.pop();
51
52        Ok(if let Some(ret) = ret {
53            ret
54        } else {
55            Value::Void
56        })
57    }
58}