~ chicken-core (chicken-5) a01a9da3e4832791c70a062f4a1534909fff1c77
commit a01a9da3e4832791c70a062f4a1534909fff1c77
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Jul 30 22:08:02 2012 +0200
Commit: Christian Kellermann <ckeen@pestilenz.org>
CommitDate: Mon Aug 6 22:01:45 2012 +0200
Fix for star-export with explicit re-export of syntax (#882)
In a module with a "*" export list that explicitly re-exports syntax
(via "export") imported from another module, the export is currently
not externally visible. The reason for this is that the re-exported
syntax does not appear in the "sexports" slot of the module record
from the module that does the export. It is also not in the list of
syntax definition (since it is not defined in that module). To make
this work, "export" has to check for a module with "*" export-list and
add the information of the rexported syntax found in the current
macro-environment to the "sexports" slot. Finalization of the module
will merge syntax definitions found in the definition-list and in
sexports to make the reexport work with import-libraries.
Part of this patch is from sjamaan, the problem was reported by
megane.
Signed-off-by: Christian Kellermann <ckeen@pestilenz.org>
diff --git a/modules.scm b/modules.scm
index 6cea21e9..078da0d0 100644
--- a/modules.scm
+++ b/modules.scm
@@ -159,9 +159,17 @@
(define (##sys#add-to-export-list mod exps)
(let ((xl (module-export-list mod)))
(if (eq? xl #t)
- (let ((el (module-exist-list mod)))
- (set-module-exist-list!
- mod (append el exps)))
+ (let ((el (module-exist-list mod))
+ (me (##sys#macro-environment))
+ (sexps '()))
+ (for-each
+ (lambda (exp)
+ (cond ((assq exp me) =>
+ (lambda (a)
+ (set! sexps (cons a sexps))))))
+ exps)
+ (set-module-sexports! mod (append sexps (module-sexports mod)))
+ (set-module-exist-list! mod (append el exps)))
(set-module-export-list!
mod (append xl exps)))))
@@ -437,7 +445,7 @@
(module-defined-syntax-list mod)))
(sexports
(if (eq? #t explist)
- sdlist
+ (merge-se (module-sexports mod) sdlist)
(let loop ((me (##sys#macro-environment)))
(cond ((null? me) '())
((##sys#find-export (caar me) mod #f)
diff --git a/tests/module-tests.scm b/tests/module-tests.scm
index 4314f689..928046a0 100644
--- a/tests/module-tests.scm
+++ b/tests/module-tests.scm
@@ -276,5 +276,27 @@
c/bar) ;; <- Error: unbound variable: c/bar
2)
+;; somewhat related, but with syntax (#882, found by megane):
+
+(module m29 *
+ (import chicken scheme)
+ (define-syntax m29-baz
+ (lambda _
+ ''foo)))
+
+(module m30 *
+ (import chicken scheme)
+ (import m29)
+ (export m29-baz))
+
+(test-equal
+ "star-export with explicit re-export of syntax"
+ (module m31 ()
+ (import scheme chicken)
+ (import m30)
+ (m29-baz))
+ 'foo)
+
+
(test-end "modules")
Trap