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:
sterni 2024-03-15 22:46:00 +01:00 committed by clbot
parent d1b7e08726
commit d4cb83d58b
3 changed files with 17 additions and 7 deletions

View file

@ -501,7 +501,13 @@ mod pure_builtins {
let attrs = val.to_attrs()?;
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;
}
@ -1485,7 +1491,11 @@ mod pure_builtins {
/// Internal helper function for genericClosure, determining whether a
/// 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() {
match generators::check_equality(
co,
@ -1496,16 +1506,14 @@ async fn bgc_insert_key(co: &GenCo, key: Value, done: &mut Vec<Value>) -> Result
)
.await?
{
Ok(true) => return Ok(false),
Ok(true) => return Ok(Ok(false)),
Ok(false) => (),
Err(_cek) => {
unimplemented!("TODO(amjoseph): not sure what the correct behavior is here")
}
Err(cek) => return Ok(Err(cek)),
}
}
done.push(key);
Ok(true)
Ok(Ok(true))
}
/// The set of standard pure builtins in Nix, mostly concerned with

View file

@ -0,0 +1 @@
{ success = false; value = false; }

View file

@ -0,0 +1 @@
builtins.tryEval (builtins.genericClosure { operator = (_: [{ key = throw "lol"; }]); startSet = [{ key = "lol"; }]; })