refactor(tvix/eval): emit OpAttrs inside of compile_bindings

This needs to move here so that we can reuse compile_bindings for the
nested attribute sets we're about to start constructing.

Change-Id: Ie83f52f7e1d128886e96a1da47792211fa826f21
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6796
Reviewed-by: sterni <sternenseemann@systemli.org>
Tested-by: BuildkiteCI
This commit is contained in:
Vincent Ambo 2022-09-28 13:34:31 +03:00 committed by tazjin
parent 82df0b432a
commit 09a57e7857
2 changed files with 6 additions and 6 deletions

View file

@ -319,8 +319,7 @@ impl Compiler<'_> {
BindingsKind::Attrs
};
let count = self.compile_bindings(slot, kind, &node);
self.push_op(OpCode::OpAttrs(Count(count)), &node);
self.compile_bindings(slot, kind, &node);
// Remove the temporary scope, but do not emit any additional cleanup
// (OpAttrs consumes all of these locals).
@ -389,7 +388,7 @@ impl Compiler<'_> {
}
}
fn compile_bindings<N>(&mut self, slot: LocalIdx, kind: BindingsKind, node: &N) -> usize
fn compile_bindings<N>(&mut self, slot: LocalIdx, kind: BindingsKind, node: &N)
where
N: ToSpan + ast::HasEntry,
{
@ -406,7 +405,9 @@ impl Compiler<'_> {
// Actually bind values and ensure they are on the stack.
self.bind_values(bindings);
count
if kind.is_attrs() {
self.push_op(OpCode::OpAttrs(Count(count)), node);
}
}
/// Compile a standard `let ...; in ...` expression.
@ -425,7 +426,6 @@ impl Compiler<'_> {
self.emit_warning(&node, WarningKind::DeprecatedLegacyLet);
self.scope_mut().begin_scope();
self.compile_bindings(slot, BindingsKind::RecAttrs, &node);
self.push_op(OpCode::OpAttrs(Count(node.entries().count())), &node);
self.emit_constant(Value::String(SmolStr::new_inline("body").into()), &node);
self.push_op(OpCode::OpAttrsSelect, &node);
}

View file

@ -19,7 +19,7 @@ mod spans;
use codemap::Span;
use path_clean::PathClean;
use rnix::ast::{self, AstToken, HasEntry};
use rnix::ast::{self, AstToken};
use smol_str::SmolStr;
use std::collections::HashMap;
use std::path::{Path, PathBuf};