fix(tvix/eval): place plain inherits in correct stack slots
We need to make sure that we compile all plain inherits in a let expression before declaring any other locals. Plain inherits are special in the sense that they can never be recursive, instead resolving to a higher scope. Thus we need to compile their value, before declaring them. If we don't do that, before any other local can be declared, we cause a situation where the plain inherits' values are placed into other locals' stack slots. Note that we can't integrate the plain inherit compilation into the regular 2-3 phase model where we defer the compilation of the value or we'd compile `let inherit x; in …` as `let x = x; in …`. Change-Id: I951d5df3c9661a054e12401546875f4685b5bf08 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6496 Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su> Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
bb1adbb05b
commit
7046604cfe
3 changed files with 62 additions and 27 deletions
|
|
@ -0,0 +1 @@
|
|||
[ 1 2 3 4 ]
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
# This test mixes different ways of creating bindings in a let … in expression
|
||||
# to make sure that the compiler initialises the locals in the same order as
|
||||
# they are declared.
|
||||
|
||||
let
|
||||
d = 4;
|
||||
in
|
||||
|
||||
# Trick to allow useless inherits in the following let
|
||||
with { _unused = null; };
|
||||
|
||||
let
|
||||
set = { b = 2; };
|
||||
a = 1;
|
||||
inherit (set) b;
|
||||
c = 3;
|
||||
inherit d;
|
||||
in
|
||||
|
||||
[ a b c d ]
|
||||
Loading…
Add table
Add a link
Reference in a new issue