refactor(tvix/eval): let OpCoerceToString select the CoercionKind

Change-Id: I92d58ef216d7e0766af70f019b3dcd445284a95d
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10344
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
Adam Joseph 2023-12-12 20:47:31 -08:00 committed by tazjin
parent 0c22454bb9
commit 11e35a77a6
4 changed files with 13 additions and 15 deletions

View file

@ -34,6 +34,7 @@ use crate::spans::LightSpan;
use crate::spans::ToSpan;
use crate::value::{Closure, Formals, Lambda, NixAttrs, Thunk, Value};
use crate::warnings::{EvalWarning, WarningKind};
use crate::CoercionKind;
use crate::SourceCode;
use self::scope::{LocalIdx, LocalPosition, Scope, Upvalue, UpvalueKind};
@ -444,7 +445,13 @@ impl Compiler<'_> {
ast::InterpolPart::Interpolation(ipol) => {
self.compile(slot, ipol.expr().unwrap());
// implicitly forces as well
self.push_op(OpCode::OpCoerceToString, ipol);
self.push_op(
OpCode::OpCoerceToString(CoercionKind {
strong: false,
import_paths: true,
}),
ipol,
);
}
ast::InterpolPart::Literal(lit) => {

View file

@ -201,10 +201,8 @@ pub enum OpCode {
/// Interpolate the given number of string fragments into a single string.
OpInterpolate(Count),
/// Force the Value on the stack and coerce it to a string, always using
/// `CoercionKind::Weak { import_paths: true }`. This is the behavior
/// necessary for path interpolation.
OpCoerceToString,
/// Force the Value on the stack and coerce it to a string
OpCoerceToString(crate::CoercionKind),
// Paths
/// Attempt to resolve the Value on the stack using the configured [`NixSearchPath`][]

View file

@ -161,7 +161,7 @@ macro_rules! gen_is {
}
/// Describes what input types are allowed when coercing a `Value` to a string
#[derive(Clone, Copy, PartialEq, Debug)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct CoercionKind {
/// If false only coerce already "stringly" types like strings and paths, but
/// also coerce sets that have a `__toString` attribute. In Tvix, this is

View file

@ -777,20 +777,13 @@ impl<'o> VM<'o> {
_ => panic!("attempted to finalise a non-thunk"),
},
OpCode::OpCoerceToString => {
OpCode::OpCoerceToString(kind) => {
let value = self.stack_pop();
let gen_span = frame.current_light_span();
self.push_call_frame(span, frame);
self.enqueue_generator("coerce_to_string", gen_span.clone(), |co| {
value.coerce_to_string(
co,
CoercionKind {
strong: false,
import_paths: true,
},
gen_span,
)
value.coerce_to_string(co, kind, gen_span)
});
return Ok(false);