properly compile when expressions?
This commit is contained in:
parent
ce1612a30c
commit
4f7ba56d1f
|
@ -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) => {
|
||||||
|
|
10
src/main.rs
10
src/main.rs
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user