diff --git a/src/build/opcode/test.rs b/src/build/opcode/test.rs index 5a792ef..72c0f06 100644 --- a/src/build/opcode/test.rs +++ b/src/build/opcode/test.rs @@ -584,7 +584,7 @@ macro_rules! assert_parse_cases { let env = Rc::new(RefCell::new(Environment::new(Vec::new(), Vec::new()))); let mut vm = VM::new(ops.clone(), env); vm.run().unwrap(); - assert_eq!(vm.pop().unwrap().0, Rc::new(case.1)); + assert_eq!(vm.last.unwrap().0, Rc::new(case.1)); } }; @@ -769,7 +769,7 @@ fn simple_trace() { let env = Rc::new(RefCell::new(Environment::new(Vec::new(), Vec::new()))); let mut vm = VM::new(ops.clone(), env); vm.run().unwrap(); - assert_eq!(vm.pop().unwrap().0, Rc::new(P(Int(2)))); + assert_eq!(vm.last.unwrap().0, Rc::new(P(Int(2)))); let err_out = &vm.env.borrow().stderr; assert_eq!( String::from_utf8_lossy(err_out).to_owned(), diff --git a/src/build/opcode/translate.rs b/src/build/opcode/translate.rs index 4700e57..5b3e5e1 100644 --- a/src/build/opcode/translate.rs +++ b/src/build/opcode/translate.rs @@ -55,7 +55,11 @@ impl AST { fn translate_stmts(stmts: Vec, mut ops: &mut PositionMap, root: &Path) { for stmt in stmts { match stmt { - Statement::Expression(expr) => Self::translate_expr(expr, &mut ops, root), + Statement::Expression(expr) => { + let expr_pos = expr.pos().clone(); + Self::translate_expr(expr, &mut ops, root); + ops.push(Op::Pop, expr_pos); + } Statement::Assert(_, _) => { unimplemented!("Assert statements are not implmented yet") } diff --git a/src/build/opcode/vm.rs b/src/build/opcode/vm.rs index 1a7d6bd..d32b539 100644 --- a/src/build/opcode/vm.rs +++ b/src/build/opcode/vm.rs @@ -38,6 +38,7 @@ where runtime: runtime::Builtins, ops: OpPointer, pub env: Rc>>, + pub last: Option<(Rc, Position)>, } impl<'a, O, E> VM @@ -56,6 +57,7 @@ where runtime: runtime::Builtins::new(), ops: ops, env: env, + last: None, } } @@ -66,6 +68,7 @@ where runtime: self.runtime.clone(), ops: self.ops.clone(), env: self.env.clone(), + last: self.last, } } @@ -135,7 +138,7 @@ where return Ok(()); } Op::Pop => { - self.pop()?; + self.last = Some(self.pop()?); } Op::Typ => self.op_typ()?, Op::Runtime(h) => self.op_runtime(h, pos)?,