fix(tvix/eval): handle thunks in arithmetic builtins
The simplest solution seems to be to pass references to arithmetic_op!() which avoids the moving annoyance we had to deal with in the builtins (no more popping!). We then use .force() to force the values and dereference any Thunks (which arithmetic_op! doesn't do for us). Change-Id: I0eb8ad60e80a0b3ba9d9f411e973ef8bcf136989 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6724 Tested-by: BuildkiteCI Reviewed-by: wpcarro <wpcarro@gmail.com> Reviewed-by: tazjin <tazjin@tvl.su>
This commit is contained in:
		
							parent
							
								
									55459f02fc
								
							
						
					
					
						commit
						64d3efcc2c
					
				
					 10 changed files with 32 additions and 28 deletions
				
			
		| 
						 | 
				
			
			@ -52,11 +52,11 @@ pub fn coerce_value_to_path(v: &Value, vm: &mut VM) -> Result<PathBuf, ErrorKind
 | 
			
		|||
/// WASM).
 | 
			
		||||
fn pure_builtins() -> Vec<Builtin> {
 | 
			
		||||
    vec![
 | 
			
		||||
        Builtin::new("add", &[true, true], |mut args, _| {
 | 
			
		||||
            let b = args.pop().unwrap();
 | 
			
		||||
            let a = args.pop().unwrap();
 | 
			
		||||
            arithmetic_op!(a, b, +)
 | 
			
		||||
        }),
 | 
			
		||||
        Builtin::new(
 | 
			
		||||
            "add",
 | 
			
		||||
            &[false, false],
 | 
			
		||||
            |args, vm| arithmetic_op!(&*args[0].force(vm)?, &*args[1].force(vm)?, +),
 | 
			
		||||
        ),
 | 
			
		||||
        Builtin::new("abort", &[true], |args, _| {
 | 
			
		||||
            return Err(ErrorKind::Abort(args[0].to_str()?.to_string()));
 | 
			
		||||
        }),
 | 
			
		||||
| 
						 | 
				
			
			@ -115,11 +115,11 @@ fn pure_builtins() -> Vec<Builtin> {
 | 
			
		|||
                std::cmp::Ordering::Greater => Ok(Value::Integer(1)),
 | 
			
		||||
            }
 | 
			
		||||
        }),
 | 
			
		||||
        Builtin::new("div", &[true, true], |mut args, _| {
 | 
			
		||||
            let b = args.pop().unwrap();
 | 
			
		||||
            let a = args.pop().unwrap();
 | 
			
		||||
            arithmetic_op!(a, b, /)
 | 
			
		||||
        }),
 | 
			
		||||
        Builtin::new(
 | 
			
		||||
            "div",
 | 
			
		||||
            &[false, false],
 | 
			
		||||
            |args, vm| arithmetic_op!(&*args[0].force(vm)?, &*args[1].force(vm)?, /),
 | 
			
		||||
        ),
 | 
			
		||||
        Builtin::new("elemAt", &[true, true], |args, _| {
 | 
			
		||||
            let xs = args[0].to_list()?;
 | 
			
		||||
            let i = args[1].as_int()?;
 | 
			
		||||
| 
						 | 
				
			
			@ -215,11 +215,11 @@ fn pure_builtins() -> Vec<Builtin> {
 | 
			
		|||
            let value = args[0].force(vm)?;
 | 
			
		||||
            Ok(Value::Bool(matches!(*value, Value::String(_))))
 | 
			
		||||
        }),
 | 
			
		||||
        Builtin::new("mul", &[true, true], |mut args, _| {
 | 
			
		||||
            let b = args.pop().unwrap();
 | 
			
		||||
            let a = args.pop().unwrap();
 | 
			
		||||
            arithmetic_op!(a, b, *)
 | 
			
		||||
        }),
 | 
			
		||||
        Builtin::new(
 | 
			
		||||
            "mul",
 | 
			
		||||
            &[false, false],
 | 
			
		||||
            |args, vm| arithmetic_op!(&*args[0].force(vm)?, &*args[1].force(vm)?, *),
 | 
			
		||||
        ),
 | 
			
		||||
        Builtin::new("splitVersion", &[true], |args, _| {
 | 
			
		||||
            let s = args[0].to_str()?;
 | 
			
		||||
            let s = VersionPartsIter::new(s.as_str());
 | 
			
		||||
| 
						 | 
				
			
			@ -234,11 +234,11 @@ fn pure_builtins() -> Vec<Builtin> {
 | 
			
		|||
                .collect::<Vec<Value>>();
 | 
			
		||||
            Ok(Value::List(NixList::construct(parts.len(), parts)))
 | 
			
		||||
        }),
 | 
			
		||||
        Builtin::new("sub", &[true, true], |mut args, _| {
 | 
			
		||||
            let b = args.pop().unwrap();
 | 
			
		||||
            let a = args.pop().unwrap();
 | 
			
		||||
            arithmetic_op!(a, b, -)
 | 
			
		||||
        }),
 | 
			
		||||
        Builtin::new(
 | 
			
		||||
            "sub",
 | 
			
		||||
            &[false, false],
 | 
			
		||||
            |args, vm| arithmetic_op!(&*args[0].force(vm)?, &*args[1].force(vm)?, -),
 | 
			
		||||
        ),
 | 
			
		||||
        Builtin::new("substring", &[true, true, true], |args, _| {
 | 
			
		||||
            let beg = args[0].as_int()?;
 | 
			
		||||
            let len = args[1].as_int()?;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue