about summary refs log tree commit diff
path: root/tvix/eval/src/compiler/mod.rs
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/mod.rs
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 '')
-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 7c3f2b2537..714c24de31 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