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 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 self.exec(&self.ir.funcs[func].body.clone())?;
47
48 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}