feat(tvix/eval): rm NixContext::join, add take_context & IntoIterator
In places where we want to extend context with that from another NixString, use take_context() to split it off, then call .extend(), making use of IntoIterator to avoid a bunch of clones. Change-Id: I2460141a3ed776c64c36132b2203b6a1d710b922 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11705 Tested-by: BuildkiteCI Autosubmit: flokli <flokli@flokli.de> Reviewed-by: edef <edef@edef.eu>
This commit is contained in:
parent
ec8d79f3db
commit
649a862ae1
6 changed files with 57 additions and 60 deletions
|
|
@ -47,8 +47,8 @@ impl Value {
|
|||
|
||||
for val in l.into_iter() {
|
||||
match generators::request_to_json(co, val).await {
|
||||
Ok((v, mut ctx)) => {
|
||||
context = context.join(&mut ctx);
|
||||
Ok((v, ctx)) => {
|
||||
context.extend(ctx.into_iter());
|
||||
out.push(v)
|
||||
}
|
||||
Err(cek) => return Ok(Err(cek)),
|
||||
|
|
@ -100,8 +100,8 @@ impl Value {
|
|||
out.insert(
|
||||
name.to_str()?.to_owned(),
|
||||
match generators::request_to_json(co, value).await {
|
||||
Ok((v, mut ctx)) => {
|
||||
context = context.join(&mut ctx);
|
||||
Ok((v, ctx)) => {
|
||||
context.extend(ctx.into_iter());
|
||||
v
|
||||
}
|
||||
Err(cek) => return Ok(Err(cek)),
|
||||
|
|
|
|||
|
|
@ -338,8 +338,8 @@ impl Value {
|
|||
let coerced: Result<BString, _> = match (value, kind) {
|
||||
// coercions that are always done
|
||||
(Value::String(mut s), _) => {
|
||||
if let Some(ctx) = s.context_mut() {
|
||||
context = context.join(ctx);
|
||||
if let Some(ctx) = s.take_context() {
|
||||
context.extend(ctx.into_iter());
|
||||
}
|
||||
Ok((*s).into())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -78,15 +78,6 @@ impl NixContext {
|
|||
self
|
||||
}
|
||||
|
||||
/// Consumes both ends of the join into a new NixContent
|
||||
/// containing the union of elements of both ends.
|
||||
pub fn join(mut self, other: &mut NixContext) -> Self {
|
||||
let other_set = std::mem::take(&mut other.0);
|
||||
let mut set: HashSet<NixContextElement> = std::mem::take(&mut self.0);
|
||||
set.extend(other_set);
|
||||
Self(set)
|
||||
}
|
||||
|
||||
/// Extends the existing context with more context elements.
|
||||
pub fn extend<T>(&mut self, iter: T)
|
||||
where
|
||||
|
|
@ -162,6 +153,16 @@ impl NixContext {
|
|||
}
|
||||
}
|
||||
|
||||
impl IntoIterator for NixContext {
|
||||
type Item = NixContextElement;
|
||||
|
||||
type IntoIter = std::collections::hash_set::IntoIter<NixContextElement>;
|
||||
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
self.0.into_iter()
|
||||
}
|
||||
}
|
||||
|
||||
/// This type is never instantiated, but serves to document the memory layout of the actual heap
|
||||
/// allocation for Nix strings.
|
||||
#[allow(dead_code)]
|
||||
|
|
@ -715,8 +716,10 @@ impl NixString {
|
|||
let context = [self.context(), other.context()]
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.fold(NixContext::new(), |acc_ctx, new_ctx| {
|
||||
acc_ctx.join(&mut new_ctx.clone())
|
||||
.fold(NixContext::new(), |mut acc_ctx, new_ctx| {
|
||||
// TODO: consume new_ctx?
|
||||
acc_ctx.extend(new_ctx.iter().cloned());
|
||||
acc_ctx
|
||||
});
|
||||
Self::new_context_from(context, s)
|
||||
}
|
||||
|
|
@ -730,13 +733,13 @@ impl NixString {
|
|||
unsafe { NixStringInner::context_ref(self.0).as_deref() }
|
||||
}
|
||||
|
||||
pub(crate) fn context_mut(&mut self) -> Option<&mut NixContext> {
|
||||
pub(crate) fn context_mut(&mut self) -> &mut Option<Box<NixContext>> {
|
||||
// SAFETY: There's no way to construct an uninitialized or invalid NixString (see the SAFETY
|
||||
// comment in `new`).
|
||||
//
|
||||
// Also, we're using the same lifetime and mutability as self, to fit the
|
||||
// pointer-to-reference conversion rules
|
||||
unsafe { NixStringInner::context_mut(self.0).as_deref_mut() }
|
||||
unsafe { NixStringInner::context_mut(self.0) }
|
||||
}
|
||||
|
||||
pub fn iter_context(&self) -> impl Iterator<Item = &NixContext> {
|
||||
|
|
@ -764,12 +767,16 @@ impl NixString {
|
|||
self.context().is_some()
|
||||
}
|
||||
|
||||
/// This clears the context of the string, returning
|
||||
/// the removed dependency tracking information.
|
||||
pub fn take_context(&mut self) -> Option<Box<NixContext>> {
|
||||
self.context_mut().take()
|
||||
}
|
||||
|
||||
/// This clears the context of that string, losing
|
||||
/// all dependency tracking information.
|
||||
pub fn clear_context(&mut self) {
|
||||
// SAFETY: There's no way to construct an uninitialized or invalid NixString (see the SAFETY
|
||||
// comment in `new`).
|
||||
*unsafe { NixStringInner::context_mut(self.0) } = None;
|
||||
let _ = self.take_context();
|
||||
}
|
||||
|
||||
pub fn chars(&self) -> Chars<'_> {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue