diff --git a/src/compiler.rs b/src/compiler.rs index 3c9c32d..c1975a3 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -604,24 +604,24 @@ impl Compiler { When(clauses) => { let mut jump_idxes = vec![]; let mut clauses = clauses.iter(); - let stack_depth = self.stack_depth; while let Some((WhenClause(cond, body), _)) = clauses.next() { self.visit(cond.as_ref()); self.emit_op(Op::JumpIfFalse); let jif_jump_idx = self.len(); self.emit_byte(0xff); + self.stack_depth -= 1; self.visit(body); self.emit_op(Op::Jump); jump_idxes.push(self.len()); self.emit_byte(0xff); self.chunk.bytecode[jif_jump_idx] = self.len() as u8 - jif_jump_idx as u8 - 1; - self.stack_depth = stack_depth; + self.stack_depth -= 1; } - self.stack_depth += 1; self.emit_op(Op::PanicNoWhen); for idx in jump_idxes { - self.chunk.bytecode[idx] = self.len() as u8 - idx as u8 + 1; + self.chunk.bytecode[idx] = self.len() as u8 - idx as u8 - 1; } + self.stack_depth += 1; } WhenClause(..) => unreachable!(), Match(scrutinee, clauses) => { diff --git a/src/main.rs b/src/main.rs index dfe5715..10b374c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -74,15 +74,7 @@ pub fn run(src: &'static str) { pub fn main() { env::set_var("RUST_BACKTRACE", "1"); let src = " -let x = when { - false -> :no - nil -> { - let x = :no - x - } - :else -> :yes -} -x + "; run(src); }