fix problem with require' inside begin-for-syntax'

The dependency wasn't recorded under the right phase.
This commit is contained in:
Matthew Flatt 2012-11-10 22:27:26 -07:00
parent 4ca7e6bc77
commit 9c4cfdecc4
2 changed files with 35 additions and 18 deletions

View File

@ -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)

View File

@ -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,