diff options
Diffstat (limited to 'tvix/eval/src')
-rw-r--r-- | tvix/eval/src/compiler.rs | 29 | ||||
-rw-r--r-- | tvix/eval/src/vm.rs | 6 |
2 files changed, 31 insertions, 4 deletions
diff --git a/tvix/eval/src/compiler.rs b/tvix/eval/src/compiler.rs index 297d23d3d84f..4526bf16d6b7 100644 --- a/tvix/eval/src/compiler.rs +++ b/tvix/eval/src/compiler.rs @@ -6,7 +6,7 @@ use crate::errors::EvalResult; use crate::opcode::OpCode; use crate::value::Value; use rnix; -use rnix::types::{TypedNode, Wrapper}; +use rnix::types::{TokenWrapper, TypedNode, Wrapper}; struct Compiler { chunk: Chunk, @@ -41,6 +41,11 @@ impl Compiler { self.compile(node.inner().unwrap()) } + rnix::SyntaxKind::NODE_IDENT => { + let node = rnix::types::Ident::cast(node).unwrap(); + self.compile_ident(node) + } + kind => { println!("visiting unsupported node: {:?}", kind); Ok(()) @@ -98,6 +103,28 @@ impl Compiler { self.chunk.add_op(opcode); Ok(()) } + + fn compile_ident(&mut self, node: rnix::types::Ident) -> EvalResult<()> { + match node.as_str() { + // TODO(tazjin): Nix technically allows code like + // + // let null = 1; in null + // => 1 + // + // which we do *not* want to check at runtime. Once + // scoping is introduced, the compiler should carry some + // optimised information about any "weird" stuff that's + // happened to the scope (such as overrides of these + // literals, or builtins). + "true" => self.chunk.add_op(OpCode::OpTrue), + "false" => self.chunk.add_op(OpCode::OpFalse), + "null" => self.chunk.add_op(OpCode::OpNull), + + _ => todo!("identifier access"), + }; + + Ok(()) + } } pub fn compile(ast: rnix::AST) -> EvalResult<Chunk> { diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs index 7b02c68dc193..7b7834c650c6 100644 --- a/tvix/eval/src/vm.rs +++ b/tvix/eval/src/vm.rs @@ -111,9 +111,9 @@ impl VM { self.push(Value::Bool(eq)) } - OpCode::OpNull => todo!("null"), - OpCode::OpTrue => todo!("true"), - OpCode::OpFalse => todo!("false"), + OpCode::OpNull => self.push(Value::Null), + OpCode::OpTrue => self.push(Value::Bool(true)), + OpCode::OpFalse => self.push(Value::Bool(false)), } if self.ip == self.chunk.code.len() { |