refactor(tvix/eval): pass a VM reference to builtins
This makes it possible for builtins to force values on their own, without the VM having to apply a strictness mask to the arguments first. Change-Id: Ib49a94e56ca2a8d515c39647381ab55a727766e3 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6411 Reviewed-by: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI
This commit is contained in:
		
							parent
							
								
									5ee89bcf5c
								
							
						
					
					
						commit
						0d7ad5e6d1
					
				
					 3 changed files with 34 additions and 24 deletions
				
			
		| 
						 | 
				
			
			@ -3,13 +3,23 @@
 | 
			
		|||
//!
 | 
			
		||||
//! Builtins are directly backed by Rust code operating on Nix values.
 | 
			
		||||
 | 
			
		||||
use crate::errors::ErrorKind;
 | 
			
		||||
use crate::{errors::ErrorKind, vm::VM};
 | 
			
		||||
 | 
			
		||||
use super::Value;
 | 
			
		||||
 | 
			
		||||
use std::fmt::{Debug, Display};
 | 
			
		||||
 | 
			
		||||
pub type BuiltinFn = fn(arg: Vec<Value>) -> Result<Value, ErrorKind>;
 | 
			
		||||
/// Function pointer type for builtins implemented directly by backing
 | 
			
		||||
/// Rust code.
 | 
			
		||||
///
 | 
			
		||||
/// Builtins declare their arity and are passed a vector with the
 | 
			
		||||
/// right number of arguments. Additionally, as they might have to
 | 
			
		||||
/// force the evaluation of thunks, they are passed a reference to the
 | 
			
		||||
/// current VM which they can use for forcing a value.
 | 
			
		||||
///
 | 
			
		||||
/// Errors returned from a builtin will be annotated with the location
 | 
			
		||||
/// of the call to the builtin.
 | 
			
		||||
pub type BuiltinFn = fn(arg: Vec<Value>, vm: &mut VM) -> Result<Value, ErrorKind>;
 | 
			
		||||
 | 
			
		||||
/// Represents a single built-in function which directly executes Rust
 | 
			
		||||
/// code that operates on a Nix value.
 | 
			
		||||
| 
						 | 
				
			
			@ -50,11 +60,11 @@ impl Builtin {
 | 
			
		|||
    /// Apply an additional argument to the builtin, which will either
 | 
			
		||||
    /// lead to execution of the function or to returning a partial
 | 
			
		||||
    /// builtin.
 | 
			
		||||
    pub fn apply(mut self, arg: Value) -> Result<Value, ErrorKind> {
 | 
			
		||||
    pub fn apply(mut self, vm: &mut VM, arg: Value) -> Result<Value, ErrorKind> {
 | 
			
		||||
        self.partials.push(arg);
 | 
			
		||||
 | 
			
		||||
        if self.partials.len() == self.arity {
 | 
			
		||||
            return (self.func)(self.partials);
 | 
			
		||||
            return (self.func)(self.partials, vm);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Function is not yet ready to be called.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue