1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-30 23:10:21 +02:00

Use module identity to filter for existing modules

This fixes a problem with R6RS's `import' in particuliar: when importing
a subset of a library/module, the interface created for that purpose
inherits the name of the module it is derived from.  The low-level
primitives that are used for importing would then disregard earlier
imports from the same module.

An example for this bug can be seen with the following library
definition:

(library (test-guile2)
  (export foo)
  (import (only (rnrs base) define)
          (only (rnrs base) error))

  (define (foo . args)
    #t))

In the above, the import of `define' would be disregarded when `error'
is imported, thus leading to a syntax error, since `(foo . args)' is
treated as an application, since the binding of `define' would be not
present.

* module/ice-9/boot-9.scm (module-use!): Remove the filtering of the
  existing imports of the module by name; a check for identity is
  already done beforehand.
  (module-use-interfaces!): Filter the existing imports by identity
  instead of filtering them by their names.
This commit is contained in:
Andreas Rottmann 2011-03-03 11:09:54 +01:00 committed by Andy Wingo
parent 9c3fa20a56
commit 51c0fd8086

View file

@ -1987,12 +1987,7 @@ VALUE."
;; Newly used modules must be appended rather than consed, so that ;; Newly used modules must be appended rather than consed, so that
;; `module-variable' traverses the use list starting from the first ;; `module-variable' traverses the use list starting from the first
;; used module. ;; used module.
(set-module-uses! module (set-module-uses! module (append (module-uses module)
(append (filter (lambda (m)
(not
(equal? (module-name m)
(module-name interface))))
(module-uses module))
(list interface))) (list interface)))
(hash-clear! (module-import-obarray module)) (hash-clear! (module-import-obarray module))
(module-modified module)))) (module-modified module))))
@ -2004,8 +1999,7 @@ VALUE."
(define (module-use-interfaces! module interfaces) (define (module-use-interfaces! module interfaces)
(let ((prev (filter (lambda (used) (let ((prev (filter (lambda (used)
(and-map (lambda (iface) (and-map (lambda (iface)
(not (equal? (module-name used) (not (eq? used iface)))
(module-name iface))))
interfaces)) interfaces))
(module-uses module)))) (module-uses module))))
(set-module-uses! module (set-module-uses! module