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