forked from lix-project/lix
Merge pull request #9681 from edolstra/eval-optimisations
Optimize empty list constants
(cherry picked from commit 315aade89d00c692715e5953c36a1b7d6528b703)
Change-Id: I0f28ef8a27ccedc45acf44243eec9dc35b733300
This commit is contained in:
parent
6b279cd10e
commit
137673de56
|
@ -527,6 +527,8 @@ EvalState::EvalState(
|
||||||
|
|
||||||
static_assert(sizeof(Env) <= 16, "environment must be <= 16 bytes");
|
static_assert(sizeof(Env) <= 16, "environment must be <= 16 bytes");
|
||||||
|
|
||||||
|
vEmptyList.mkList(0);
|
||||||
|
|
||||||
/* Initialise the Nix expression search path. */
|
/* Initialise the Nix expression search path. */
|
||||||
if (!evalSettings.pureEval) {
|
if (!evalSettings.pureEval) {
|
||||||
for (auto & i : _searchPath.elements)
|
for (auto & i : _searchPath.elements)
|
||||||
|
@ -1405,6 +1407,15 @@ void ExprList::eval(EvalState & state, Env & env, Value & v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Value * ExprList::maybeThunk(EvalState & state, Env & env)
|
||||||
|
{
|
||||||
|
if (elems.empty()) {
|
||||||
|
return &state.vEmptyList;
|
||||||
|
}
|
||||||
|
return Expr::maybeThunk(state, env);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ExprVar::eval(EvalState & state, Env & env, Value & v)
|
void ExprVar::eval(EvalState & state, Env & env, Value & v)
|
||||||
{
|
{
|
||||||
Value * v2 = state.lookupVar(&env, *this, false);
|
Value * v2 = state.lookupVar(&env, *this, false);
|
||||||
|
|
|
@ -218,6 +218,11 @@ public:
|
||||||
|
|
||||||
Bindings emptyBindings;
|
Bindings emptyBindings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty list constant.
|
||||||
|
*/
|
||||||
|
Value vEmptyList;
|
||||||
|
|
||||||
const SourcePath derivationInternal;
|
const SourcePath derivationInternal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -298,6 +298,7 @@ struct ExprList : Expr
|
||||||
std::vector<Expr *> elems;
|
std::vector<Expr *> elems;
|
||||||
ExprList() { };
|
ExprList() { };
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
|
Value * maybeThunk(EvalState & state, Env & env) override;
|
||||||
|
|
||||||
PosIdx getPos() const override
|
PosIdx getPos() const override
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue