diff --git a/collects/scribblings/reference/namespaces.scrbl b/collects/scribblings/reference/namespaces.scrbl index 930ddab6ab..3642e3d78a 100644 --- a/collects/scribblings/reference/namespaces.scrbl +++ b/collects/scribblings/reference/namespaces.scrbl @@ -414,6 +414,8 @@ result is @racket[#f].} If @racket[varref] refers to a @tech{module-level variable}, the result is a path or symbol naming the module's source (which is typically, but not always, the same as in the resolved module path). +If the module is a submodule, the result corresponds to the enclosing +top-level module's source. If @racket[varref] refers to a @tech{top-level variable}, then the result is @racket[#f].} diff --git a/collects/tests/racket/submodule.rktl b/collects/tests/racket/submodule.rktl index 0a6eb4fd35..500d71d7a2 100644 --- a/collects/tests/racket/submodule.rktl +++ b/collects/tests/racket/submodule.rktl @@ -496,6 +496,22 @@ (test 3 dynamic-require '(submod 'module+-example-2 a b) 'x) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Check module-source for submodule: + +(let () + (define (go set-name get-name) + (parameterize ([current-namespace (make-base-namespace)]) + (parameterize ([current-module-declare-source set-name]) + (eval '(module m racket/base + (module+ sub + (provide v) + (define v (variable-reference->module-source + (#%variable-reference)))))) + (test get-name dynamic-require '(submod 'm sub) 'v)))) + (go #f 'm) + (go 'other 'other)) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Check that various shaodwings are allowed: diff --git a/src/racket/src/module.c b/src/racket/src/module.c index bebe5a1a40..f09106ab55 100644 --- a/src/racket/src/module.c +++ b/src/racket/src/module.c @@ -6064,8 +6064,16 @@ static Scheme_Object *do_module_execute(Scheme_Object *data, Scheme_Env *genv, if (!SCHEME_FALSEP(src)) { src = scheme_intern_resolved_module_path(src); m->modsrc = src; - } else - m->modsrc = m->modname; + } else { + src = m->modname; + if (m->submodule_path && !SCHEME_NULLP(m->submodule_path)) { + src = scheme_resolved_module_path_value(src); + if (SCHEME_PAIRP(src)) + src = SCHEME_CAR(src); + src = scheme_intern_resolved_module_path(src); + } + m->modsrc = src; + } if (genv) env = genv;