forked from lix-project/lix
Merge "libexpr: move Value implementations out of eval.cc" into main
This commit is contained in:
commit
346e340cbf
|
@ -70,11 +70,6 @@ std::string printValue(EvalState & state, Value & v)
|
||||||
return out.str();
|
return out.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::print(EvalState & state, std::ostream & str, PrintOptions options)
|
|
||||||
{
|
|
||||||
printValue(state, str, *this, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
const Value * getPrimOp(const Value &v) {
|
const Value * getPrimOp(const Value &v) {
|
||||||
const Value * primOp = &v;
|
const Value * primOp = &v;
|
||||||
while (primOp->isPrimOpApp()) {
|
while (primOp->isPrimOpApp()) {
|
||||||
|
@ -124,32 +119,6 @@ std::string showType(const Value & v)
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
}
|
}
|
||||||
|
|
||||||
PosIdx Value::determinePos(const PosIdx pos) const
|
|
||||||
{
|
|
||||||
// Allow selecting a subset of enum values
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wswitch-enum"
|
|
||||||
switch (internalType) {
|
|
||||||
case tAttrs: return attrs->pos;
|
|
||||||
case tLambda: return lambda.fun->pos;
|
|
||||||
case tApp: return app.left->determinePos(pos);
|
|
||||||
default: return pos;
|
|
||||||
}
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Value::isTrivial() const
|
|
||||||
{
|
|
||||||
return
|
|
||||||
internalType != tApp
|
|
||||||
&& internalType != tPrimOpApp
|
|
||||||
&& (internalType != tThunk
|
|
||||||
|| (dynamic_cast<ExprAttrs *>(thunk.expr)
|
|
||||||
&& (static_cast<ExprAttrs *>(thunk.expr))->dynamicAttrs.empty())
|
|
||||||
|| dynamic_cast<ExprLambda *>(thunk.expr)
|
|
||||||
|| dynamic_cast<ExprList *>(thunk.expr));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if HAVE_BOEHMGC
|
#if HAVE_BOEHMGC
|
||||||
/* Called when the Boehm GC runs out of memory. */
|
/* Called when the Boehm GC runs out of memory. */
|
||||||
|
@ -498,36 +467,6 @@ std::ostream & operator<<(std::ostream & output, PrimOp & primOp)
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Value::Value(primop_t, PrimOp & primop)
|
|
||||||
: internalType(tPrimOp)
|
|
||||||
, primOp(&primop)
|
|
||||||
, _primop_pad(0)
|
|
||||||
{
|
|
||||||
primop.check();
|
|
||||||
}
|
|
||||||
|
|
||||||
PrimOp * Value::primOpAppPrimOp() const
|
|
||||||
{
|
|
||||||
Value * left = primOpApp.left;
|
|
||||||
while (left && !left->isPrimOp()) {
|
|
||||||
left = left->primOpApp.left;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!left)
|
|
||||||
return nullptr;
|
|
||||||
return left->primOp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Value::mkPrimOp(PrimOp * p)
|
|
||||||
{
|
|
||||||
p->check();
|
|
||||||
clearValue();
|
|
||||||
internalType = tPrimOp;
|
|
||||||
primOp = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Value * EvalState::addPrimOp(PrimOp && primOp)
|
Value * EvalState::addPrimOp(PrimOp && primOp)
|
||||||
{
|
{
|
||||||
/* Hack to make constants lazy: turn them into a application of
|
/* Hack to make constants lazy: turn them into a application of
|
||||||
|
@ -779,42 +718,6 @@ DebugTraceStacker::DebugTraceStacker(EvalState & evalState, DebugTrace t)
|
||||||
evalState.runDebugRepl(nullptr, trace.env, trace.expr);
|
evalState.runDebugRepl(nullptr, trace.env, trace.expr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::mkString(std::string_view s)
|
|
||||||
{
|
|
||||||
mkString(gcCopyStringIfNeeded(s));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void copyContextToValue(Value & v, const NixStringContext & context)
|
|
||||||
{
|
|
||||||
if (!context.empty()) {
|
|
||||||
size_t n = 0;
|
|
||||||
v.string.context = gcAllocType<char const *>(context.size() + 1);
|
|
||||||
for (auto & i : context)
|
|
||||||
v.string.context[n++] = gcCopyStringIfNeeded(i.to_string());
|
|
||||||
v.string.context[n] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Value::mkString(std::string_view s, const NixStringContext & context)
|
|
||||||
{
|
|
||||||
mkString(s);
|
|
||||||
copyContextToValue(*this, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Value::mkStringMove(const char * s, const NixStringContext & context)
|
|
||||||
{
|
|
||||||
mkString(s);
|
|
||||||
copyContextToValue(*this, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Value::mkPath(const SourcePath & path)
|
|
||||||
{
|
|
||||||
mkPath(gcCopyStringIfNeeded(path.path.abs()));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval)
|
inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval)
|
||||||
{
|
{
|
||||||
for (auto l = var.level; l; --l, env = env->up) ;
|
for (auto l = var.level; l; --l, env = env->up) ;
|
||||||
|
|
|
@ -31,6 +31,7 @@ libexpr_sources = files(
|
||||||
'print-ambiguous.cc',
|
'print-ambiguous.cc',
|
||||||
'print.cc',
|
'print.cc',
|
||||||
'search-path.cc',
|
'search-path.cc',
|
||||||
|
'value.cc',
|
||||||
'value-to-json.cc',
|
'value-to-json.cc',
|
||||||
'value-to-xml.cc',
|
'value-to-xml.cc',
|
||||||
'flake/config.cc',
|
'flake/config.cc',
|
||||||
|
|
106
src/libexpr/value.cc
Normal file
106
src/libexpr/value.cc
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
#include "value.hh"
|
||||||
|
|
||||||
|
#include <ostream>
|
||||||
|
|
||||||
|
#include "eval.hh"
|
||||||
|
#include "print.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix
|
||||||
|
{
|
||||||
|
|
||||||
|
static void copyContextToValue(Value & v, const NixStringContext & context)
|
||||||
|
{
|
||||||
|
if (!context.empty()) {
|
||||||
|
size_t n = 0;
|
||||||
|
v.string.context = gcAllocType<char const *>(context.size() + 1);
|
||||||
|
for (auto & i : context)
|
||||||
|
v.string.context[n++] = gcCopyStringIfNeeded(i.to_string());
|
||||||
|
v.string.context[n] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Value::Value(primop_t, PrimOp & primop)
|
||||||
|
: internalType(tPrimOp)
|
||||||
|
, primOp(&primop)
|
||||||
|
, _primop_pad(0)
|
||||||
|
{
|
||||||
|
primop.check();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Value::print(EvalState & state, std::ostream & str, PrintOptions options)
|
||||||
|
{
|
||||||
|
printValue(state, str, *this, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
PosIdx Value::determinePos(const PosIdx pos) const
|
||||||
|
{
|
||||||
|
// Allow selecting a subset of enum values
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wswitch-enum"
|
||||||
|
switch (internalType) {
|
||||||
|
case tAttrs: return attrs->pos;
|
||||||
|
case tLambda: return lambda.fun->pos;
|
||||||
|
case tApp: return app.left->determinePos(pos);
|
||||||
|
default: return pos;
|
||||||
|
}
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Value::isTrivial() const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
internalType != tApp
|
||||||
|
&& internalType != tPrimOpApp
|
||||||
|
&& (internalType != tThunk
|
||||||
|
|| (dynamic_cast<ExprAttrs *>(thunk.expr)
|
||||||
|
&& static_cast<ExprAttrs *>(thunk.expr)->dynamicAttrs.empty())
|
||||||
|
|| dynamic_cast<ExprLambda *>(thunk.expr)
|
||||||
|
|| dynamic_cast<ExprList *>(thunk.expr));
|
||||||
|
}
|
||||||
|
|
||||||
|
PrimOp * Value::primOpAppPrimOp() const
|
||||||
|
{
|
||||||
|
Value * left = primOpApp.left;
|
||||||
|
while (left && !left->isPrimOp()) {
|
||||||
|
left = left->primOpApp.left;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!left)
|
||||||
|
return nullptr;
|
||||||
|
return left->primOp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Value::mkPrimOp(PrimOp * p)
|
||||||
|
{
|
||||||
|
p->check();
|
||||||
|
clearValue();
|
||||||
|
internalType = tPrimOp;
|
||||||
|
primOp = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Value::mkString(std::string_view s)
|
||||||
|
{
|
||||||
|
mkString(gcCopyStringIfNeeded(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Value::mkString(std::string_view s, const NixStringContext & context)
|
||||||
|
{
|
||||||
|
mkString(s);
|
||||||
|
copyContextToValue(*this, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Value::mkStringMove(const char * s, const NixStringContext & context)
|
||||||
|
{
|
||||||
|
mkString(s);
|
||||||
|
copyContextToValue(*this, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Value::mkPath(const SourcePath & path)
|
||||||
|
{
|
||||||
|
mkPath(gcCopyStringIfNeeded(path.path.abs()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue