diff options
author | Vincent Ambo <mail@tazj.in> | 2022-09-01T14·36+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-09-07T19·23+0000 |
commit | 7f687f0e99141ccd13e10e4e85b955fedea347fe (patch) | |
tree | f381ac3ff1768b74f0e18efb638a7e627ee36bb8 /tvix/eval/src | |
parent | baa012d5a3c70e06306e88f570fdbbed3c88591f (diff) |
feat(tvix/eval): track source spans for `if` expressions r/4725
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 <sternenseemann@systemli.org>
Diffstat (limited to 'tvix/eval/src')
-rw-r--r-- | tvix/eval/src/compiler/mod.rs | 11 |
1 files changed, 7 insertions, 4 deletions
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<LocalIdx>, 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 |