forked from lix-project/lix
* Refactoring: move variable uses to a separate class.
This commit is contained in:
parent
110d155778
commit
81de12bc8f
|
@ -236,24 +236,17 @@ void mkPath(Value & v, const char * s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Value * EvalState::lookupVar(Env * env, const Symbol & name)
|
Value * EvalState::lookupVar(Env * env, const VarRef & var)
|
||||||
{
|
{
|
||||||
#if 0
|
for (unsigned int l = var.level; l; --l, env = env->up) ;
|
||||||
/* First look for a regular variable binding for `name'. */
|
|
||||||
Bindings::iterator i = env2->bindings.find(name);
|
|
||||||
if (i != env2->bindings.end()) return &i->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Otherwise, look for a `with' attribute set containing `name'.
|
if (var.fromWith) {
|
||||||
Inner `withs' take precedence (i.e. `with {x=1;}; with {x=2;};
|
Bindings::iterator j = env->values[0].attrs->find(var.name);
|
||||||
x' evaluates to 2). */
|
if (j == env->values[0].attrs->end())
|
||||||
for (Env * env2 = env; env2; env2 = env2->up) {
|
throwEvalError("undefined variable `%1%'", var.name);
|
||||||
Bindings::iterator i = env2->bindings.find(sWith);
|
return &j->second;
|
||||||
if (i == env2->bindings.end()) continue;
|
} else
|
||||||
Bindings::iterator j = i->second.attrs->find(name);
|
return &env->values[var.displ];
|
||||||
if (j != i->second.attrs->end()) return &j->second;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -481,18 +474,9 @@ void ExprList::eval(EvalState & state, Env & env, Value & v)
|
||||||
|
|
||||||
void ExprVar::eval(EvalState & state, Env & env, Value & v)
|
void ExprVar::eval(EvalState & state, Env & env, Value & v)
|
||||||
{
|
{
|
||||||
Env * env2 = &env;
|
Value * v2 = state.lookupVar(&env, info);
|
||||||
for (unsigned int l = level; l; --l, env2 = env2->up) ;
|
state.forceValue(*v2);
|
||||||
|
v = *v2;
|
||||||
if (fromWith) {
|
|
||||||
Bindings::iterator j = env2->values[0].attrs->find(name);
|
|
||||||
if (j == env2->values[0].attrs->end())
|
|
||||||
throwEvalError("undefined variable `%1%'", name);
|
|
||||||
v = j->second;
|
|
||||||
} else {
|
|
||||||
state.forceValue(env2->values[displ]);
|
|
||||||
v = env2->values[displ];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -238,7 +238,7 @@ private:
|
||||||
void addPrimOp(const string & name,
|
void addPrimOp(const string & name,
|
||||||
unsigned int arity, PrimOp primOp);
|
unsigned int arity, PrimOp primOp);
|
||||||
|
|
||||||
Value * lookupVar(Env * env, const Symbol & name);
|
Value * lookupVar(Env * env, const VarRef & var);
|
||||||
|
|
||||||
friend class ExprVar;
|
friend class ExprVar;
|
||||||
friend class ExprAttrs;
|
friend class ExprAttrs;
|
||||||
|
|
|
@ -38,7 +38,7 @@ void ExprPath::show(std::ostream & str)
|
||||||
|
|
||||||
void ExprVar::show(std::ostream & str)
|
void ExprVar::show(std::ostream & str)
|
||||||
{
|
{
|
||||||
str << name;
|
str << info.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExprSelect::show(std::ostream & str)
|
void ExprSelect::show(std::ostream & str)
|
||||||
|
@ -157,7 +157,7 @@ void ExprPath::bindVars(const StaticEnv & env)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExprVar::bindVars(const StaticEnv & env)
|
void VarRef::bind(const StaticEnv & env)
|
||||||
{
|
{
|
||||||
/* Check whether the variable appears in the environment. If so,
|
/* Check whether the variable appears in the environment. If so,
|
||||||
set its level and displacement. */
|
set its level and displacement. */
|
||||||
|
@ -187,6 +187,11 @@ void ExprVar::bindVars(const StaticEnv & env)
|
||||||
this->level = withLevel;
|
this->level = withLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ExprVar::bindVars(const StaticEnv & env)
|
||||||
|
{
|
||||||
|
info.bind(env);
|
||||||
|
}
|
||||||
|
|
||||||
void ExprSelect::bindVars(const StaticEnv & env)
|
void ExprSelect::bindVars(const StaticEnv & env)
|
||||||
{
|
{
|
||||||
e->bindVars(env);
|
e->bindVars(env);
|
||||||
|
|
|
@ -78,7 +78,7 @@ struct ExprPath : Expr
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ExprVar : Expr
|
struct VarRef
|
||||||
{
|
{
|
||||||
Symbol name;
|
Symbol name;
|
||||||
|
|
||||||
|
@ -95,7 +95,14 @@ struct ExprVar : Expr
|
||||||
unsigned int level;
|
unsigned int level;
|
||||||
unsigned int displ;
|
unsigned int displ;
|
||||||
|
|
||||||
ExprVar(const Symbol & name) : name(name) { };
|
VarRef(const Symbol & name) : name(name) { };
|
||||||
|
void bind(const StaticEnv & env);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ExprVar : Expr
|
||||||
|
{
|
||||||
|
VarRef info;
|
||||||
|
ExprVar(const Symbol & name) : info(name) { };
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue