diff --git a/collects/tests/racket/module.rktl b/collects/tests/racket/module.rktl index 5005ae9e02..888ad8e628 100644 --- a/collects/tests/racket/module.rktl +++ b/collects/tests/racket/module.rktl @@ -910,6 +910,23 @@ (require 'use-a-with-auto-field) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; check that `require' inside `beging-for-syntax' sets up the right phase dependency + +(let ([o (open-output-bytes)]) + (parameterize ([current-output-port o] + [current-namespace (make-base-namespace)]) + (eval + '(module m racket/base + (printf "~s\n" (variable-reference->phase (#%variable-reference))))) + (eval + '(module n racket/base + (require (for-syntax racket/base)) + (begin-for-syntax + (require 'm)))) + (eval '(require 'n))) + (test #"1\n1\n" get-output-bytes o)) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/src/racket/src/module.c b/src/racket/src/module.c index b9bebb5c5d..260eeefb30 100644 --- a/src/racket/src/module.c +++ b/src/racket/src/module.c @@ -4691,8 +4691,8 @@ static int indent = 0; static void show(const char *what, Scheme_Env *menv, int v1, int v2, int ph, int base_phase) { if (menv->phase > 3) return; - if (0 || SCHEME_SYMBOLP(SCHEME_PTR_VAL(menv->module->modname))) - if (0 || SCHEME_SYM_VAL(SCHEME_PTR_VAL(menv->module->modname))[0] != '#') { + if (1 || SCHEME_SYMBOLP(SCHEME_PTR_VAL(menv->module->modname))) + if (1 || SCHEME_SYM_VAL(SCHEME_PTR_VAL(menv->module->modname))[0] != '#') { int i; for (i = 0; i < indent; i++) { fprintf(stderr, " "); @@ -11788,19 +11788,29 @@ void parse_requires(Scheme_Object *form, int at_phase, start ? eval_exp : 0, start ? eval_run : 0, main_env->phase, scheme_null, 0); + x_just_mode = just_mode; + x_mode = mode; + if (at_phase) { + if (x_mode && SCHEME_TRUEP(x_mode)) { + x_mode = scheme_bin_plus(x_mode, scheme_make_integer(at_phase)); + } + /* x_just_mode refers to the mode at export, which doesn't shift + by phase context at import */ + } + /* Add name to require list, if it's not there: */ if (main_env->module) { Scheme_Object *reqs; - if (SAME_OBJ(mode, scheme_make_integer(0))) { + if (SAME_OBJ(x_mode, scheme_make_integer(0))) { reqs = add_req(scheme_make_pair(idx, scheme_null), main_env->module->requires); main_env->module->requires = reqs; - } else if (SAME_OBJ(mode, scheme_make_integer(1))) { + } else if (SAME_OBJ(x_mode, scheme_make_integer(1))) { reqs = add_req(scheme_make_pair(idx, scheme_null), main_env->module->et_requires); main_env->module->et_requires = reqs; - } else if (SAME_OBJ(mode, scheme_make_integer(-1))) { + } else if (SAME_OBJ(x_mode, scheme_make_integer(-1))) { reqs = add_req(scheme_make_pair(idx, scheme_null), main_env->module->tt_requires); main_env->module->tt_requires = reqs; - } else if (SAME_OBJ(mode, scheme_false)) { + } else if (SAME_OBJ(x_mode, scheme_false)) { reqs = add_req(scheme_make_pair(idx, scheme_null), main_env->module->dt_requires); main_env->module->dt_requires = reqs; } else { @@ -11810,24 +11820,14 @@ void parse_requires(Scheme_Object *form, int at_phase, oht = scheme_make_hash_table_equal(); main_env->module->other_requires = oht; } - reqs = scheme_hash_get(oht, mode); + reqs = scheme_hash_get(oht, x_mode); if (!reqs) reqs = scheme_null; reqs = add_req(scheme_make_pair(idx, scheme_null), reqs); - scheme_hash_set(oht, mode, reqs); + scheme_hash_set(oht, x_mode, reqs); } } - x_just_mode = just_mode; - x_mode = mode; - if (at_phase) { - if (x_mode && SCHEME_TRUEP(x_mode)) { - x_mode = scheme_bin_plus(x_mode, scheme_make_integer(at_phase)); - } - /* x_just_mode refers to the mode at export, which doesn't shift - by phase context at import */ - } - add_single_require(m->me, x_just_mode, x_mode, idx, rename_env, rn_set, post_ex_rn_set, NULL, exns, onlys, prefix, iname, ename,