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
|
@ -71,7 +71,7 @@ macro_rules! arithmetic_op {
|
|||
( $self:ident, $op:tt ) => {{
|
||||
let b = $self.pop();
|
||||
let a = $self.pop();
|
||||
let result = fallible!($self, arithmetic_op!(a, b, $op));
|
||||
let result = fallible!($self, arithmetic_op!(&a, &b, $op));
|
||||
$self.push(result);
|
||||
}};
|
||||
|
||||
|
@ -79,8 +79,8 @@ macro_rules! arithmetic_op {
|
|||
match ($a, $b) {
|
||||
(Value::Integer(i1), Value::Integer(i2)) => Ok(Value::Integer(i1 $op i2)),
|
||||
(Value::Float(f1), Value::Float(f2)) => Ok(Value::Float(f1 $op f2)),
|
||||
(Value::Integer(i1), Value::Float(f2)) => Ok(Value::Float(i1 as f64 $op f2)),
|
||||
(Value::Float(f1), Value::Integer(i2)) => Ok(Value::Float(f1 $op i2 as f64)),
|
||||
(Value::Integer(i1), Value::Float(f2)) => Ok(Value::Float(*i1 as f64 $op f2)),
|
||||
(Value::Float(f1), Value::Integer(i2)) => Ok(Value::Float(f1 $op *i2 as f64)),
|
||||
|
||||
(v1, v2) => Err(ErrorKind::TypeError {
|
||||
expected: "number (either int or float)",
|
||||
|
@ -264,7 +264,7 @@ impl<'o> VM<'o> {
|
|||
let result = if let (Value::String(s1), Value::String(s2)) = (&a, &b) {
|
||||
Value::String(s1.concat(s2))
|
||||
} else {
|
||||
fallible!(self, arithmetic_op!(a, b, +))
|
||||
fallible!(self, arithmetic_op!(&a, &b, +))
|
||||
};
|
||||
|
||||
self.push(result)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue