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:
parent
f6bcd11cad
commit
278bccc1ea
4 changed files with 13 additions and 6 deletions
|
@ -6,7 +6,6 @@
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::collections::{BTreeMap, HashMap};
|
use std::collections::{BTreeMap, HashMap};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::rc::Rc;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
errors::ErrorKind,
|
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
|
globals
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//! Support for configurable generation of arbitrary nix values
|
//! Support for configurable generation of arbitrary nix values
|
||||||
|
|
||||||
use proptest::{prelude::*, strategy::BoxedStrategy};
|
use proptest::{prelude::*, strategy::BoxedStrategy};
|
||||||
use std::{ffi::OsString, rc::Rc};
|
use std::ffi::OsString;
|
||||||
|
|
||||||
use super::{NixAttrs, NixList, NixString, Value};
|
use super::{NixAttrs, NixList, NixString, Value};
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ fn non_internal_value() -> impl Strategy<Value = Value> {
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Parameters::Strategy(inner.clone())
|
Parameters::Strategy(inner.clone())
|
||||||
))
|
))
|
||||||
.prop_map(|a| Value::Attrs(Rc::new(a))),
|
.prop_map(Value::attrs),
|
||||||
any_with::<NixList>((Default::default(), Parameters::Strategy(inner)))
|
any_with::<NixList>((Default::default(), Parameters::Strategy(inner)))
|
||||||
.prop_map(Value::List)
|
.prop_map(Value::List)
|
||||||
]
|
]
|
||||||
|
|
|
@ -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 {
|
impl Value {
|
||||||
/// Coerce a `Value` to a string. See `CoercionKind` for a rundown of what
|
/// Coerce a `Value` to a string. See `CoercionKind` for a rundown of what
|
||||||
/// input types are accepted under what circumstances.
|
/// input types are accepted under what circumstances.
|
||||||
|
|
|
@ -374,7 +374,7 @@ impl<'o> VM<'o> {
|
||||||
let rhs = unwrap_or_clone_rc(fallible!(self, self.pop().to_attrs()));
|
let rhs = unwrap_or_clone_rc(fallible!(self, self.pop().to_attrs()));
|
||||||
let lhs = 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 => {
|
OpCode::OpAttrsSelect => {
|
||||||
|
@ -641,7 +641,7 @@ impl<'o> VM<'o> {
|
||||||
NixAttrs::construct(count, self.stack.split_off(self.stack.len() - count * 2))
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue