diff options
author | Adam Joseph <adam@westernsemico.com> | 2022-11-24T10·46-0800 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2022-11-26T19·37+0000 |
commit | 4b09f015711230bcb51135e63e58dcfeb0da0510 (patch) | |
tree | 12ecbafb81d9c334f6ac4f6cc4cd50a78ff85b95 /tvix/eval | |
parent | f93944a79922cd1c431077542552472358215478 (diff) |
fix(tvix/eval): OpAdd must weakly stringify if either arg is string r/5339
Tests included. Change-Id: I7a4905d6103813373e383e2e8629c5fd243d6bca Reviewed-on: https://cl.tvl.fyi/c/depot/+/7377 Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su> Autosubmit: Adam Joseph <adam@westernsemico.com>
Diffstat (limited to 'tvix/eval')
-rw-r--r-- | tvix/eval/src/tests/tvix_tests/eval-okay-coerce-opadd.exp | 1 | ||||
-rw-r--r-- | tvix/eval/src/tests/tvix_tests/eval-okay-coerce-opadd.nix | 7 | ||||
-rw-r--r-- | tvix/eval/src/vm.rs | 13 |
3 files changed, 20 insertions, 1 deletions
diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-coerce-opadd.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-coerce-opadd.exp new file mode 100644 index 000000000000..d874518a37ed --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-coerce-opadd.exp @@ -0,0 +1 @@ +[ "lordnikon" "zerocool" /tmp/31337h4x0r "fooblah" "blahfoo" ] diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-coerce-opadd.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-coerce-opadd.nix new file mode 100644 index 000000000000..6ddd30e7a189 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-coerce-opadd.nix @@ -0,0 +1,7 @@ +[ + ({ __toString = _: "lord"; } + "nikon") + ("zero" + { __toString = _: "cool"; }) + (/tmp/31337 + "h4x0r") + ("foo" + { outPath="blah"; }) + ({ outPath="blah"; } + "foo") +] diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs index 1ae97908e559..aa03ffd1eaae 100644 --- a/tvix/eval/src/vm.rs +++ b/tvix/eval/src/vm.rs @@ -399,7 +399,6 @@ impl<'o> VM<'o> { let a = self.pop(); let result = match (&a, &b) { - (Value::String(s1), Value::String(s2)) => Value::String(s1.concat(s2)), (Value::Path(p), v) => { let mut path = p.to_string_lossy().into_owned(); path.push_str( @@ -408,6 +407,18 @@ impl<'o> VM<'o> { ); crate::value::canon_path(PathBuf::from(path)).into() } + (Value::String(s1), Value::String(s2)) => Value::String(s1.concat(s2)), + (Value::String(s1), v) => Value::String( + s1.concat( + &v.coerce_to_string(CoercionKind::Weak, self) + .map_err(|ek| self.error(ek))?, + ), + ), + (v, Value::String(s2)) => Value::String( + v.coerce_to_string(CoercionKind::Weak, self) + .map_err(|ek| self.error(ek))? + .concat(s2), + ), _ => fallible!(self, arithmetic_op!(&a, &b, +)), }; |