mirror of
https://github.com/NixOS/nix.git
synced 2025-11-10 04:26:01 +01:00
since `up` and `values` are both pointer-aligned the type field will
also be pointer-aligned, wasting 48 bits of space on most machines. we
can get away with removing the type field altogether by encoding some
information into the `with` expr that created the env to begin with,
reducing the GC load for the absolutely massive amount of single-entry
envs we create for lambdas. this reduces memory usage of system eval by
quite a bit (reducing heap size of our system eval from 8.4GB to 8.23GB)
and gives similar savings in eval time.
running `nix eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'`
before:
Time (mean ± σ): 5.576 s ± 0.003 s [User: 5.197 s, System: 0.378 s]
Range (min … max): 5.572 s … 5.581 s 10 runs
after:
Time (mean ± σ): 5.408 s ± 0.002 s [User: 5.019 s, System: 0.388 s]
Range (min … max): 5.405 s … 5.411 s 10 runs
31 lines
796 B
Markdown
31 lines
796 B
Markdown
---
|
|
synopsis: Better error reporting for `with` expressions
|
|
prs: 9658
|
|
---
|
|
|
|
`with` expressions using non-attrset values to resolve variables are now reported with proper positions.
|
|
|
|
Previously an incorrect `with` expression would report no position at all, making it hard to determine where the error originated:
|
|
|
|
```
|
|
nix-repl> with 1; a
|
|
error:
|
|
… <borked>
|
|
|
|
at «none»:0: (source not available)
|
|
|
|
error: value is an integer while a set was expected
|
|
```
|
|
|
|
Now position information is preserved and reported as with most other errors:
|
|
|
|
```
|
|
nix-repl> with 1; a
|
|
error:
|
|
… while evaluating the first subexpression of a with expression
|
|
at «string»:1:1:
|
|
1| with 1; a
|
|
| ^
|
|
|
|
error: value is an integer while a set was expected
|
|
```
|