feat(tvix/eval): implement correct toString behavior

Implement C++ Nix's `EvalState::coerceToString` minus some of the Path
/ store handling. This is currently only used for `toString` which does
all possible coercions, but we've already prepared the weaker coercion
variant which is e.g. used for builtins that expect string arguments.

`EvalState::coerceToPath` is still missing for builtins that need a
path, but it'll be easy to build on top of this.

Change-Id: I78d15576b18921791d04b6b1e964b951fdef22c6
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6571
Autosubmit: sterni <sternenseemann@systemli.org>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
sterni 2022-09-13 15:37:19 +02:00
parent 16da548f93
commit da1d71a4e8
6 changed files with 196 additions and 14 deletions

View file

@ -148,11 +148,11 @@ impl<'o> VM<'o> {
op
}
fn pop(&mut self) -> Value {
pub fn pop(&mut self) -> Value {
self.stack.pop().expect("runtime stack empty")
}
fn push(&mut self, value: Value) {
pub fn push(&mut self, value: Value) {
self.stack.push(value)
}
@ -726,7 +726,7 @@ impl<'o> VM<'o> {
}
}
fn call_builtin(&mut self, builtin: Builtin) -> EvalResult<()> {
pub fn call_builtin(&mut self, builtin: Builtin) -> EvalResult<()> {
let builtin_name = builtin.name();
self.observer.observe_enter_builtin(builtin_name);