about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGriffin Smith <root@gws.fyi>2022-10-23T16·25-0400
committergrfn <grfn@gws.fyi>2022-10-23T17·39+0000
commit89aee6443c0211759480911f3e4f9a7ce9eb2423 (patch)
tree5c9540c5e42fbaf61c03241113a4f85b4bfc3902
parentd4569cb5046882dd5d4c8f3b187d167119186fa5 (diff)
fix(tvix/eval): Use natural arg order for call_with r/5187
Since we push arguments onto a stack when calling multi-argument
functions, we actually were ending up calling `call_with` with the
arguments in the *reverse order* - we patched around this by passing the
arguments in the reverse order for `foldl'`, but it makes more sense to
have them just be the order that the function would be called with in
user surface code instead.

Change-Id: Ifddb98f46970ac89872383709c3ce758dc965c65
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7067
Reviewed-by: sterni <sternenseemann@systemli.org>
Autosubmit: grfn <grfn@gws.fyi>
Tested-by: BuildkiteCI
-rw-r--r--tvix/eval/src/builtins/mod.rs2
-rw-r--r--tvix/eval/src/vm.rs3
2 files changed, 3 insertions, 2 deletions
diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs
index 073edf8ffb..ecd19213c3 100644
--- a/tvix/eval/src/builtins/mod.rs
+++ b/tvix/eval/src/builtins/mod.rs
@@ -277,7 +277,7 @@ fn pure_builtins() -> Vec<Builtin> {
                 let mut res = args.pop().unwrap();
                 let op = args.pop().unwrap();
                 for val in list {
-                    res = vm.call_with(&op, [val, res])?;
+                    res = vm.call_with(&op, [res, val])?;
                     res.force(vm)?;
                 }
 
diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs
index 4d049c6d71..08c913ed2d 100644
--- a/tvix/eval/src/vm.rs
+++ b/tvix/eval/src/vm.rs
@@ -265,9 +265,10 @@ impl<'o> VM<'o> {
     pub fn call_with<I>(&mut self, callable: &Value, args: I) -> EvalResult<Value>
     where
         I: IntoIterator<Item = Value>,
+        I::IntoIter: DoubleEndedIterator,
     {
         let mut num_args = 0_usize;
-        for arg in args {
+        for arg in args.into_iter().rev() {
             num_args += 1;
             self.push(arg);
         }