From 33e71ba97fd3df598daa217ec36a48334136dcfc Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Thu, 21 Oct 2021 11:18:49 +0200 Subject: feat(tazjin/rlox): Implement else clauses Change-Id: I0bc2333c0b4dd3e2e584a90d0d15b28c48130f03 Reviewed-on: https://cl.tvl.fyi/c/depot/+/3740 Tested-by: BuildkiteCI Reviewed-by: tazjin --- users/tazjin/rlox/src/bytecode/compiler.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'users/tazjin/rlox/src/bytecode/compiler.rs') diff --git a/users/tazjin/rlox/src/bytecode/compiler.rs b/users/tazjin/rlox/src/bytecode/compiler.rs index 1b87e94a5512..3e8a80653f91 100644 --- a/users/tazjin/rlox/src/bytecode/compiler.rs +++ b/users/tazjin/rlox/src/bytecode/compiler.rs @@ -343,8 +343,17 @@ impl> Compiler { ); let then_jump = self.emit_op(OpCode::OpJumpPlaceholder(false)); + self.emit_op(OpCode::OpPop); self.statement()?; + let else_jump = self.emit_op(OpCode::OpJumpPlaceholder(true)); self.patch_jump(then_jump); + self.emit_op(OpCode::OpPop); + + if self.match_token(&TokenKind::Else) { + self.statement()?; + } + + self.patch_jump(else_jump); Ok(()) } @@ -620,6 +629,11 @@ impl> Compiler { fn patch_jump(&mut self, idx: CodeIdx) { let offset = CodeOffset(self.chunk.code.len() - idx.0 - 1); + if let OpCode::OpJumpPlaceholder(true) = self.chunk.code[idx.0] { + self.chunk.code[idx.0] = OpCode::OpJump(offset); + return; + } + if let OpCode::OpJumpPlaceholder(false) = self.chunk.code[idx.0] { self.chunk.code[idx.0] = OpCode::OpJumpIfFalse(offset); return; -- cgit 1.4.1