aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2013-07-16 08:43:54 -0400
committerEelco Dolstra <eelco.dolstra@logicblox.com>2013-07-31 11:48:39 +0200
commite068f49f7dc59788cf356acfc77db614db6b28f0 (patch)
tree7fb62ddc57a9c21027c168f209d07243e2d191df /src/libexpr
parent20866a7031ca823055a221653b77986faa167329 (diff)
Avoid thunks when a fromWith var can be looked up without evaluation
Signed-off-by: Shea Levy <shea@shealevy.com>
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.cc14
-rw-r--r--src/libexpr/eval.hh2
2 files changed, 8 insertions, 8 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 76bace1d4..0139f4eb0 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -304,13 +304,15 @@ void mkPath(Value & v, const char * s)
}
-inline Value * EvalState::lookupVar(Env * env, const VarRef & var)
+inline Value * EvalState::lookupVar(Env * env, const VarRef & var, bool noEval)
{
for (unsigned int l = var.level; l; --l, env = env->up) ;
if (var.fromWith) {
while (1) {
if (env->values[0] == NULL) {
+ if (noEval)
+ return NULL;
env->values[0] = allocValue();
evalAttrs(*env->up, env->withAttrs, *env->values[0]);
}
@@ -409,12 +411,10 @@ unsigned long nrAvoided = 0;
Value * ExprVar::maybeThunk(EvalState & state, Env & env)
{
- if (!info.fromWith) {
- Value * v = state.lookupVar(&env, info);
- /* The value might not be initialised in the environment yet.
- In that case, ignore it. */
- if (v) { nrAvoided++; return v; }
- }
+ Value * v = state.lookupVar(&env, info, true);
+ /* The value might not be initialised in the environment yet.
+ In that case, ignore it. */
+ if (v) { nrAvoided++; return v; }
return Expr::maybeThunk(state, env);
}
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index 0e4ad3db2..c820b28f4 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -206,7 +206,7 @@ private:
void addPrimOp(const string & name,
unsigned int arity, PrimOpFun primOp);
- inline Value * lookupVar(Env * env, const VarRef & var);
+ inline Value * lookupVar(Env * env, const VarRef & var, bool noEval = false);
friend class ExprVar;
friend class ExprAttrs;