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 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
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
{ success = false; value = false; }
|
|
@ -0,0 +1 @@
|
|||
builtins.tryEval (builtins.genericClosure { operator = (_: [{ key = throw "lol"; }]); startSet = [{ key = "lol"; }]; })
|
Loading…
Reference in a new issue