fix(tvix): Catch errors for generator in some builtins

Nix doesn't propagate errors for the function argument to some builtins,
like genList and map:

    ❯ nix repl
    Welcome to Nix version 2.3.17. Type :? for help.

    nix-repl> (builtins.tryEval (builtins.genList (builtins.throw "a") 10)).success
    true

    nix-repl> (builtins.tryEval (builtins.map (builtins.throw "a") [ "" ])).success
    true

Note that this is untested as of this particular commit, only because a
big test suite covering all sorts of catchable error propagation issues
is coming next

Change-Id: I48c8eb390a541204b1a6d438c753fa1ca9b3877e
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10753
Autosubmit: aspen <root@gws.fyi>
Tested-by: BuildkiteCI
Reviewed-by: raitobezarius <tvl@lahfa.xyz>
This commit is contained in:
Aspen Smith 2024-02-08 16:40:24 -05:00 committed by clbot
parent 17036718df
commit ddb7bc8d18

View file

@ -524,7 +524,8 @@ mod pure_builtins {
#[builtin("genList")]
async fn builtin_gen_list(
co: GenCo,
generator: Value,
// Nix 2.3 doesn't propagate failures here
#[catch] generator: Value,
length: Value,
) -> Result<Value, ErrorKind> {
let mut out = imbl::Vector::<Value>::new();
@ -911,7 +912,7 @@ mod pure_builtins {
}
#[builtin("map")]
async fn builtin_map(co: GenCo, f: Value, list: Value) -> Result<Value, ErrorKind> {
async fn builtin_map(co: GenCo, #[catch] f: Value, list: Value) -> Result<Value, ErrorKind> {
let mut out = imbl::Vector::<Value>::new();
// the best span we can get…