diff options
author | Vincent Ambo <mail@tazj.in> | 2022-08-07T23·51+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-08-12T14·09+0000 |
commit | ded0fb9e21d4b8794fa668941474b26d45ef6f3d (patch) | |
tree | 84cb0a335888dcf9f050ed1b916e3b6b2027afe7 | |
parent | 28f57abac1e4fc97b983af1b891d553db0a628d9 (diff) |
feat(tvix/eval): implement equality operator r/4414
Change-Id: I9dd54aed72cd7e67593dc76f5a046ebbda40c26f Reviewed-on: https://cl.tvl.fyi/c/depot/+/6078 Tested-by: BuildkiteCI Autosubmit: tazjin <tazjin@tvl.su> Reviewed-by: grfn <grfn@gws.fyi>
-rw-r--r-- | tvix/eval/src/compiler.rs | 2 | ||||
-rw-r--r-- | tvix/eval/src/opcode.rs | 9 | ||||
-rw-r--r-- | tvix/eval/src/vm.rs | 22 |
3 files changed, 25 insertions, 8 deletions
diff --git a/tvix/eval/src/compiler.rs b/tvix/eval/src/compiler.rs index acbf018f81e7..297d23d3d84f 100644 --- a/tvix/eval/src/compiler.rs +++ b/tvix/eval/src/compiler.rs @@ -78,7 +78,7 @@ impl Compiler { BinOpKind::Sub => OpCode::OpSub, BinOpKind::Mul => OpCode::OpMul, BinOpKind::Div => OpCode::OpDiv, - + BinOpKind::Equal => OpCode::OpEqual, _ => todo!(), }; diff --git a/tvix/eval/src/opcode.rs b/tvix/eval/src/opcode.rs index 0aa252c4cc08..a9f7f8904058 100644 --- a/tvix/eval/src/opcode.rs +++ b/tvix/eval/src/opcode.rs @@ -17,13 +17,16 @@ pub enum OpCode { OpTrue, OpFalse, + // Unary operators + OpInvert, + OpNegate, + // Arithmetic binary operators OpAdd, OpSub, OpMul, OpDiv, - // Unary operators - OpInvert, - OpNegate, + // Logical binary operators + OpEqual, } diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs index da79867ef3f0..25a9074c7592 100644 --- a/tvix/eval/src/vm.rs +++ b/tvix/eval/src/vm.rs @@ -92,10 +92,24 @@ impl VM { } }, - OpCode::OpInvert => todo!(), - OpCode::OpNull => todo!(), - OpCode::OpTrue => todo!(), - OpCode::OpFalse => todo!(), + OpCode::OpEqual => { + let v2 = self.pop(); + let v1 = self.pop(); + + let eq = match (v1, v2) { + (Value::Float(f), Value::Integer(i)) + | (Value::Integer(i), Value::Float(f)) => f == (i as f64), + + _ => v2 == v2, + }; + + self.push(Value::Bool(eq)) + } + + OpCode::OpInvert => todo!("invert"), + OpCode::OpNull => todo!("null"), + OpCode::OpTrue => todo!("true"), + OpCode::OpFalse => todo!("false"), } if self.ip == self.chunk.code.len() { |