about summary refs log tree commit diff
path: root/tvix/eval/src/compiler
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-09-01T14·36+0300
committertazjin <tazjin@tvl.su>2022-09-07T19·23+0000
commit7f687f0e99141ccd13e10e4e85b955fedea347fe (patch)
treef381ac3ff1768b74f0e18efb638a7e627ee36bb8 /tvix/eval/src/compiler
parentbaa012d5a3c70e06306e88f570fdbbed3c88591f (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/compiler')
-rw-r--r--tvix/eval/src/compiler/mod.rs11
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