diff --git a/src/libexpr/print.cc b/src/libexpr/print.cc index 06bae9c5c..2badbb1bb 100644 --- a/src/libexpr/print.cc +++ b/src/libexpr/print.cc @@ -249,7 +249,11 @@ private: void printString(Value & v) { - printLiteralString(output, v.string_view(), options.maxStringLength, options.ansiColors); + NixStringContext context; + copyContext(v, context); + std::ostringstream s; + printLiteralString(s, v.string_view(), options.maxStringLength, options.ansiColors); + output << state.devirtualize(s.str(), context); } void printPath(Value & v) diff --git a/src/libexpr/value-to-json.cc b/src/libexpr/value-to-json.cc index e4e29e2c5..a50687f37 100644 --- a/src/libexpr/value-to-json.cc +++ b/src/libexpr/value-to-json.cc @@ -32,11 +32,7 @@ json printValueAsJSON(EvalState & state, bool strict, case nString: copyContext(v, context); - // FIXME: only use the context from `v`. - // FIXME: make devirtualization configurable? - // FIXME: don't devirtualize here? It's redundant if - // 'toFile' or 'derivation' also do it. - out = state.devirtualize(v.c_str(), context); + out = v.c_str(); break; case nPath: diff --git a/src/nix/eval.cc b/src/nix/eval.cc index d03d09916..bd58ba010 100644 --- a/src/nix/eval.cc +++ b/src/nix/eval.cc @@ -122,7 +122,10 @@ struct CmdEval : MixJSON, InstallableValueCommand, MixReadOnlyOption } else if (json) { - logger->cout("%s", printValueAsJSON(*state, true, *v, pos, context, false)); + logger->cout("%s", + state->devirtualize( + printValueAsJSON(*state, true, *v, pos, context, false).dump(), + context)); } else {