fix(tvix/eval): OpAdd must weakly stringify if either arg is string

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>
This commit is contained in:
Adam Joseph 2022-11-24 02:46:45 -08:00 committed by clbot
parent f93944a799
commit 4b09f01571
3 changed files with 20 additions and 1 deletions

View file

@ -0,0 +1 @@
[ "lordnikon" "zerocool" /tmp/31337h4x0r "fooblah" "blahfoo" ]

View file

@ -0,0 +1,7 @@
[
({ __toString = _: "lord"; } + "nikon")
("zero" + { __toString = _: "cool"; })
(/tmp/31337 + "h4x0r")
("foo" + { outPath="blah"; })
({ outPath="blah"; } + "foo")
]

View file

@ -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, +)),
};