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:
parent
82df0b432a
commit
09a57e7857
2 changed files with 6 additions and 6 deletions
|
@ -319,8 +319,7 @@ impl Compiler<'_> {
|
||||||
BindingsKind::Attrs
|
BindingsKind::Attrs
|
||||||
};
|
};
|
||||||
|
|
||||||
let count = self.compile_bindings(slot, kind, &node);
|
self.compile_bindings(slot, kind, &node);
|
||||||
self.push_op(OpCode::OpAttrs(Count(count)), &node);
|
|
||||||
|
|
||||||
// Remove the temporary scope, but do not emit any additional cleanup
|
// Remove the temporary scope, but do not emit any additional cleanup
|
||||||
// (OpAttrs consumes all of these locals).
|
// (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
|
where
|
||||||
N: ToSpan + ast::HasEntry,
|
N: ToSpan + ast::HasEntry,
|
||||||
{
|
{
|
||||||
|
@ -406,7 +405,9 @@ impl Compiler<'_> {
|
||||||
// Actually bind values and ensure they are on the stack.
|
// Actually bind values and ensure they are on the stack.
|
||||||
self.bind_values(bindings);
|
self.bind_values(bindings);
|
||||||
|
|
||||||
count
|
if kind.is_attrs() {
|
||||||
|
self.push_op(OpCode::OpAttrs(Count(count)), node);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Compile a standard `let ...; in ...` expression.
|
/// Compile a standard `let ...; in ...` expression.
|
||||||
|
@ -425,7 +426,6 @@ impl Compiler<'_> {
|
||||||
self.emit_warning(&node, WarningKind::DeprecatedLegacyLet);
|
self.emit_warning(&node, WarningKind::DeprecatedLegacyLet);
|
||||||
self.scope_mut().begin_scope();
|
self.scope_mut().begin_scope();
|
||||||
self.compile_bindings(slot, BindingsKind::RecAttrs, &node);
|
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.emit_constant(Value::String(SmolStr::new_inline("body").into()), &node);
|
||||||
self.push_op(OpCode::OpAttrsSelect, &node);
|
self.push_op(OpCode::OpAttrsSelect, &node);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ mod spans;
|
||||||
|
|
||||||
use codemap::Span;
|
use codemap::Span;
|
||||||
use path_clean::PathClean;
|
use path_clean::PathClean;
|
||||||
use rnix::ast::{self, AstToken, HasEntry};
|
use rnix::ast::{self, AstToken};
|
||||||
use smol_str::SmolStr;
|
use smol_str::SmolStr;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
Loading…
Reference in a new issue