properly compile when expressions?

This commit is contained in:
Scott Richmond 2025-05-23 17:59:09 -04:00
parent ce1612a30c
commit 4f7ba56d1f
2 changed files with 5 additions and 13 deletions

View File

@ -604,24 +604,24 @@ impl Compiler {
When(clauses) => { When(clauses) => {
let mut jump_idxes = vec![]; let mut jump_idxes = vec![];
let mut clauses = clauses.iter(); let mut clauses = clauses.iter();
let stack_depth = self.stack_depth;
while let Some((WhenClause(cond, body), _)) = clauses.next() { while let Some((WhenClause(cond, body), _)) = clauses.next() {
self.visit(cond.as_ref()); self.visit(cond.as_ref());
self.emit_op(Op::JumpIfFalse); self.emit_op(Op::JumpIfFalse);
let jif_jump_idx = self.len(); let jif_jump_idx = self.len();
self.emit_byte(0xff); self.emit_byte(0xff);
self.stack_depth -= 1;
self.visit(body); self.visit(body);
self.emit_op(Op::Jump); self.emit_op(Op::Jump);
jump_idxes.push(self.len()); jump_idxes.push(self.len());
self.emit_byte(0xff); self.emit_byte(0xff);
self.chunk.bytecode[jif_jump_idx] = self.len() as u8 - jif_jump_idx as u8 - 1; 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); self.emit_op(Op::PanicNoWhen);
for idx in jump_idxes { 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!(), WhenClause(..) => unreachable!(),
Match(scrutinee, clauses) => { Match(scrutinee, clauses) => {

View File

@ -74,15 +74,7 @@ pub fn run(src: &'static str) {
pub fn main() { pub fn main() {
env::set_var("RUST_BACKTRACE", "1"); env::set_var("RUST_BACKTRACE", "1");
let src = " let src = "
let x = when {
false -> :no
nil -> {
let x = :no
x
}
:else -> :yes
}
x
"; ";
run(src); run(src);
} }