fix(tvix/eval): propagate errs from key comparison in genericClosure
The accompanying test case shows that we need to bubble up the catchable error from the equality check if one is created. Change-Id: Ic9929a57aa7653c8aa5a72d1711cf3264798c731 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11159 Tested-by: BuildkiteCI Autosubmit: sterni <sternenseemann@systemli.org> Reviewed-by: tazjin <tazjin@tvl.su>
This commit is contained in:
parent
d1b7e08726
commit
d4cb83d58b
3 changed files with 17 additions and 7 deletions
|
|
@ -501,7 +501,13 @@ mod pure_builtins {
|
||||||
let attrs = val.to_attrs()?;
|
let attrs = val.to_attrs()?;
|
||||||
let key = attrs.select_required("key")?;
|
let key = attrs.select_required("key")?;
|
||||||
|
|
||||||
if !bgc_insert_key(&co, key.clone(), &mut done_keys).await? {
|
let value_missing = bgc_insert_key(&co, key.clone(), &mut done_keys).await?;
|
||||||
|
|
||||||
|
if let Err(cek) = value_missing {
|
||||||
|
return Ok(Value::Catchable(Box::new(cek)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Ok(false) = value_missing {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1485,7 +1491,11 @@ mod pure_builtins {
|
||||||
|
|
||||||
/// Internal helper function for genericClosure, determining whether a
|
/// Internal helper function for genericClosure, determining whether a
|
||||||
/// value has been seen before.
|
/// value has been seen before.
|
||||||
async fn bgc_insert_key(co: &GenCo, key: Value, done: &mut Vec<Value>) -> Result<bool, ErrorKind> {
|
async fn bgc_insert_key(
|
||||||
|
co: &GenCo,
|
||||||
|
key: Value,
|
||||||
|
done: &mut Vec<Value>,
|
||||||
|
) -> Result<Result<bool, CatchableErrorKind>, ErrorKind> {
|
||||||
for existing in done.iter() {
|
for existing in done.iter() {
|
||||||
match generators::check_equality(
|
match generators::check_equality(
|
||||||
co,
|
co,
|
||||||
|
|
@ -1496,16 +1506,14 @@ async fn bgc_insert_key(co: &GenCo, key: Value, done: &mut Vec<Value>) -> Result
|
||||||
)
|
)
|
||||||
.await?
|
.await?
|
||||||
{
|
{
|
||||||
Ok(true) => return Ok(false),
|
Ok(true) => return Ok(Ok(false)),
|
||||||
Ok(false) => (),
|
Ok(false) => (),
|
||||||
Err(_cek) => {
|
Err(cek) => return Ok(Err(cek)),
|
||||||
unimplemented!("TODO(amjoseph): not sure what the correct behavior is here")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
done.push(key);
|
done.push(key);
|
||||||
Ok(true)
|
Ok(Ok(true))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The set of standard pure builtins in Nix, mostly concerned with
|
/// The set of standard pure builtins in Nix, mostly concerned with
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{ success = false; value = false; }
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
builtins.tryEval (builtins.genericClosure { operator = (_: [{ key = throw "lol"; }]); startSet = [{ key = "lol"; }]; })
|
||||||
Loading…
Add table
Add a link
Reference in a new issue