From a0ba30d8e7c16fbd572856ea950e82d98ccca4be Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 22 Jul 2012 21:40:31 -0500 Subject: [PATCH] fix `syntax-local-get-shadower' for submodules Closes PR 12926, 12928 Merge to v5.3 --- collects/tests/racket/package.rktl | 16 ++++++++++++++++ collects/tests/racket/submodule.rktl | 1 - collects/tests/racket/unitsig.rktl | 21 +++++++++++++++++++++ src/racket/src/env.c | 10 ++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/collects/tests/racket/package.rktl b/collects/tests/racket/package.rktl index fb947c744b..a331dca4f3 100644 --- a/collects/tests/racket/package.rktl +++ b/collects/tests/racket/package.rktl @@ -247,6 +247,22 @@ (open-package p5) q) +;; ---------------------------------------- +;; In a submodule + +(module package-in-a-submodule racket/base + (require racket/package) + + (define-package pkg (foo) + (define foo 5)) + + (module+ main + (open-package pkg) + (define out foo) + (provide out))) + +(test 5 dynamic-require '(submod 'package-in-a-submodule main) 'out) + ;; ---------------------------------------- (report-errs) diff --git a/collects/tests/racket/submodule.rktl b/collects/tests/racket/submodule.rktl index bce629630c..966a9f1aba 100644 --- a/collects/tests/racket/submodule.rktl +++ b/collects/tests/racket/submodule.rktl @@ -761,7 +761,6 @@ (provide v))))) (test 130 dynamic-require `(submod ,path main) 'v)) - ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/collects/tests/racket/unitsig.rktl b/collects/tests/racket/unitsig.rktl index f47f0157ad..9b38ca12c5 100644 --- a/collects/tests/racket/unitsig.rktl +++ b/collects/tests/racket/unitsig.rktl @@ -714,6 +714,27 @@ (list (signature->symbols s^)) (list (list)))) +;; ---------------------------------------- +;; In a submodule + +(module unit-in-a-submodule racket/base + (require racket/unit) + + (define-signature foo^ (f)) + + (module+ main + (define-unit foo@ + (import) + (export foo^) + + (define f (lambda (x) x))) + (define-values/invoke-unit/infer foo@) + + (define out (f 50)) + (provide out))) + +(test 50 dynamic-require '(submod 'unit-in-a-submodule main) 'out) + ;; -------------------------------------------------- (report-errs) diff --git a/src/racket/src/env.c b/src/racket/src/env.c index 912b3d9e10..240f2d8074 100644 --- a/src/racket/src/env.c +++ b/src/racket/src/env.c @@ -2232,6 +2232,16 @@ local_module_introduce(int argc, Scheme_Object *argv[]) v = scheme_stx_source_module(s, 0, 0); if (SCHEME_FALSEP(v)) { + if (env->genv->module + && env->genv->module->rn_stx + && SCHEME_VECTORP(env->genv->module->rn_stx)) { + /* This is a submodule, and `rn_stx' has renames for the enclosing modules */ + int i; + for (i = SCHEME_VEC_SIZE(env->genv->module->rn_stx); i-- > 1; ) { + v = SCHEME_VEC_ELS(env->genv->module->rn_stx)[i]; + s = scheme_add_rename(s, scheme_stx_to_rename(v)); + } + } if (env->genv->rename_set) s = scheme_add_rename(s, env->genv->rename_set); if (env->genv->post_ex_rename_set)