forked from lix-project/lix
print env bindings
This commit is contained in:
parent
4b5f9b35f0
commit
bd3b5329f9
|
@ -109,6 +109,7 @@ ref<EvalState> EvalCommand::getEvalState()
|
||||||
if (startReplOnEvalErrors)
|
if (startReplOnEvalErrors)
|
||||||
debuggerHook = [evalState{ref<EvalState>(evalState)}](const Error & error, const Env & env) {
|
debuggerHook = [evalState{ref<EvalState>(evalState)}](const Error & error, const Env & env) {
|
||||||
printError("%s\n\n" ANSI_BOLD "Starting REPL to allow you to inspect the current state of the evaluator.\n" ANSI_NORMAL, error.what());
|
printError("%s\n\n" ANSI_BOLD "Starting REPL to allow you to inspect the current state of the evaluator.\n" ANSI_NORMAL, error.what());
|
||||||
|
printEnvBindings(env);
|
||||||
auto vm = mapEnvBindings(env);
|
auto vm = mapEnvBindings(env);
|
||||||
runRepl(evalState, *vm);
|
runRepl(evalState, *vm);
|
||||||
};
|
};
|
||||||
|
|
|
@ -669,6 +669,26 @@ LocalNoInline(void addBindings(string prefix, Bindings &b, valmap &valmap))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printEnvBindings(const Env &env, int lv )
|
||||||
|
{
|
||||||
|
if (env.values[0]->type() == nAttrs) {
|
||||||
|
Bindings::iterator j = env.values[0]->attrs->begin();
|
||||||
|
|
||||||
|
while (j != env.values[0]->attrs->end()) {
|
||||||
|
std::cout << lv << " env binding: " << j->name << std::endl;
|
||||||
|
// if (countCalls && j->pos) attrSelects[*j->pos]++;
|
||||||
|
// return j->value;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "next env : " << env.up << std::endl;
|
||||||
|
|
||||||
|
if (env.up) {
|
||||||
|
printEnvBindings(*env.up, ++lv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void mapEnvBindings(const Env &env, valmap & vm)
|
void mapEnvBindings(const Env &env, valmap & vm)
|
||||||
{
|
{
|
||||||
|
@ -678,14 +698,38 @@ void mapEnvBindings(const Env &env, valmap & vm)
|
||||||
}
|
}
|
||||||
|
|
||||||
// merge - and write over - higher level bindings.
|
// merge - and write over - higher level bindings.
|
||||||
|
if (env.valuemap)
|
||||||
vm.merge(*env.valuemap);
|
vm.merge(*env.valuemap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// void mapEnvBindings(const Env &env, valmap & vm)
|
||||||
|
// {
|
||||||
|
// // add bindings for the next level up first.
|
||||||
|
// if (env.up) {
|
||||||
|
// mapEnvBindings(*env.up, vm);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // merge - and write over - higher level bindings.
|
||||||
|
// if (env.valuemap)
|
||||||
|
// vm.merge(*env.valuemap);
|
||||||
|
// }
|
||||||
|
|
||||||
valmap * mapEnvBindings(const Env &env)
|
valmap * mapEnvBindings(const Env &env)
|
||||||
{
|
{
|
||||||
auto vm = new valmap();
|
auto vm = new valmap();
|
||||||
|
|
||||||
|
// segfault!
|
||||||
|
std::cout << "before mapenv" << std::endl;
|
||||||
|
if (env.valuemap) {
|
||||||
|
std::cout << "valuemap" << std::endl;
|
||||||
|
std::cout << "mapenv count" << env.valuemap->size() << std::endl;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
std::cout << "novaluemap" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
mapEnvBindings(env, *vm);
|
mapEnvBindings(env, *vm);
|
||||||
|
std::cout << "after mapenv" << std::endl;
|
||||||
|
|
||||||
return vm;
|
return vm;
|
||||||
}
|
}
|
||||||
|
@ -852,6 +896,8 @@ LocalNoInlineNoReturn(void throwAssertionError(const Pos & pos, const char * s,
|
||||||
|
|
||||||
LocalNoInlineNoReturn(void throwUndefinedVarError(const Pos & pos, const char * s, const string & s1, Env & env))
|
LocalNoInlineNoReturn(void throwUndefinedVarError(const Pos & pos, const char * s, const string & s1, Env & env))
|
||||||
{
|
{
|
||||||
|
std::cout << "throwUndefinedVarError" << std::endl;
|
||||||
|
|
||||||
// auto delenv = std::unique_ptr<valmap>(env);
|
// auto delenv = std::unique_ptr<valmap>(env);
|
||||||
auto error = UndefinedVarError({
|
auto error = UndefinedVarError({
|
||||||
.msg = hintfmt(s, s1),
|
.msg = hintfmt(s, s1),
|
||||||
|
@ -914,6 +960,8 @@ void mkPath(Value & v, const char * s)
|
||||||
|
|
||||||
inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval)
|
inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval)
|
||||||
{
|
{
|
||||||
|
// std::cout << " EvalState::lookupVar" << std::endl;
|
||||||
|
|
||||||
for (size_t l = var.level; l; --l, env = env->up) ;
|
for (size_t l = var.level; l; --l, env = env->up) ;
|
||||||
|
|
||||||
if (!var.fromWith) return env->values[var.displ];
|
if (!var.fromWith) return env->values[var.displ];
|
||||||
|
@ -931,8 +979,10 @@ inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval)
|
||||||
if (countCalls && j->pos) attrSelects[*j->pos]++;
|
if (countCalls && j->pos) attrSelects[*j->pos]++;
|
||||||
return j->value;
|
return j->value;
|
||||||
}
|
}
|
||||||
if (!env->prevWith)
|
if (!env->prevWith) {
|
||||||
|
std::cout << "pre throwUndefinedVarError" << std::endl;
|
||||||
throwUndefinedVarError(var.pos, "undefined variable '%1%'", var.name, *env);
|
throwUndefinedVarError(var.pos, "undefined variable '%1%'", var.name, *env);
|
||||||
|
}
|
||||||
for (size_t l = env->prevWith; l; --l, env = env->up) ;
|
for (size_t l = env->prevWith; l; --l, env = env->up) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1681,16 +1731,24 @@ https://nixos.org/manual/nix/stable/#ss-functions.)",
|
||||||
|
|
||||||
void ExprWith::eval(EvalState & state, Env & env, Value & v)
|
void ExprWith::eval(EvalState & state, Env & env, Value & v)
|
||||||
{
|
{
|
||||||
|
// std::cout << "ExprWith::eval" << std::endl;
|
||||||
Env & env2(state.allocEnv(1));
|
Env & env2(state.allocEnv(1));
|
||||||
env2.up = &env;
|
env2.up = &env;
|
||||||
env2.prevWith = prevWith;
|
env2.prevWith = prevWith;
|
||||||
env2.type = Env::HasWithExpr;
|
env2.type = Env::HasWithExpr;
|
||||||
env2.values[0] = (Value *) attrs;
|
env2.values[0] = (Value *) attrs; // ok DAG nasty. just smoosh this in.
|
||||||
|
// presumably evaluate later, lazily.
|
||||||
|
// std::cout << "ExprWith::eval2" << std::endl;
|
||||||
|
|
||||||
if (debuggerHook) {
|
// can't load the valuemap until they've been evaled, which is not yet.
|
||||||
state.forceAttrs(*env2.values[0]);
|
// if (debuggerHook) {
|
||||||
env2.valuemap.reset(mapBindings(*env2.values[0]->attrs));
|
// std::cout << "ExprWith::eval3.0" << std::endl;
|
||||||
}
|
// std::cout << "ExprWith attrs" << *attrs << std::endl;
|
||||||
|
// state.forceAttrs(*(Value*) attrs);
|
||||||
|
// std::cout << "ExprWith::eval3.5" << std::endl;
|
||||||
|
// env2.valuemap.reset(mapBindings(*env2.values[0]->attrs));
|
||||||
|
// std::cout << "ExprWith::eval4" << std::endl;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
body->eval(state, env2, v);
|
body->eval(state, env2, v);
|
||||||
|
|
|
@ -44,6 +44,7 @@ struct Env
|
||||||
Value * values[0];
|
Value * values[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void printEnvBindings(const Env &env, int lv = 0);
|
||||||
valmap * mapEnvBindings(const Env &env);
|
valmap * mapEnvBindings(const Env &env);
|
||||||
|
|
||||||
Value & mkString(Value & v, std::string_view s, const PathSet & context = PathSet());
|
Value & mkString(Value & v, std::string_view s, const PathSet & context = PathSet());
|
||||||
|
|
Loading…
Reference in a new issue