From d431f43f5fbb0c8eaa23fd082ddb8839cdc0f642 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Mon, 8 Aug 2022 02:55:13 +0300 Subject: feat(tvix/eval): implement boolean inversion operator Change-Id: Icb1d449fdee4d67b5f1eefdbc01baa1584ea0a67 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6079 Tested-by: BuildkiteCI Autosubmit: tazjin Reviewed-by: grfn --- tvix/eval/src/value.rs | 12 ++++++++++++ tvix/eval/src/vm.rs | 6 +++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/tvix/eval/src/value.rs b/tvix/eval/src/value.rs index cbfff55b49..842d561d67 100644 --- a/tvix/eval/src/value.rs +++ b/tvix/eval/src/value.rs @@ -1,6 +1,8 @@ //! This module implements the backing representation of runtime //! values in the Nix language. +use crate::errors::{Error, EvalResult}; + #[derive(Clone, Copy, Debug, PartialEq)] pub enum Value { Null, @@ -26,6 +28,16 @@ impl Value { Value::Float(_) => "float", } } + + pub fn as_bool(self) -> EvalResult { + match self { + Value::Bool(b) => Ok(b), + other => Err(Error::TypeError { + expected: "bool", + actual: other.type_of(), + }), + } + } } #[derive(Clone, Copy, Debug, PartialEq)] diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs index 25a9074c75..7b02c68dc1 100644 --- a/tvix/eval/src/vm.rs +++ b/tvix/eval/src/vm.rs @@ -81,6 +81,11 @@ impl VM { NumberPair::Integer(i1, i2) => self.push(Value::Integer(i1 / i2)), }, + OpCode::OpInvert => { + let v = self.pop().as_bool()?; + self.push(Value::Bool(!v)); + } + OpCode::OpNegate => match self.pop() { Value::Integer(i) => self.push(Value::Integer(-i)), Value::Float(f) => self.push(Value::Float(-f)), @@ -106,7 +111,6 @@ impl VM { self.push(Value::Bool(eq)) } - OpCode::OpInvert => todo!("invert"), OpCode::OpNull => todo!("null"), OpCode::OpTrue => todo!("true"), OpCode::OpFalse => todo!("false"), -- cgit 1.4.1