fix(tvix/eval): use normal thunking behavior for default in formals

When comparing to C++ Nix, we notice that the thunking of default
expressions in function formals corresponds to their normal thunking,
e.g. literals are not thunked. This means that we can just invoke
compile() without much of a care and trust that it will sort it out
correctly.

If function formals blow up as a result of this, it likely indicates
that the expression is treated incorrectly by compile(), not
compile_param_pattern().

Change-Id: I64acbff2f251423eb72ce43e56a0603379305e1d
Reviewed-on: https://cl.tvl.fyi/c/depot/+/8704
Autosubmit: sterni <sternenseemann@systemli.org>
Tested-by: BuildkiteCI
Reviewed-by: tazjin <tazjin@tvl.su>
This commit is contained in:
sterni 2023-06-02 23:05:32 +02:00 committed by clbot
parent 10c6cb7251
commit a2303da01f
2 changed files with 7 additions and 9 deletions

View file

@ -950,15 +950,8 @@ impl Compiler<'_> {
self.patch_jump(jump_to_default);
// Thunk the default expression, but only if it is something
// other than an identifier.
if let ast::Expr::Ident(_) = &default_expr {
self.compile(*idx, default_expr);
} else {
self.thunk(*idx, &self.span_for(&default_expr), move |c, s| {
c.compile(s, default_expr)
});
}
// Does not need to thunked since compile() already does so when necessary
self.compile(*idx, default_expr);
self.patch_jump(jump_over_default);
} else {

View file

@ -154,4 +154,9 @@ compare_lazy_eval_tests! {
thunked_lambda_in_list("[ (x: x) ]");
thunked_function_application_in_list("[ (builtins.add 1 2) ]");
thunked_legacy_let_in_list("[ (let { foo = 12; body = foo; }) ]");
unthunked_formals_fallback_literal("({ foo ? 12 }: [ foo ]) { }");
unthunked_formals_fallback_string_literal("({ foo ? \"wiggly\" }: [ foo ]) { }");
thunked_formals_fallback_application("({ foo ? builtins.add 1 2 }: [ foo ]) { }");
thunked_formals_fallback_name_resolution_literal("({ foo ? bar, bar ? 12 }: [ foo ]) { }");
}