From 24980e41ceaffff96e40877fd5f6fc38e2eca058 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 19 Nov 2007 20:57:06 +0000 Subject: [PATCH] fix some problems with variable-reference->namespace and namespace-attach-module svn: r7768 --- src/mzscheme/src/env.c | 25 +++++++++++++++++++------ src/mzscheme/src/module.c | 9 +++++---- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/mzscheme/src/env.c b/src/mzscheme/src/env.c index db0d77428f..4a2507c9a8 100644 --- a/src/mzscheme/src/env.c +++ b/src/mzscheme/src/env.c @@ -3784,11 +3784,6 @@ static Scheme_Object *do_variable_namespace(const char *who, int tl, int argc, S env = ((Scheme_Bucket_With_Home *)v)->home; if (tl && env->module) { env = NULL; - } else { - ph = env->phase; - while (ph--) { - env = env->template_env; - } } } @@ -3797,7 +3792,25 @@ static Scheme_Object *do_variable_namespace(const char *who, int tl, int argc, S (tl ? "top-level variable-reference" : "variable-reference"), 0, argc, argv); - return (Scheme_Object *)make_env(env, 0, 0); + ph = env->phase; + if (tl) { + while (ph--) { + env = env->template_env; + } + } else { + env = make_env(env, 0, 0); + + /* rewind modchain to phase 0: */ + while (ph--) { + v = SCHEME_VEC_ELS(env->modchain)[2]; + if (SCHEME_FALSEP(v)) { + scheme_signal_error("internal error: missing modchain for previous phase"); + } + env->modchain = v; + } + } + + return (Scheme_Object *)env; } static Scheme_Object *variable_namespace(int argc, Scheme_Object *argv[]) diff --git a/src/mzscheme/src/module.c b/src/mzscheme/src/module.c index e126fd606d..0488a2b261 100644 --- a/src/mzscheme/src/module.c +++ b/src/mzscheme/src/module.c @@ -1583,7 +1583,7 @@ static Scheme_Object *namespace_attach_module(int argc, Scheme_Object *argv[]) menv2 = scheme_clone_module_env(menv, to_env, to_modchain); if (menv->attached) menv2->attached = 1; - + scheme_hash_set(MODCHAIN_TABLE(to_modchain), name, (Scheme_Object *)menv2); scheme_hash_set(to_env->module_registry, name, (Scheme_Object *)menv2->module); scheme_hash_set(to_env->export_registry, name, (Scheme_Object *)menv2->module->me); @@ -1623,7 +1623,7 @@ static Scheme_Object *namespace_attach_module(int argc, Scheme_Object *argv[]) resolver = scheme_get_param(config, MZCONFIG_CURRENT_MODULE_RESOLVER); while (!SCHEME_NULLP(notifies)) { a[0] = SCHEME_CAR(notifies); - + scheme_apply(resolver, 1, a); notifies = SCHEME_CDR(notifies); @@ -3115,9 +3115,9 @@ static void show(const char *what, Scheme_Env *menv, int v) for (i = 0; i < indent; i++) { printf(" "); } - printf("%s \t%s @%ld [%d]\n", + printf("%s \t%s @%ld [%d] %p\n", what, scheme_write_to_string(menv->module->modname, NULL), - menv->phase, v); + menv->phase, v, menv->modchain); indent++; } } @@ -3614,6 +3614,7 @@ static void eval_module_body(Scheme_Env *menv) int volatile save_phase_shift; mz_jmp_buf newbuf, * volatile savebuf; + menv->running = 1; menv->ran = 1; depth = m->max_let_depth + scheme_prefix_depth(m->prefix);