refactor(tvix/eval): encapsulate list construction in value::list

Ensuring that the implementation is not leaking out of the module lets
us keep things open for optimisations (e.g. empty list or pairs
through tuples).

Change-Id: I18fd9b7740f28c55736471e16c6b4095a05dd6d0
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6145
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
Vincent Ambo 2022-08-11 11:55:59 +03:00 committed by tazjin
parent 75a22321ce
commit 9407af5684
2 changed files with 17 additions and 17 deletions

View file

@ -150,7 +150,11 @@ impl VM {
self.push(Value::Attrs(Rc::new(lhs.update(&rhs))))
}
OpCode::OpList(count) => self.run_list(count)?,
OpCode::OpList(count) => {
let list =
NixList::construct(count, self.stack.split_off(self.stack.len() - count));
self.push(Value::List(list));
}
OpCode::OpConcat => {
let rhs = self.pop().as_list()?;
@ -204,21 +208,6 @@ impl VM {
self.push(Value::String(out.into()));
Ok(())
}
// Construct runtime representation of a list. Because the list
// items are on the stack in reverse order, the vector is created
// initialised and elements are directly assigned to their
// respective indices.
fn run_list(&mut self, count: usize) -> EvalResult<()> {
let mut list = vec![Value::Null; count];
for idx in 0..count {
list[count - idx - 1] = self.pop();
}
self.push(Value::List(NixList(list)));
Ok(())
}
}
pub fn run_chunk(chunk: Chunk) -> EvalResult<Value> {