summary refs log tree commit diff
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)
downloadguix-e068f49f7dc59788cf356acfc77db614db6b28f0.tar.gz
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 76bace1d4b..0139f4eb01 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 0e4ad3db23..c820b28f49 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;