fix problem with module->namespace and shadowing initial imports (pr 10264) (merge to 4.2)

svn: r14994
This commit is contained in:
Matthew Flatt 2009-05-26 23:44:11 +00:00
parent af2e5beb4e
commit 5c103eed59
2 changed files with 45 additions and 2 deletions

View File

@ -455,6 +455,49 @@
(test '#(tests/mzscheme/lang/getinfo get-info closure-data)
module->language-info 'tests/mzscheme/langm))))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Check shadowing of initial imports:
(let ([m-code '(module m scheme/base (define-syntax-rule (lambda . _) 5) (provide lambda))]
[n-code '(module n scheme/base
(require 'm)
(define five (lambda (x) x))
(define five-stx #'lambda)
(provide five five-stx))]
[p-code '(module p scheme/base
(require 'n)
(define same? (free-identifier=? #'lambda five-stx))
(provide same?))])
(let ([ns (make-base-namespace)])
(eval m-code ns)
(eval '(require 'm) ns)
(test 5 eval '(lambda (x) x) ns)
(let ([m-ns (eval '(module->namespace ''m) ns)])
(test 5 eval '(lambda (x) x) m-ns))
(eval n-code ns)
(eval '(require 'n) ns)
(test 5 eval 'five ns)
(eval p-code ns)
(eval '(require 'p) ns)
(test #f eval 'same? ns)
(let ([n-ns (eval '(module->namespace ''n) ns)])
(test 5 eval '(lambda (x) x) n-ns)))
(let ([ns (make-base-namespace)])
(eval m-code ns)
(let ([n-zo (let ([s (open-output-bytes)])
(parameterize ([current-namespace ns])
(write (compile n-code) s))
(parameterize ([read-accept-compiled #t])
(read (open-input-bytes (get-output-bytes s)))))])
(eval n-zo ns)
(eval '(require 'n) ns)
(test 5 eval 'five ns)
(eval p-code ns)
(eval '(require 'p) ns)
(test #f eval 'same? ns)
(let ([n-ns (eval '(module->namespace ''n) ns)])
(test 5 eval '(lambda (x) x) n-ns)))))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(report-errs)

View File

@ -2404,8 +2404,8 @@ void scheme_prep_namespace_rename(Scheme_Env *menv)
}
if (l) {
/* Shouldn't we do initial import first, to get shadowing
right? Somehow, it seems to work this way. */
/* Do initial import first to get shadowing right: */
l = scheme_reverse(l);
for (; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) {
idx = SCHEME_CAR(l);
name = scheme_module_resolve(idx, 0);