diff --git a/collects/tests/racket/submodule.rktl b/collects/tests/racket/submodule.rktl index 1175bd82cc..1b40de865d 100644 --- a/collects/tests/racket/submodule.rktl +++ b/collects/tests/racket/submodule.rktl @@ -799,4 +799,24 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(let ([e '(module x racket/base + (require (for-syntax racket/base)) + + (module m racket/base) + + (define-syntax (m stx) + #`(quote #,(syntax-local-submodules))) + + (define x (m)) + x + (provide x))]) + (parameterize ([current-namespace (make-base-namespace)]) + (eval e) + (test '(m) dynamic-require ''x 'x)) + (parameterize ([current-namespace (make-base-namespace)]) + (eval (expand e)) + (test '(m) dynamic-require ''x 'x))) + +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (report-errs) diff --git a/src/racket/src/env.c b/src/racket/src/env.c index 7360158c5b..eab5df2f60 100644 --- a/src/racket/src/env.c +++ b/src/racket/src/env.c @@ -2525,11 +2525,15 @@ static Scheme_Object *local_submodules(int argc, Scheme_Object *argv[]) l = env->genv->module->pre_submodules; if (l) { while (!SCHEME_NULLP(l)) { - n = scheme_resolved_module_path_value(((Scheme_Module *)SCHEME_CAR(l))->modname); - while (SCHEME_PAIRP(SCHEME_CDR(n))) { - n = SCHEME_CDR(n); + n = SCHEME_CAR(l); + if (!SCHEME_SYMBOLP(n)) { + n = scheme_resolved_module_path_value(((Scheme_Module *)n)->modname); + while (SCHEME_PAIRP(SCHEME_CDR(n))) { + n = SCHEME_CDR(n); + } + n = SCHEME_CAR(n); } - r = scheme_make_pair(SCHEME_CAR(n), r); + r = scheme_make_pair(n, r); l = SCHEME_CDR(l); } } diff --git a/src/racket/src/module.c b/src/racket/src/module.c index 5e61ec580b..ca2a956ba3 100644 --- a/src/racket/src/module.c +++ b/src/racket/src/module.c @@ -6219,8 +6219,10 @@ static void execute_submodules(Scheme_Module *m, int pre, Scheme_Env *genv, } while (!SCHEME_NULLP(p)) { - do_module_execute_recur(SCHEME_CAR(p), genv, set_cache, set_in_pre, prefix, - (Scheme_Object *)m); + if (!SCHEME_SYMBOLP(SCHEME_CAR(p))) { + do_module_execute_recur(SCHEME_CAR(p), genv, set_cache, set_in_pre, prefix, + (Scheme_Object *)m); + } p = SCHEME_CDR(p); } } @@ -6508,10 +6510,12 @@ static Scheme_Object *do_module_clone(Scheme_Object *data, int jit) if (l1 && !SCHEME_NULLP(l1)) { l2 = scheme_null; while (!SCHEME_NULLP(l1)) { - sm = do_module_clone(SCHEME_CAR(l1), jit); - if (!SAME_OBJ(sm, SCHEME_CAR(l1))) - submod_changed = 1; - l2 = scheme_make_pair(sm, l2); + if (!SCHEME_SYMBOLP(SCHEME_CAR(l1))) { + sm = do_module_clone(SCHEME_CAR(l1), jit); + if (!SAME_OBJ(sm, SCHEME_CAR(l1))) + submod_changed = 1; + l2 = scheme_make_pair(sm, l2); + } l1 = SCHEME_CDR(l1); } if (submod_changed) { @@ -9256,8 +9260,20 @@ static Scheme_Object *expand_submodules(Scheme_Compile_Expand_Info *rec, int dre env->genv->module->pre_submodules = l; } } else if (!SCHEME_NULLP(mods)) { - /* setting pre_submodules to '() indicates that there were submodules during expansion */ - env->genv->module->pre_submodules = scheme_null; + if (post) { + /* setting pre_submodules to '() indicates that there were submodules during expansion */ + env->genv->module->pre_submodules = scheme_null; + } else { + l = env->genv->module->pre_submodules; + if (!l) l = scheme_null; + /* extract just the name: */ + mod = SCHEME_CAR(mods); + mod = SCHEME_STX_CDR(mod); + mod = SCHEME_STX_CAR(mod); + mod = SCHEME_STX_VAL(mod); + l = scheme_make_pair(mod, l); + env->genv->module->pre_submodules = l; + } } return mods; @@ -10950,13 +10966,15 @@ static int check_is_submodule(Scheme_Object *modname, Scheme_Object *_genv) l = genv->module->pre_submodules; if (l) { while (!SCHEME_NULLP(l)) { - n = scheme_resolved_module_path_value(((Scheme_Module *)SCHEME_CAR(l))->modname); - while (SCHEME_PAIRP(SCHEME_CDR(n))) { - n = SCHEME_CDR(n); + if (!SCHEME_SYMBOLP(SCHEME_CAR(l))) { + n = scheme_resolved_module_path_value(((Scheme_Module *)SCHEME_CAR(l))->modname); + while (SCHEME_PAIRP(SCHEME_CDR(n))) { + n = SCHEME_CDR(n); + } + n = SCHEME_CAR(n); + if (SAME_OBJ(n, modname)) + return 1; } - n = SCHEME_CAR(n); - if (SAME_OBJ(n, modname)) - return 1; l = SCHEME_CDR(l); } } diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index 19166d963b..7cc59b024a 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -3294,7 +3294,8 @@ typedef struct Scheme_Module Scheme_Object *rn_stx; /* NULL, #t, a stx for a rename, a vector of stxes, or a pair to delay shifts */ Scheme_Object *submodule_path; /* path to this module relative to enclosing top-level module */ - Scheme_Object *pre_submodules, *post_submodules; /* list of modules (when compiled or loaded as a group) */ + Scheme_Object *pre_submodules; /* list of modules (when compiled or loaded as a group) or symbols (during expand) */ + Scheme_Object *post_submodules; /* list of modules (when compiled or loaded as a group) */ Scheme_Object *supermodule; /* supermodule for which this is in {pre,post}_submodules */ Scheme_Object *submodule_ancestry; /* se by compile/expand, temporary */ } Scheme_Module;