fix `variable-reference->module-source' for submodules

Unlike the `variable-reference->resolved-module-path', the module
source one doesn't include a submodule path.
This commit is contained in:
Matthew Flatt 2012-07-10 17:36:51 -06:00
parent a7ea79040d
commit 506b70f71f
3 changed files with 28 additions and 2 deletions

View File

@ -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].}

View File

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

View File

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