Avoid thunks when a fromWith var can be looked up without evaluation
Signed-off-by: Shea Levy <shea@shealevy.com>
This commit is contained in:
parent
20866a7031
commit
e068f49f7d
2 changed files with 8 additions and 8 deletions
|
@ -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) ;
|
for (unsigned int l = var.level; l; --l, env = env->up) ;
|
||||||
|
|
||||||
if (var.fromWith) {
|
if (var.fromWith) {
|
||||||
while (1) {
|
while (1) {
|
||||||
if (env->values[0] == NULL) {
|
if (env->values[0] == NULL) {
|
||||||
|
if (noEval)
|
||||||
|
return NULL;
|
||||||
env->values[0] = allocValue();
|
env->values[0] = allocValue();
|
||||||
evalAttrs(*env->up, env->withAttrs, *env->values[0]);
|
evalAttrs(*env->up, env->withAttrs, *env->values[0]);
|
||||||
}
|
}
|
||||||
|
@ -409,12 +411,10 @@ unsigned long nrAvoided = 0;
|
||||||
|
|
||||||
Value * ExprVar::maybeThunk(EvalState & state, Env & env)
|
Value * ExprVar::maybeThunk(EvalState & state, Env & env)
|
||||||
{
|
{
|
||||||
if (!info.fromWith) {
|
Value * v = state.lookupVar(&env, info, true);
|
||||||
Value * v = state.lookupVar(&env, info);
|
|
||||||
/* The value might not be initialised in the environment yet.
|
/* The value might not be initialised in the environment yet.
|
||||||
In that case, ignore it. */
|
In that case, ignore it. */
|
||||||
if (v) { nrAvoided++; return v; }
|
if (v) { nrAvoided++; return v; }
|
||||||
}
|
|
||||||
return Expr::maybeThunk(state, env);
|
return Expr::maybeThunk(state, env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -206,7 +206,7 @@ private:
|
||||||
void addPrimOp(const string & name,
|
void addPrimOp(const string & name,
|
||||||
unsigned int arity, PrimOpFun primOp);
|
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 ExprVar;
|
||||||
friend class ExprAttrs;
|
friend class ExprAttrs;
|
||||||
|
|
Loading…
Reference in a new issue