diff --git a/src/library/compiler/ir_interpreter.cpp b/src/library/compiler/ir_interpreter.cpp index e7de45e30f..713856931b 100644 --- a/src/library/compiler/ir_interpreter.cpp +++ b/src/library/compiler/ir_interpreter.cpp @@ -275,6 +275,8 @@ class interpreter { }; std::vector m_call_stack; environment const & m_env; + // if we were called within the execution of a different interpreter, restore the value of `g_interpreter` in the end + interpreter * m_prev_interpreter; struct constant_cache_entry { bool m_is_scalar; value m_val; @@ -753,10 +755,10 @@ class interpreter { // closure stub stub static object * stub_m_aux(object ** args) { environment env(args[0]); - if (g_interpreter) { + if (g_interpreter && is_eqp(g_interpreter->m_env, env)) { return g_interpreter->stub_m(args); } else { - // We changed threads or the closure was stored and called after the original interpreter exited. + // We changed threads or the closure was stored and called in a different context. // Create new interpreter with new stacks. return interpreter(env).stub_m(args); } @@ -804,7 +806,7 @@ class interpreter { } public: explicit interpreter(environment const & env) : m_env(env) { - lean_assert(g_interpreter == nullptr); + m_prev_interpreter = g_interpreter; g_interpreter = this; } ~interpreter() { @@ -814,7 +816,7 @@ public: } }); lean_assert(g_interpreter == this); - g_interpreter = nullptr; + g_interpreter = m_prev_interpreter; } /** A variant of `call` designed for external uses. @@ -893,12 +895,7 @@ uint32 run_main(environment const & env, int argv, char * argc[]) { extern "C" object * lean_eval_const(object * /* inh */, object * env, object * c) { try { - if (g_interpreter == nullptr) { - return mk_cnstr(1, run_boxed(TO_REF(environment, env), TO_REF(name, c), 0, 0)).steal(); - } else { - flet reset(g_interpreter, nullptr); - return mk_cnstr(1, run_boxed(TO_REF(environment, env), TO_REF(name, c), 0, 0)).steal(); - } + return mk_cnstr(1, run_boxed(TO_REF(environment, env), TO_REF(name, c), 0, 0)).steal(); } catch (exception & ex) { return mk_cnstr(0, string_ref(ex.what())).steal(); }