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:
parent
c537cc6fce
commit
a740653c83
3 changed files with 36 additions and 38 deletions
|
|
@ -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)?,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue