feat(tvix/eval): make NixList::clone() cheap

When we start unrecursivifying (sp?) things, Rust's borrow checker
is going to be a headache; its magic only works when you use the CPU
stack as your call stack.

Fixing the borrow checker issues usually involves adding lots of
`clone()`s.  Right now `NixList` is the only variant of `Value` that
isn't cheap to clone() -- all the others are either a wrapper around
Rc or else are of bounded size.

Note that this requires dropping the `DerefMut for NixList` instance
and using `Vec<Value>` instead in those situations.

Change-Id: I5a47df66855342aa2064f8f3cb7934ff422d26bd
Signed-off-by: Adam Joseph <adam@westernsemico.com>
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7359
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
Adam Joseph 2022-11-23 00:34:09 -08:00 committed by clbot
parent c537cc6fce
commit a740653c83
3 changed files with 36 additions and 38 deletions

View file

@ -538,8 +538,9 @@ impl<'o> VM<'o> {
OpCode::OpConcat => {
let rhs = fallible!(self, self.pop().to_list());
let lhs = fallible!(self, self.pop().to_list());
self.push(Value::List(lhs.concat(&rhs)))
let mut lhs = fallible!(self, self.pop().to_list()).into_vec();
lhs.extend_from_slice(&rhs);
self.push(Value::List(NixList::from(lhs)))
}
OpCode::OpInterpolate(Count(count)) => self.run_interpolate(count)?,