print staticenv bindings

This commit is contained in:
Ben Burdette 2021-10-11 16:32:43 -06:00
parent 2ee1fa4afd
commit 98eb13691a
3 changed files with 39 additions and 3 deletions

View file

@ -107,10 +107,16 @@ ref<EvalState> EvalCommand::getEvalState()
if (startReplOnEvalErrors) if (startReplOnEvalErrors)
debuggerHook = [evalState{ref<EvalState>(evalState)}](const Error & error, const Env & env, const Expr & expr) { debuggerHook = [evalState{ref<EvalState>(evalState)}](const Error & error, const Env & env, const Expr & expr) {
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());
printStaticEnvBindings(expr);
// printEnvPosChain(env); // printEnvPosChain(env);
printEnvBindings(env); // printEnvBindings(env);
auto vm = mapEnvBindings(env); if (expr.staticenv)
{
auto vm = mapStaticEnvBindings(*expr.staticenv.get(), env);
runRepl(evalState, *vm); runRepl(evalState, *vm);
}
}; };
} }
return ref<EvalState>(evalState); return ref<EvalState>(evalState);

View file

@ -712,6 +712,34 @@ void printStaticEnvBindings(const Expr &expr)
} }
void mapStaticEnvBindings(const StaticEnv &se, const Env &env, valmap & vm)
{
// add bindings for the next level up first.
if (env.up && se.up) {
mapStaticEnvBindings( *se.up, *env.up,vm);
}
// iterate through staticenv bindings.
auto map = valmap();
for (auto iter = se.vars.begin(); iter != se.vars.end(); ++iter)
{
map[iter->first] = env.values[iter->second];
}
vm.merge(map);
}
valmap * mapStaticEnvBindings(const StaticEnv &se, const Env &env)
{
auto vm = new valmap();
mapStaticEnvBindings(se, env, *vm);
return vm;
}
void printEnvPosChain(const Env &env, int lv ) void printEnvPosChain(const Env &env, int lv )
{ {
std::cout << "printEnvPosChain " << lv << std::endl; std::cout << "printEnvPosChain " << lv << std::endl;

View file

@ -24,6 +24,7 @@ enum RepairFlag : bool;
typedef void (* PrimOpFun) (EvalState & state, const Pos & pos, Value * * args, Value & v); typedef void (* PrimOpFun) (EvalState & state, const Pos & pos, Value * * args, Value & v);
extern std::function<void(const Error & error, const Env & env, const Expr & expr)> debuggerHook; extern std::function<void(const Error & error, const Env & env, const Expr & expr)> debuggerHook;
void printStaticEnvBindings(const Expr &expr);
struct PrimOp struct PrimOp
{ {
@ -47,6 +48,7 @@ struct Env
void printEnvBindings(const Env &env, int lv = 0); void printEnvBindings(const Env &env, int lv = 0);
valmap * mapEnvBindings(const Env &env); valmap * mapEnvBindings(const Env &env);
void printEnvPosChain(const Env &env, int lv = 0); void printEnvPosChain(const Env &env, int lv = 0);
valmap * mapStaticEnvBindings(const StaticEnv &se, 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());