From 99fe14b08021d9b7bf7344d34b97f914153a6e31 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 29 Sep 2011 16:15:51 -0600 Subject: [PATCH] fix problems with phase-1 syntax definitions Closes PR 12234 --- collects/tests/racket/module.rktl | 20 ++++++++++++++++++++ src/racket/src/module.c | 12 ++++++++++-- src/racket/src/syntax.c | 5 +++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/collects/tests/racket/module.rktl b/collects/tests/racket/module.rktl index 6b2fc72457..d5ea51aae3 100644 --- a/collects/tests/racket/module.rktl +++ b/collects/tests/racket/module.rktl @@ -598,6 +598,26 @@ (require (rename-in (dynamic-in service)))))))) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Check phase-1 syntax used via for-template +;; and other indirections + +(module there-and-back-x racket/base + (require (for-syntax racket/base)) + (begin-for-syntax + (provide s s?) + (struct s (x y)))) + +(module there-and-back-y racket/base + (require (for-template 'there-and-back-x)) + (s 1 2) + (provide s s?)) + +(module there-and-back-z racket/base + (require 'there-and-back-y) + (provide f) + (define (f) (s 1 2))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/src/racket/src/module.c b/src/racket/src/module.c index 4930a48664..0066213ec3 100644 --- a/src/racket/src/module.c +++ b/src/racket/src/module.c @@ -3601,12 +3601,15 @@ Scheme_Env *scheme_module_access(Scheme_Object *name, Scheme_Env *env, intptr_t if (!menv) { Scheme_Object *chain; + int ph; chain = env->modchain; - if (rev_mod_phase && chain) { + ph = rev_mod_phase; + while (ph && chain) { chain = (SCHEME_VEC_ELS(chain))[2]; if (SCHEME_FALSEP(chain)) return NULL; + ph--; } if (!chain) { @@ -3616,8 +3619,10 @@ Scheme_Env *scheme_module_access(Scheme_Object *name, Scheme_Env *env, intptr_t menv = (Scheme_Env *)scheme_hash_get(MODCHAIN_TABLE(chain), name); - if (rev_mod_phase && menv) + while ((ph < rev_mod_phase) && menv) { menv = menv->exp_env; + ph++; + } } return menv; @@ -3951,6 +3956,7 @@ Scheme_Object *scheme_module_syntax(Scheme_Object *modname, Scheme_Env *env, int i; for (i = 0; i < mod_phase; i++) { + scheme_prepare_template_env(env); env = env->template_env; if (!env) return NULL; } @@ -3961,6 +3967,7 @@ Scheme_Object *scheme_module_syntax(Scheme_Object *modname, Scheme_Env *env, return NULL; for (i = 0; i < mod_phase; i++) { + scheme_prepare_exp_env(menv); menv = menv->exp_env; if (!menv) return NULL; } @@ -8451,6 +8458,7 @@ void compute_provide_arrays(Scheme_Hash_Table *all_provided, Scheme_Hash_Table * noms = adjust_for_rename(exs[count], SCHEME_VEC_ELS(v)[4], SCHEME_VEC_ELS(v)[0]); exsnoms[count] = noms; exps[count] = protected; + exets[count] = SCHEME_INT_VAL(SCHEME_VEC_ELS(v)[8]); count++; } } diff --git a/src/racket/src/syntax.c b/src/racket/src/syntax.c index 1d48e3b8ef..aa412dd65a 100644 --- a/src/racket/src/syntax.c +++ b/src/racket/src/syntax.c @@ -3387,6 +3387,7 @@ static Scheme_Object *search_shared_pes(Scheme_Object *shared_pes, phase = 0; EXPLAIN(fprintf(stderr, "%d srcname %s\n", depth, SCHEME_SYM_VAL(pt->provide_src_names[i]))); + EXPLAIN(fprintf(stderr, "%d mod phase %d\n", depth, phase)); get_names[0] = pt->provide_src_names[i]; get_names[1] = idx; get_names[2] = glob_id; @@ -3765,6 +3766,10 @@ static Scheme_Object *resolve_env(Scheme_Object *a, Scheme_Object *orig_phase, } else { EXPLAIN(fprintf(stderr, "%d Result: %s\n", depth, scheme_write_to_string(result, NULL))); } + if (get_names) { + EXPLAIN(fprintf(stderr, "%d phase %s\n", depth, scheme_write_to_string(get_names[3], NULL))); + } + return result; } else if ((SCHEME_RENAMESP(WRAP_POS_FIRST(wraps))