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:
parent
0c22454bb9
commit
11e35a77a6
4 changed files with 13 additions and 15 deletions
|
@ -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) => {
|
||||
|
|
|
@ -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`][]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue