feat(tvix/value): introduce string representation with &'static str

For cases where the strings are statically known (such as the
oft-occuring name/value), this can be a useful optimisation.

It's also much more convenient in tests.

Change-Id: Ie462b684805bd4986ea5e85ca4bff663bc2d3c3c
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6111
Tested-by: BuildkiteCI
Reviewed-by: eta <tvl@eta.st>
This commit is contained in:
Vincent Ambo 2022-08-10 17:53:22 +03:00 committed by tazjin
parent c7ba2dec04
commit 6dc9ca5723
4 changed files with 44 additions and 26 deletions

View file

@ -71,14 +71,8 @@ impl NixAttrs {
NixAttrs::KV { name, value } => {
*self = NixAttrs::Map(BTreeMap::from([
(
NixString("name".into()),
std::mem::replace(name, Value::Blackhole),
),
(
NixString("value".into()),
std::mem::replace(value, Value::Blackhole),
),
("name".into(), std::mem::replace(name, Value::Blackhole)),
("value".into(), std::mem::replace(value, Value::Blackhole)),
]));
self.map_mut()
}
@ -155,14 +149,14 @@ impl NixAttrs {
fn attempt_optimise_kv(slice: &mut [Value]) -> Option<NixAttrs> {
let (name_idx, value_idx) = {
match (&slice[2], &slice[0]) {
(Value::String(NixString(s1)), Value::String(NixString(s2)))
if (s1 == "name" && s2 == "value") =>
(Value::String(s1), Value::String(s2))
if (*s1 == NixString::NAME && *s2 == NixString::VALUE) =>
{
(3, 1)
}
(Value::String(NixString(s1)), Value::String(NixString(s2)))
if (s1 == "value" && s2 == "name") =>
(Value::String(s1), Value::String(s2))
if (*s1 == NixString::VALUE && *s2 == NixString::NAME) =>
{
(1, 3)
}
@ -189,7 +183,7 @@ fn set_attr(attrs: &mut NixAttrs, key: NixString, value: Value) -> EvalResult<()
match entry {
std::collections::btree_map::Entry::Occupied(entry) => {
return Err(Error::DuplicateAttrsKey {
key: entry.key().0.clone(),
key: entry.key().as_str().to_string(),
})
}
@ -254,7 +248,7 @@ fn set_nested_attr(
_ => {
return Err(Error::DuplicateAttrsKey {
key: entry.key().0.clone(),
key: entry.key().as_str().to_string(),
})
}
},