aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libexpr/eval.cc7
-rw-r--r--src/libexpr/nixexpr.cc130
-rw-r--r--src/libexpr/parser.y2
3 files changed, 32 insertions, 107 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 719dcc1b4..4dde92c0a 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -912,6 +912,9 @@ Env & EvalState::allocEnv(size_t size)
nrValuesInEnvs += size;
Env * env = (Env *) allocBytes(sizeof(Env) + size * sizeof(Value *));
env->type = Env::Plain;
+
+ /* We assume that env->values has been cleared by the allocator; maybeThunk() and lookupVar fromWith expect this. */
+
return *env;
}
@@ -925,7 +928,6 @@ Env & fakeEnv(size_t size)
return *env;
}
-
void EvalState::mkList(Value & v, size_t size)
{
v.mkList(size);
@@ -1291,7 +1293,6 @@ void ExprSelect::eval(EvalState & state, Env & env, Value & v)
state.forceAttrs(*vAttrs, pos);
if ((j = vAttrs->attrs->find(name)) == vAttrs->attrs->end())
throwEvalError(pos, "attribute '%1%' missing", name, env, this);
- // mapBindings(*vAttrs->attrs));
}
vAttrs = j->value;
pos2 = j->pos;
@@ -1419,8 +1420,6 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v, const Pos & po
"attempt to call something which is not a function but %1%",
showType(fun).c_str(),
fakeEnv(1), 0);
- // fun.env);
- // map2("fun", &fun, "arg", &arg));
}
ExprLambda & lambda(*fun.lambda.fun);
diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc
index 8f88eabd5..65c7cac1d 100644
--- a/src/libexpr/nixexpr.cc
+++ b/src/libexpr/nixexpr.cc
@@ -273,52 +273,36 @@ void ExprVar::bindVars(const std::shared_ptr<const StaticEnv> &env)
/* Check whether the variable appears in the environment. If so,
set its level and displacement. */
-
- // std::cout << "ExprVar::bindVars " << name << std::endl;
-
- int a = 10;
- if (name == "callPackage") {
- a++; // try to make code that I can put a breakpoint on...
- // std::cout << "meh" << a + 10 << std::endl;
- int withLevel = -1;
- fromWith = true;
- // this->level = withLevel;
+ const StaticEnv * curEnv;
+ unsigned int level;
+ int withLevel = -1;
+ for (curEnv = env.get(), level = 0; curEnv; curEnv = curEnv->up, level++) {
+ if (curEnv->isWith) {
+ if (withLevel == -1) withLevel = level;
+ } else {
+ StaticEnv::Vars::const_iterator i = curEnv->vars.find(name);
+ if (i != curEnv->vars.end()) {
+ fromWith = false;
+ this->level = level;
+ displ = i->second;
+ return;
+ }
+ }
}
+ /* Otherwise, the variable must be obtained from the nearest
+ enclosing `with'. If there is no `with', then we can issue an
+ "undefined variable" error now. */
+ if (withLevel == -1)
{
-
- const StaticEnv * curEnv;
- unsigned int level;
- int withLevel = -1;
- for (curEnv = env.get(), level = 0; curEnv; curEnv = curEnv->up, level++) {
- if (curEnv->isWith) {
- if (withLevel == -1) withLevel = level;
- } else {
- StaticEnv::Vars::const_iterator i = curEnv->vars.find(name);
- if (i != curEnv->vars.end()) {
- fromWith = false;
- this->level = level;
- displ = i->second;
- return;
- }
- }
- }
-
-
- /* Otherwise, the variable must be obtained from the nearest
- enclosing `with'. If there is no `with', then we can issue an
- "undefined variable" error now. */
- if (withLevel == -1)
- {
- // std::cout << " throw UndefinedVarError({" << std::endl;
- throw UndefinedVarError({
- .msg = hintfmt("undefined variable (ExprVar bindvars) '%1%'", name),
- .errPos = pos
- });
- }
- fromWith = true;
- this->level = withLevel;
+ // std::cout << " throw UndefinedVarError({" << std::endl;
+ throw UndefinedVarError({
+ .msg = hintfmt("undefined variable (ExprVar bindvars) '%1%'", name),
+ .errPos = pos
+ });
}
+ fromWith = true;
+ this->level = withLevel;
}
void ExprSelect::bindVars(const std::shared_ptr<const StaticEnv> &env)
@@ -349,18 +333,11 @@ void ExprAttrs::bindVars(const std::shared_ptr<const StaticEnv> &env)
if (debuggerHook)
staticenv = env;
- // std::cout << "ExprAttrs::bindVars" << std::endl;
- // auto dynamicEnv(env);
-
if (recursive) {
- // std::cout << "recursive" << std::endl;
- // dynamicEnv = newEnv.get();
- // also make shared_ptr?
auto newEnv = std::shared_ptr<StaticEnv>(new StaticEnv(false, env.get()));
unsigned int displ = 0;
for (auto & i : attrs) {
- // std::cout << "newenvvar: " << i.first << std::endl;
newEnv->vars[i.first] = i.second.displ = displ++;
}
@@ -373,7 +350,6 @@ void ExprAttrs::bindVars(const std::shared_ptr<const StaticEnv> &env)
}
}
else {
- // std::cout << "NOT recursive" << std::endl;
for (auto & i : attrs)
i.second.e->bindVars(env);
@@ -382,9 +358,6 @@ void ExprAttrs::bindVars(const std::shared_ptr<const StaticEnv> &env)
i.valueExpr->bindVars(env);
}
}
-
- // std::cout << "ExprAttrs::bindVars end" << std::endl;
-
}
void ExprList::bindVars(const std::shared_ptr<const StaticEnv> &env)
@@ -401,7 +374,7 @@ void ExprLambda::bindVars(const std::shared_ptr<const StaticEnv> &env)
if (debuggerHook)
staticenv = env;
- auto newEnv = std::shared_ptr<StaticEnv>(new StaticEnv(false, env.get())); // also make shared_ptr?
+ auto newEnv = std::shared_ptr<StaticEnv>(new StaticEnv(false, env.get()));
unsigned int displ = 0;
@@ -423,7 +396,7 @@ void ExprLet::bindVars(const std::shared_ptr<const StaticEnv> &env)
if (debuggerHook)
staticenv = env;
- auto newEnv = std::shared_ptr<StaticEnv>(new StaticEnv(false, env.get())); // also make shared_ptr?
+ auto newEnv = std::shared_ptr<StaticEnv>(new StaticEnv(false, env.get()));
unsigned int displ = 0;
for (auto & i : attrs->attrs)
@@ -440,7 +413,6 @@ void ExprWith::bindVars(const std::shared_ptr<const StaticEnv> &env)
if (debuggerHook)
staticenv = env;
- // std::cout << " ExprWith::bindVars " << std::endl;
/* Does this `with' have an enclosing `with'? If so, record its
level so that `lookupVar' can look up variables in the previous
`with' if this one doesn't contain the desired attribute. */
@@ -453,55 +425,11 @@ void ExprWith::bindVars(const std::shared_ptr<const StaticEnv> &env)
break;
}
- // std::cout << " ExprWith::bindVars 1" << std::endl;
- // attrs->show(std::cout);
- // std::cout << std::endl;
attrs->bindVars(env);
- auto newEnv = std::shared_ptr<StaticEnv>(new StaticEnv(true, env.get())); // also make shared_ptr?
- // std::cout << " ExprWith::bindVars 2" << std::endl;
- // std::cout << " body: " << std::endl;
- // body->show(std::cout);
- // std::cout << std::endl;
-
- // std::cout << "ExprWith::newenv: (iswith, size); (" << newEnv->isWith << ", " << newEnv->vars.size() << ") " << std::endl;
- // for (auto i = newEnv->vars.begin(); i != newEnv->vars.end(); ++i)
- // std::cout << "EvalState::parse newEnv " << i->first << std::endl;
-
-
- // std::cout << " body->bindVars(newEnv), iswith: " << newEnv->isWith << std::endl;
+ auto newEnv = std::shared_ptr<StaticEnv>(new StaticEnv(true, env.get()));
body->bindVars(newEnv);
- // std::cout << " ExprWith::bindVars 3" << std::endl;
}
-/*
-void ExprWith::bindVars(const StaticEnv & env)
-{
- // Does this `with' have an enclosing `with'? If so, record its
- // level so that `lookupVar' can look up variables in the previous
- // `with' if this one doesn't contain the desired attribute.
- const StaticEnv * curEnv;
- unsigned int level;
- prevWith = 0;
- for (curEnv = &env, level = 1; curEnv; curEnv = curEnv->up, level++)
- if (curEnv->isWith) {
- prevWith = level;
- break;
- }
-
- attrs->bindVars(env);
- std::cout << "ExprWith::bindVars env: " << env.vars.size(); // add std::endl;
- for (auto i = env.vars.begin(); i != env.vars.end(); ++i)
- {
- std::cout << i->first << std::endl;
- }
-
- StaticEnv newEnv(true, &env);
- body->bindVars(newEnv);
-}
-*/
-
-
-
void ExprIf::bindVars(const std::shared_ptr<const StaticEnv> &env)
{
if (debuggerHook)
diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y
index d6d5c85f5..d1e898677 100644
--- a/src/libexpr/parser.y
+++ b/src/libexpr/parser.y
@@ -22,8 +22,6 @@
#include "eval.hh"
#include "globals.hh"
-#include <iostream>
-
namespace nix {
struct ParseData