feat(tvix/eval): implement attrset update (//) operator
The underlying implementation does a few tricks based on which pair of attrset representations is encountered. Particularly the effect of short-circuiting the empty cases might be relevant in nixpkgs/NixOS, due to the use of lib.optionalAttrs. Change-Id: I22b978b1c69af12926489a71087c6a6219c012f3 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6140 Reviewed-by: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI
This commit is contained in:
parent
fa2d250d1a
commit
058e77bab2
13 changed files with 87 additions and 1 deletions
|
|
@ -117,8 +117,17 @@ impl VM {
|
|||
OpCode::OpNull => self.push(Value::Null),
|
||||
OpCode::OpTrue => self.push(Value::Bool(true)),
|
||||
OpCode::OpFalse => self.push(Value::Bool(false)),
|
||||
|
||||
OpCode::OpAttrs(count) => self.run_attrset(count)?,
|
||||
OpCode::OpAttrPath(count) => self.run_attr_path(count)?,
|
||||
|
||||
OpCode::OpAttrsUpdate => {
|
||||
let rhs = self.pop().as_attrs()?;
|
||||
let lhs = self.pop().as_attrs()?;
|
||||
|
||||
self.push(Value::Attrs(Rc::new(lhs.update(&rhs))))
|
||||
}
|
||||
|
||||
OpCode::OpList(count) => self.run_list(count)?,
|
||||
OpCode::OpInterpolate(count) => self.run_interpolate(count)?,
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue