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:
sterni 2022-09-08 12:50:47 +02:00 committed by tazjin
parent bb1adbb05b
commit 7046604cfe
3 changed files with 62 additions and 27 deletions

View file

@ -0,0 +1 @@
[ 1 2 3 4 ]

View file

@ -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 ]