From 7f687f0e99141ccd13e10e4e85b955fedea347fe Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Thu, 1 Sep 2022 17:36:13 +0300 Subject: feat(tvix/eval): track source spans for `if` expressions These are again a bit tricky in terms of emitted errors. The main error is that the condition is not a boolean, which means that the jump inspecting the condition must derive from the condition itself to return an error at the correct position. For other parts of the expression, it is simply the node itself. Change-Id: I72411630e5d57dfc199f4c3c48afe443fe966322 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6392 Tested-by: BuildkiteCI Reviewed-by: sterni --- tvix/eval/src/compiler/mod.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'tvix/eval/src/compiler') diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs index 7c3f2b253713..714c24de3121 100644 --- a/tvix/eval/src/compiler/mod.rs +++ b/tvix/eval/src/compiler/mod.rs @@ -625,15 +625,18 @@ impl Compiler<'_> { fn compile_if_else(&mut self, slot: Option, node: ast::IfElse) { self.compile(slot, node.condition().unwrap()); - let then_idx = self.push_op_old(OpCode::OpJumpIfFalse(JumpOffset(0))); + let then_idx = self.push_op( + OpCode::OpJumpIfFalse(JumpOffset(0)), + &node.condition().unwrap(), + ); - self.push_op_old(OpCode::OpPop); // discard condition value + self.push_op(OpCode::OpPop, &node); // discard condition value self.compile(slot, node.body().unwrap()); - let else_idx = self.push_op_old(OpCode::OpJump(JumpOffset(0))); + let else_idx = self.push_op(OpCode::OpJump(JumpOffset(0)), &node); self.patch_jump(then_idx); // patch jump *to* else_body - self.push_op_old(OpCode::OpPop); // discard condition value + self.push_op(OpCode::OpPop, &node); // discard condition value self.compile(slot, node.else_body().unwrap()); self.patch_jump(else_idx); // patch jump *over* else body -- cgit 1.4.1