diff options
author | Vincent Ambo <mail@tazj.in> | 2022-08-07T23·32+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-08-12T13·24+0000 |
commit | 72be759e1e3ec9c84ef3f2f15d54662efa7b0c03 (patch) | |
tree | 49778caae847d77a7e2dee132b4fb8ea73b33f6b /tvix/eval/src/compiler.rs | |
parent | d35ecc0caf2d6ba54b5934f606796687303275b0 (diff) |
feat(tvix/eval): implement unary negation operator r/4411
Change-Id: I5d012cc073e55d79d7b34b88283aab3164864293 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6075 Tested-by: BuildkiteCI Reviewed-by: grfn <grfn@gws.fyi>
Diffstat (limited to 'tvix/eval/src/compiler.rs')
-rw-r--r-- | tvix/eval/src/compiler.rs | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/tvix/eval/src/compiler.rs b/tvix/eval/src/compiler.rs index 65b97cd56ccc..d71eda43aa36 100644 --- a/tvix/eval/src/compiler.rs +++ b/tvix/eval/src/compiler.rs @@ -31,6 +31,11 @@ impl Compiler { self.compile_binop(op) } + rnix::SyntaxKind::NODE_UNARY_OP => { + let op = rnix::types::UnaryOp::cast(node).expect("TODO: (should not be possible)"); + self.compile_unary_op(op) + } + kind => { println!("visiting unsupported node: {:?}", kind); Ok(()) @@ -77,6 +82,19 @@ impl Compiler { self.chunk.add_op(opcode); Ok(()) } + + fn compile_unary_op(&mut self, op: rnix::types::UnaryOp) -> EvalResult<()> { + self.compile(op.value().unwrap())?; + + use rnix::types::UnaryOpKind; + let opcode = match op.operator() { + UnaryOpKind::Invert => OpCode::OpInvert, + UnaryOpKind::Negate => OpCode::OpNegate, + }; + + self.chunk.add_op(opcode); + Ok(()) + } } pub fn compile(ast: rnix::AST) -> EvalResult<Chunk> { |