refactor(tvix/eval): Encapsulate Value::Attrs construction

Factor out the construction of Value::Attrs (including the Rc) into a
new `attrs` constructor function, to abstract away the presence of the
Rc itself.

Change-Id: I42fd4c3841e1db368db999ddd651277ff995f025
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6892
Autosubmit: grfn <grfn@gws.fyi>
Reviewed-by: sterni <sternenseemann@systemli.org>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
Griffin Smith 2022-10-08 13:33:33 -04:00 committed by grfn
parent f6bcd11cad
commit 278bccc1ea
4 changed files with 13 additions and 6 deletions

View file

@ -6,7 +6,6 @@
use std::cmp;
use std::collections::{BTreeMap, HashMap};
use std::path::PathBuf;
use std::rc::Rc;
use crate::{
errors::ErrorKind,
@ -439,7 +438,7 @@ pub fn global_builtins() -> HashMap<&'static str, Value> {
}
}
globals.insert("builtins", Value::Attrs(Rc::new(builtins)));
globals.insert("builtins", Value::attrs(builtins));
globals
}

View file

@ -1,7 +1,7 @@
//! Support for configurable generation of arbitrary nix values
use proptest::{prelude::*, strategy::BoxedStrategy};
use std::{ffi::OsString, rc::Rc};
use std::ffi::OsString;
use super::{NixAttrs, NixList, NixString, Value};
@ -70,7 +70,7 @@ fn non_internal_value() -> impl Strategy<Value = Value> {
Default::default(),
Parameters::Strategy(inner.clone())
))
.prop_map(|a| Value::Attrs(Rc::new(a))),
.prop_map(Value::attrs),
any_with::<NixList>((Default::default(), Parameters::Strategy(inner)))
.prop_map(Value::List)
]

View file

@ -115,6 +115,14 @@ impl<'a> Deref for ForceResult<'a> {
}
}
/// Constructors
impl Value {
/// Construct a [`Value::Attrs`] from a [`NixAttrs`].
pub fn attrs(attrs: NixAttrs) -> Self {
Self::Attrs(Rc::new(attrs))
}
}
impl Value {
/// Coerce a `Value` to a string. See `CoercionKind` for a rundown of what
/// input types are accepted under what circumstances.

View file

@ -374,7 +374,7 @@ impl<'o> VM<'o> {
let rhs = unwrap_or_clone_rc(fallible!(self, self.pop().to_attrs()));
let lhs = unwrap_or_clone_rc(fallible!(self, self.pop().to_attrs()));
self.push(Value::Attrs(Rc::new(lhs.update(rhs))))
self.push(Value::attrs(lhs.update(rhs)))
}
OpCode::OpAttrsSelect => {
@ -641,7 +641,7 @@ impl<'o> VM<'o> {
NixAttrs::construct(count, self.stack.split_off(self.stack.len() - count * 2))
);
self.push(Value::Attrs(Rc::new(attrs)));
self.push(Value::attrs(attrs));
Ok(())
}