~ chicken-core (chicken-5) 33bccc8b946a37e0ec35be37ff6aba7e152bdb39


commit 33bccc8b946a37e0ec35be37ff6aba7e152bdb39
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Oct 4 09:32:16 2010 -0400
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Mon Oct 4 09:32:16 2010 -0400

    report location of unresolved refs in modules (only minimally tested)

diff --git a/compiler.scm b/compiler.scm
index 32c7fa66..c5323e39 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -441,14 +441,14 @@
 	(cadr x)
 	x) )
 
-  (define (resolve-variable x0 e se dest ldest)
+  (define (resolve-variable x0 e se dest ldest h)
     (let ((x (lookup x0 se)))
       (d `(RESOLVE-VARIABLE: ,x0 ,x ,(map car se)))
       (cond ((not (symbol? x)) x0)	; syntax?
 	    [(and constants-used (##sys#hash-table-ref constant-table x)) 
-	     => (lambda (val) (walk (car val) e se dest ldest)) ]
+	     => (lambda (val) (walk (car val) e se dest ldest h)) ]
 	    [(and inline-table-used (##sys#hash-table-ref inline-table x))
-	     => (lambda (val) (walk val e se dest ldest)) ]
+	     => (lambda (val) (walk val e se dest ldest h)) ]
 	    [(assq x foreign-variables)
 	     => (lambda (fv) 
 		  (let* ([t (second fv)]
@@ -458,7 +458,7 @@
 		     (foreign-type-convert-result
 		      (finish-foreign-result ft body)
 		      t)
-		     e se dest ldest)))]
+		     e se dest ldest h)))]
 	    [(assq x location-pointer-map)
 	     => (lambda (a)
 		  (let* ([t (third a)]
@@ -468,9 +468,9 @@
 		     (foreign-type-convert-result
 		      (finish-foreign-result ft body)
 		      t)
-		     e se dest ldest))) ]
+		     e se dest ldest h))) ]
 	    ((##sys#get x '##core#primitive))
-	    ((not (memq x e)) (##sys#alias-global-hook x #f)) ; only if global
+	    ((not (memq x e)) (##sys#alias-global-hook x #f h)) ; only if global
 	    (else x))))
   
   (define (eval/meta form)
@@ -505,13 +505,13 @@
 		 (for-each pretty-print imps)
 		 (print "\n;; END OF FILE"))))) ) )
 
-  (define (walk x e se dest ldest)
+  (define (walk x e se dest ldest h)
     (cond ((symbol? x)
 	   (cond ((keyword? x) `(quote ,x))
 		 ((memq x unlikely-variables)
 		  (warning 
 		   (sprintf "reference to variable `~s' possibly unintended" x) )))
-	   (resolve-variable x e se dest ldest))
+	   (resolve-variable x e se dest ldest h))
 	  ((not-pair? x)
 	   (if (constant? x)
 	       `(quote ,x)
@@ -528,11 +528,11 @@
 		    (name (or (and (symbol? name0) (##sys#get name0 '##core#primitive)) name0))
 		    (xexpanded (##sys#expand x se compiler-syntax-enabled)))
 	       (cond ((not (eq? x xexpanded))
-		      (walk xexpanded e se dest ldest))
+		      (walk xexpanded e se dest ldest h))
 		     
 		     [(and inline-table-used (##sys#hash-table-ref inline-table name))
 		      => (lambda (val)
-			   (walk (cons val (cdr x)) e se dest ldest)) ]
+			   (walk (cons val (cdr x)) e se dest ldest h)) ]
 		     
 		     [else
 		      (when ln (update-line-number-database! xexpanded ln))
@@ -540,11 +540,11 @@
 			
 			((##core#if)
 			 `(if
-			   ,(walk (cadr x) e se #f #f)
-			   ,(walk (caddr x) e se #f #f)
+			   ,(walk (cadr x) e se #f #f h)
+			   ,(walk (caddr x) e se #f #f h)
 			   ,(if (null? (cdddr x)) 
 				'(##core#undefined)
-				(walk (cadddr x) e se #f #f) ) ) )
+				(walk (cadddr x) e se #f #f h) ) ) )
 
 			((##core#syntax ##core#quote)
 			 `(quote ,(##sys#strip-syntax (cadr x))))
@@ -552,7 +552,7 @@
 			((##core#check)
 			 (if unsafe
 			     ''#t
-			     (walk (cadr x) e se dest ldest) ) )
+			     (walk (cadr x) e se dest ldest h) ) )
 
 			((##core#immutable)
 			 (let ((c (cadadr x)))
@@ -573,7 +573,7 @@
 			((##core#inline_loc_ref)
 			 `(##core#inline_loc_ref 
 			   ,(##sys#strip-syntax (cadr x))
-			   ,(walk (caddr x) e se dest ldest)))
+			   ,(walk (caddr x) e se dest ldes ht)))
 
 			((##core#require-for-syntax)
 			 (let ([ids (map eval (cdr x))])
@@ -604,7 +604,7 @@
 					(warning 
 					 (sprintf "extension `~A' is currently not installed" id)))
 				      `(##core#begin ,exp ,(loop (cdr ids))) ) ) ) )
-			    e se dest ldest) ) )
+			    e se dest ldest h) ) )
 
 			((##core#let)
 			 (let* ((bindings (cadr x))
@@ -614,12 +614,12 @@
 			   (set-real-names! aliases vars)
 			   `(let
 			     ,(map (lambda (alias b)
-				     (list alias (walk (cadr b) e se (car b) #t)) )
+				     (list alias (walk (cadr b) e se (car b) #t h)) )
 				   aliases bindings)
 			     ,(walk (##sys#canonicalize-body 
 				     (cddr x) se2 compiler-syntax-enabled)
 				    (append aliases e)
-				    se2 dest ldest) ) )  )
+				    se2 dest ldest h) ) )  )
 
 			((##core#letrec)
 			 (let ((bindings (cadr x))
@@ -633,7 +633,7 @@
 				       `(##core#set! ,(car b) ,(cadr b))) 
 				     bindings)
 			      (##core#let () ,@body) )
-			    e se dest ldest)))
+			    e se dest ldest h)))
 
 			((##core#lambda)
 			 (let ((llist (cadr x))
@@ -650,7 +650,7 @@
 				     (se2 (##sys#extend-se se vars aliases))
 				     (body0 (##sys#canonicalize-body 
 					     obody se2 compiler-syntax-enabled))
-				     (body (walk body0 (append aliases e) se2 #f #f))
+				     (body (walk body0 (append aliases e) se2 #f #f dest))
 				     (llist2 
 				      (build-lambda-list
 				       aliases argc
@@ -669,7 +669,7 @@
 				       (expand-profile-lambda
 					(if (memq dest e) ; should normally not be the case
 					    e
-					    (##sys#alias-global-hook dest #f))
+					    (##sys#alias-global-hook dest #f #f))
 					llist2 body) )
 				      (else l)))))))
 			
@@ -686,7 +686,7 @@
 			   (walk
 			    (##sys#canonicalize-body (cddr x) se2 compiler-syntax-enabled)
 			    e se2
-			    dest ldest) ) )
+			    dest ldest h) ) )
 			       
 		       ((##core#letrec-syntax)
 			(let* ((ms (map (lambda (b)
@@ -703,7 +703,7 @@
 			   ms)
 			  (walk
 			   (##sys#canonicalize-body (cddr x) se2 compiler-syntax-enabled)
-			   e se2 dest ldest)))
+			   e se2 dest ldest h)))
 			       
 		       ((##core#define-syntax)
 			(##sys#check-syntax
@@ -729,7 +729,7 @@
 				 (##sys#current-environment)
 				 (##sys#er-transformer ,body)) ;*** possibly wrong se?
 			       '(##core#undefined) )
-			   e se dest ldest)) )
+			   e se dest ldest h)) )
 
 		       ((##core#define-compiler-syntax)
 			(let* ((var (cadr x))
@@ -756,7 +756,7 @@
 					(##sys#er-transformer ,body)
 					(##sys#current-environment))))
 			       '(##core#undefined) )
-			   e se dest ldest)))
+			   e se dest ldest h)))
 
 		       ((##core#let-compiler-syntax)
 			(let ((bs (map
@@ -779,7 +779,7 @@
 				(walk 
 				 (##sys#canonicalize-body
 				  (cddr x) se compiler-syntax-enabled)
-				 e se dest ldest) )
+				 e se dest ldest h) )
 			      (lambda ()
 				(for-each
 				 (lambda (b)
@@ -793,7 +793,7 @@
 			 `(##core#begin
 			   ,@(fluid-let ((##sys#default-read-info-hook read-info-hook))
 			       (##sys#include-forms-from-file (cadr x))))
-			 e se dest ldest))
+			 e se dest ldest h))
 
 		       ((##core#module)
 			(let* ((x (##sys#strip-syntax x))
@@ -856,7 +856,7 @@
 							(car body)
 							e ;?
 							(##sys#current-environment)
-							#f #f)
+							#f #f h)
 						       xs))))))))
 			    (let ((body
 				   (canonicalize-begin-body
@@ -868,7 +868,7 @@
 					  (walk 
 					   x 
 					   e 	;?
-					   (##sys#current-meta-environment) #f #f) )
+					   (##sys#current-meta-environment) #f #f h) )
 					mreg))
 				     body))))
 			      (do ((cs compiler-syntax (cdr cs)))
@@ -886,7 +886,7 @@
 				(walk 
 				 (##sys#canonicalize-body obody se2 compiler-syntax-enabled)
 				 (append aliases e) 
-				 se2 #f #f) ] )
+				 se2 #f #f dest) ] )
 			  (set-real-names! aliases vars)
 			  `(##core#lambda ,aliases ,body) ) )
 
@@ -908,7 +908,7 @@
 					      (##core#inline_update 
 					       (,(third fv) ,type)
 					       ,(foreign-type-check tmp type) ) )
-					   e se #f #f))))
+					   e se #f #f h))))
 				 ((assq var location-pointer-map)
 				  => (lambda (a)
 				       (let* ([type (third a)]
@@ -919,11 +919,11 @@
 					      (,type)
 					      ,(second a)
 					      ,(foreign-type-check tmp type) ) )
-					  e se #f #f))))
+					  e se #f #f h))))
 				 (else
 				  (unless (memq var e) ; global?
 				    (set! var (or (##sys#get var '##core#primitive)
-						  (##sys#alias-global-hook var #t)))
+						  (##sys#alias-global-hook var #t dest)))
 				    (when safe-globals-flag
 				      (mark-variable var '##compiler#always-bound-to-procedure)
 				      (mark-variable var '##compiler#always-bound)))
@@ -938,29 +938,29 @@
 					 (##sys#notice "assignment to imported value binding" var)))
 				  (when (keyword? var)
 				    (warning (sprintf "assignment to keyword `~S'" var) ))
-				  `(set! ,var ,(walk val e se var0 (memq var e)))))))
+				  `(set! ,var ,(walk val e se var0 (memq var e) h))))))
 
 			((##core#inline)
-			 `(##core#inline ,(unquotify (cadr x) se) ,@(mapwalk (cddr x) e se)))
+			 `(##core#inline ,(unquotify (cadr x) se) ,@(mapwalk (cddr x) e se h)))
 
 			((##core#inline_allocate)
 			 `(##core#inline_allocate 
 			   ,(map (cut unquotify <> se) (second x))
-			   ,@(mapwalk (cddr x) e se)))
+			   ,@(mapwalk (cddr x) e se h)))
 
 			((##core#inline_update)
-			 `(##core#inline_update ,(cadr x) ,(walk (caddr x) e se #f #f)) )
+			 `(##core#inline_update ,(cadr x) ,(walk (caddr x) e se #f #f h)) )
 
 			((##core#inline_loc_update)
 			 `(##core#inline_loc_update 
 			   ,(cadr x) 
-			   ,(walk (caddr x) e se #f #f)
-			   ,(walk (cadddr x) e se #f #f)) )
+			   ,(walk (caddr x) e se #f #f h)
+			   ,(walk (cadddr x) e se #f #f h)) )
 
 			((##core#compiletimetoo ##core#elaborationtimetoo)
 			 (let ((exp (cadr x)))
 			   (eval/meta exp)
-			   (walk exp e se dest #f) ) )
+			   (walk exp e se dest #f h) ) )
 
 			((##core#compiletimeonly ##core#elaborationtimeonly)
 			 (eval/meta (cadr x))
@@ -973,24 +973,24 @@
 				(let ([x (car xs)]
 				      [r (cdr xs)] )
 				  (if (null? r)
-				      (list (walk x e se dest #f))
-				      (cons (walk x e se #f #f) (fold r)) ) ) ) )
+				      (list (walk x e se dest #f h))
+				      (cons (walk x e se #f #f h) (fold r)) ) ) ) )
 			     '(##core#undefined) ) )
 
 			((##core#foreign-lambda)
-			 (walk (expand-foreign-lambda x #f) e se dest ldest) )
+			 (walk (expand-foreign-lambda x #f) e se dest ldest h) )
 
 			((##core#foreign-safe-lambda)
-			 (walk (expand-foreign-lambda x #t) e se dest ldest) )
+			 (walk (expand-foreign-lambda x #t) e se dest ldest h) )
 
 			((##core#foreign-lambda*)
-			 (walk (expand-foreign-lambda* x #f) e se dest ldest) )
+			 (walk (expand-foreign-lambda* x #f) e se dest ldest h) )
 
 			((##core#foreign-safe-lambda*)
-			 (walk (expand-foreign-lambda* x #t) e se dest ldest) )
+			 (walk (expand-foreign-lambda* x #t) e se dest ldest h) )
 
 			((##core#foreign-primitive)
-			 (walk (expand-foreign-primitive x) e se dest ldest) )
+			 (walk (expand-foreign-primitive x) e se dest ldest h) )
 
 			((##core#define-foreign-variable)
 			 (let* ([var (##sys#strip-syntax (second x))]
@@ -1024,7 +1024,7 @@
 					(define 
 					 ,ret 
 					 ,(if (pair? (cdr conv)) (second conv) '##sys#values)) ) 
-				     e se dest ldest) ) ]
+				     e se dest ldest h) ) ]
 				 [else
 				  (##sys#hash-table-set! foreign-type-table name type)
 				  '(##core#undefined) ] ) ) )
@@ -1067,7 +1067,7 @@
 				      '() )
 				,(if init (fifth x) (fourth x)) ) )
 			    e (alist-cons var alias se)
-			    dest ldest) ) )
+			    dest ldest h) ) )
 
 			((##core#define-inline)
 			 (let* ((name (second x))
@@ -1099,7 +1099,7 @@
 				    (hide-variable var)
 				    (mark-variable var '##compiler#constant)
 				    (mark-variable var '##compiler#always-bound)
-				    (walk `(define ,var ',val) e se #f #f) ) ] ) ) )
+				    (walk `(define ,var ',val) e se #f #f h) ) ] ) ) )
 
 			((##core#declare)
 			 (walk
@@ -1107,7 +1107,7 @@
 			     ,@(map (lambda (d)
 				      (process-declaration d se))
 				    (cdr x) ) )
-			  e '() #f #f) )
+			  e '() #f #f h) )
 	     
 			((##core#foreign-callback-wrapper)
 			 (let-values ([(args lam) (split-at (cdr x) 4)])
@@ -1127,7 +1127,7 @@
 				"non-matching or invalid argument list to foreign callback-wrapper"
 				vars atypes) )
 			     `(##core#foreign-callback-wrapper
-			       ,@(mapwalk args e se)
+			       ,@(mapwalk args e se h)
 			       ,(walk `(##core#lambda 
 					,vars
 					(##core#let
@@ -1182,7 +1182,7 @@
 						     (##sys#make-c-string r ',name)) ) ) )
 						(else (cddr lam)) ) )
 					   rtype) ) )
-				      e se #f #f) ) ) ) )
+				      e se #f #f h) ) ) ) )
 
 			((##core#location)
 			 (let ([sym (cadr x)])
@@ -1191,22 +1191,23 @@
 				      => (lambda (a)
 					   (walk
 					    `(##sys#make-locative ,(second a) 0 #f 'location)
-					    e se #f #f) ) ]
+					    e se #f #f h) ) ]
 				     [(assq sym external-to-pointer) 
-				      => (lambda (a) (walk (cdr a) e se #f #f)) ]
+				      => (lambda (a) (walk (cdr a) e se #f #f h)) ]
 				     [(memq sym callback-names)
 				      `(##core#inline_ref (,(symbol->string sym) c-pointer)) ]
 				     [else 
 				      (walk 
 				       `(##sys#make-locative ,sym 0 #f 'location) 
-				       e se #f #f) ] )
+				       e se #f #f h) ] )
 			       (walk 
 				`(##sys#make-locative ,sym 0 #f 'location) 
-				e se #f #f) ) ) )
+				e se #f #f h) ) ) )
 				 
 			(else
-			 (let* ((x2 (fluid-let ((##sys#syntax-context (cons name ##sys#syntax-context)))
-				      (mapwalk x e se)))
+			 (let* ((x2 (fluid-let ((##sys#syntax-context
+						 (cons name ##sys#syntax-context)))
+				      (mapwalk x e se h)))
 				(head2 (car x2))
 				(old (##sys#hash-table-ref line-number-database-2 head2)) )
 			   (when ln
@@ -1222,7 +1223,7 @@
 	  ((constant? (car x))
 	   (emit-syntax-trace-info x #f)
 	   (warning "literal in operator position" x) 
-	   (mapwalk x e se) )
+	   (mapwalk x e se h) )
 
 	  (else
 	   (emit-syntax-trace-info x #f)
@@ -1231,10 +1232,10 @@
 	      `(##core#let 
 		((,tmp ,(car x)))
 		(,tmp ,@(cdr x)))
-	      e se dest ldest)))))
+	      e se dest ldest h)))))
   
-  (define (mapwalk xs e se)
-    (map (lambda (x) (walk x e se #f #f)) xs) )
+  (define (mapwalk xs e se h)
+    (map (lambda (x) (walk x e se #f #f h)) xs) )
 
   (when (memq 'c debugging-chicken) (newline) (pretty-print exp))
   (##sys#clear-trace-buffer)
@@ -1247,7 +1248,7 @@
      ,(begin
 	(set! extended-bindings (append internal-bindings extended-bindings))
 	exp) )
-   '() (##sys#current-environment) #f #f) ) )
+   '() (##sys#current-environment) #f #f #f) ) )
 
 
 (define (process-declaration spec se)	; se unused in the moment
@@ -1263,7 +1264,7 @@
   (define (globalize sym)
     (if (symbol? sym)
 	(let loop ((se se))			; ignores syntax bindings
-	  (cond ((null? se) (##sys#alias-global-hook sym #f))
+	  (cond ((null? se) (##sys#alias-global-hook sym #f #f)) ;XXX could hint at decl (3rd arg)
 		((and (eq? sym (caar se)) (symbol? (cdar se))) (cdar se))
 		(else (loop (cdr se)))))
 	sym))
diff --git a/eval.scm b/eval.scm
index 98564138..0bbc84cb 100644
--- a/eval.scm
+++ b/eval.scm
@@ -253,7 +253,7 @@
 	       (receive (i j) (lookup x e se)
 		 (cond [(not i)
 			(let ((var (if (not (assq x se)) ; global?
-				       (##sys#alias-global-hook j #f)
+				       (##sys#alias-global-hook j #f cntr)
 				       (or (##sys#get j '##core#primitive) j))))
 			  (if ##sys#eval-environment
 			      (let ([loc (##sys#hash-table-location ##sys#eval-environment var #t)])
@@ -367,7 +367,7 @@
 					 (and-let* ((a (assq var (##sys#current-environment)))
 						    ((symbol? (cdr a))))
 					   (##sys#notice "assignment to imported value binding" var)))
-				       (let ((var (##sys#alias-global-hook j #t)))
+				       (let ((var (##sys#alias-global-hook j #t cntr)))
 					 (if ##sys#eval-environment
 					     (let ([loc (##sys#hash-table-location
 							 ##sys#eval-environment 
diff --git a/expand.scm b/expand.scm
index a37d1ce3..062207f3 100644
--- a/expand.scm
+++ b/expand.scm
@@ -95,7 +95,7 @@
                           (getp x '##core#macro-alias) ) ) )
               (cond ((getp x '##core#real-name))
                     ((and alias (not (assq x se)))
-                     (##sys#alias-global-hook x #f))
+                     (##sys#alias-global-hook x #f #f))
                     ((not x2) x)
                     ((pair? x2) x)
                     (else x2))))
@@ -273,12 +273,13 @@
     "#" 
     (##sys#slot sym 1) ) ) )
 
-(define (##sys#alias-global-hook sym assign)
+(define (##sys#alias-global-hook sym assign where)
   (define (mrename sym)
     (cond ((##sys#current-module) => 
 	   (lambda (mod)
 	     (dm "(ALIAS) global alias " sym " in " (module-name mod))
-	     (unless assign (##sys#register-undefined sym mod))
+	     (unless assign 
+	       (##sys#register-undefined sym mod where))
 	     (##sys#module-rename sym (module-name mod))))
 	  (else sym)))
   (cond ((##sys#qualified-symbol? sym) sym)
@@ -1590,7 +1591,7 @@
   (defined-list module-defined-list set-module-defined-list!) ; ((SYMBOL . VALUE) ...)    - *exported* value definitions
   (exist-list module-exist-list set-module-exist-list!)	      ; (SYMBOL ...)    - only for checking refs to undef'd
   (defined-syntax-list module-defined-syntax-list set-module-defined-syntax-list!) ; ((SYMBOL . VALUE) ...)
-  (undefined-list module-undefined-list set-module-undefined-list!) ; (SYMBOL ...)
+  (undefined-list module-undefined-list set-module-undefined-list!) ; ((SYMBOL WHERE1 ...) ...)
   (import-forms module-import-forms set-module-import-forms!)	    ; (SPEC ...)
   (meta-import-forms module-meta-import-forms set-module-meta-import-forms!)	    ; (SPEC ...)
   (meta-expressions module-meta-expressions set-module-meta-expressions!) ; (EXP ...)
@@ -1633,8 +1634,8 @@
       (##sys#toplevel-definition-hook	; in compiler, hides unexported bindings
        (##sys#module-rename sym (module-name mod)) 
        mod exp #f)
-      (when (memq sym ulist)
-	(set-module-undefined-list! mod (##sys#delq sym ulist)))
+      (and-let* ((a (assq sym ulist)))
+	(set-module-undefined-list! mod (##sys#delq a ulist)))
       (check-for-redef sym (##sys#current-environment) (##sys#macro-environment))
       (set-module-exist-list! mod (cons sym (module-exist-list mod)))
       (when exp
@@ -1650,8 +1651,8 @@
 		   (##sys#find-export sym mod #t)))
 	  (ulist (module-undefined-list mod))
 	  (mname (module-name mod)))
-      (when (memq sym ulist)
-	(##sys#warn "use of syntax precedes definition" sym))
+      (when (assq sym ulist)	    
+	(##sys#warn "use of syntax precedes definition" sym)) ;XXX could report locations
       (check-for-redef sym (##sys#current-environment) (##sys#macro-environment))
       (dm "defined syntax: " sym)
       (when exp
@@ -1663,11 +1664,17 @@
        mod
        (cons (cons sym val) (module-defined-syntax-list mod))))))
 
-(define (##sys#register-undefined sym mod)
+(define (##sys#register-undefined sym mod where)
   (when mod
     (let ((ul (module-undefined-list mod)))
-      (unless (memq sym ul)
-	(set-module-undefined-list! mod (cons sym ul))))))
+      (cond ((assq sym ul) =>
+	     (lambda (a)
+	       (when (and where (not (memq where (cdr a))))
+		 (set-cdr! a (cons where (cdr a))))))
+	    (else
+	     (set-module-undefined-list!
+	      mod
+	      (cons (cons sym (if where (list where) '())) ul)))))))
 
 (define (##sys#register-module name explist #!optional (vexports '()) (sexports '()))
   (let ((mod (make-module name explist vexports sexports)))
@@ -1860,99 +1867,113 @@
 		 (loop (cdr xl))))
 	    (else (loop (cdr xl)))))))
 
-(define (##sys#finalize-module mod)
-  (let* ((explist (module-export-list mod))
-	 (name (module-name mod))
-	 (dlist (module-defined-list mod))
-	 (elist (module-exist-list mod))
-	 (missing #f)
-	 (sdlist (map (lambda (sym) (assq (car sym) (##sys#macro-environment)))
-		      (module-defined-syntax-list mod)))
-	 (sexports
-	  (if (eq? #t explist)
-	      sdlist
-	      (let loop ((me (##sys#macro-environment)))
-		(cond ((null? me) '())
-		      ((##sys#find-export (caar me) mod #f)
-		       (cons (car me) (loop (cdr me))))
-		      (else (loop (cdr me)))))))
-	 (vexports
-	  (let loop ((xl (if (eq? #t explist) elist explist)))
-	    (if (null? xl)
-		'()
-		(let* ((h (car xl))
-		       (id (if (symbol? h) h (car h))))
-		  (if (assq id sexports) 
-		      (loop (cdr xl))
-		      (cons 
-		       (cons 
-			id
-			(let ((def (assq id dlist)))
-			  (if (and def (symbol? (cdr def))) 
-			      (cdr def)
-			      (let ((a (assq id (##sys#current-environment))))
-				(cond ((and a (symbol? (cdr a))) 
-				       (dm "reexporting: " id " -> " (cdr a))
-				       (cdr a)) 
-				      ((not def)
-				       (set! missing #t)
-				       (##sys#warn 
-					(string-append 
-					 "exported identifier of module `" 
-					 (symbol->string name)
-					 "' has not been defined")
-					id)
-				       #f)
-				      (else (##sys#module-rename id name)))))))
-		       (loop (cdr xl)))))))))
-    (for-each
-     (lambda (u)
-       (unless (memq u elist)
-	 (set! missing #t)
-	 (##sys#warn "reference to possibly unbound identifier" u)
-	 (and-let* ((a (getp u '##core#db)))
-	   (if (= 1 (length a))
-	       (##sys#warn
-		(string-append 
-		 "  suggesting: `(import " (symbol->string (cadar a)) 
-		 ")'"))
-	       (##sys#warn
-		(string-append
-		 "  suggesting one of:\n"
-		 (let loop ((lst a))
-		   (if (null? lst)
-		       ""
-		       (string-append
-			"Warning:     (import " (symbol->string (cadar lst)) ")\n"
-			(loop (cdr lst)))))))))))
-     (module-undefined-list mod))
-    (when missing
-      (##sys#error "module unresolved" name))
-    (let* ((iexports 
-	    (map (lambda (exp)
-		   (cond ((symbol? (cdr exp)) exp)
-			 ((assq (car exp) (##sys#macro-environment)))
-			 (else (##sys#error "(internal) indirect export not found" (car exp)))) )
-		 (module-indirect-exports mod)))
-	   (new-se (merge-se 
-		    (##sys#macro-environment) 
-		    (##sys#current-environment) 
-		    iexports vexports sexports sdlist)))
-      (##sys#mark-imported-symbols iexports)
-      (for-each
-       (lambda (m)
-	 (let ((se (merge-se (cadr m) new-se))) ;XXX needed?
-	   (dm `(FIXUP: ,(car m) ,@(map-se se)))
-	   (set-car! (cdr m) se)))
-       sdlist)
-      (dm `(EXPORTS: 
-	    ,(module-name mod) 
-	    (DLIST: ,@dlist)
-	    (SDLIST: ,@(map-se sdlist))
-	    (IEXPORTS: ,@(map-se iexports))
-	    (VEXPORTS: ,@(map-se vexports))
-	    (SEXPORTS: ,@(map-se sexports))))
-      (set-module-vexports! mod vexports)
-      (set-module-sexports! mod sexports))))
+(define ##sys#finalize-module 
+  (let ((display display)
+	(write-char write-char))
+    (lambda (mod)
+      (let* ((explist (module-export-list mod))
+	     (name (module-name mod))
+	     (dlist (module-defined-list mod))
+	     (elist (module-exist-list mod))
+	     (missing #f)
+	     (sdlist (map (lambda (sym) (assq (car sym) (##sys#macro-environment)))
+			  (module-defined-syntax-list mod)))
+	     (sexports
+	      (if (eq? #t explist)
+		  sdlist
+		  (let loop ((me (##sys#macro-environment)))
+		    (cond ((null? me) '())
+			  ((##sys#find-export (caar me) mod #f)
+			   (cons (car me) (loop (cdr me))))
+			  (else (loop (cdr me)))))))
+	     (vexports
+	      (let loop ((xl (if (eq? #t explist) elist explist)))
+		(if (null? xl)
+		    '()
+		    (let* ((h (car xl))
+			   (id (if (symbol? h) h (car h))))
+		      (if (assq id sexports) 
+			  (loop (cdr xl))
+			  (cons 
+			   (cons 
+			    id
+			    (let ((def (assq id dlist)))
+			      (if (and def (symbol? (cdr def))) 
+				  (cdr def)
+				  (let ((a (assq id (##sys#current-environment))))
+				    (cond ((and a (symbol? (cdr a))) 
+					   (dm "reexporting: " id " -> " (cdr a))
+					   (cdr a)) 
+					  ((not def)
+					   (set! missing #t)
+					   (##sys#warn 
+					    (string-append 
+					     "exported identifier of module `" 
+					     (symbol->string name)
+					     "' has not been defined")
+					    id)
+					   #f)
+					  (else (##sys#module-rename id name)))))))
+			   (loop (cdr xl)))))))))
+	(for-each
+	 (lambda (u)
+	   (let* ((where (cdr u))
+		  (u (car u)))
+	     (unless (memq u elist)
+	       (let ((out (open-output-string)))
+		 (set! missing #t)
+		 (display "reference to possibly unbound identifier `" out)
+		 (display u out)
+		 (write-char #\' out)
+		 (when (pair? where)
+		   (display " in:" out)
+		   (for-each
+		    (lambda (sym)
+		      (display "\nWarning:    " out)
+		      (display sym out))
+		    where))
+		 (and-let* ((a (getp u '##core#db)))
+		   (cond ((= 1 (length a))
+			  (display "\nWarning:    suggesting: `(import " out)
+			  (display (cadar a) out)
+			  (display ")'" out))
+			 (else
+			  (display "\nWarning:    suggesting one of:" out)
+			  (for-each
+			   (lambda (a)
+			     (display "\nWarning:    (import " out)
+			     (display (cadr a) out)
+			     (write-char #\) out))
+			   a))))
+		 (##sys#warn (get-output-string out))))))
+	 (module-undefined-list mod))
+	(when missing
+	  (##sys#error "module unresolved" name))
+	(let* ((iexports 
+		(map (lambda (exp)
+		       (cond ((symbol? (cdr exp)) exp)
+			     ((assq (car exp) (##sys#macro-environment)))
+			     (else (##sys#error "(internal) indirect export not found" (car exp)))) )
+		     (module-indirect-exports mod)))
+	       (new-se (merge-se 
+			(##sys#macro-environment) 
+			(##sys#current-environment) 
+			iexports vexports sexports sdlist)))
+	  (##sys#mark-imported-symbols iexports)
+	  (for-each
+	   (lambda (m)
+	     (let ((se (merge-se (cadr m) new-se))) ;XXX needed?
+	       (dm `(FIXUP: ,(car m) ,@(map-se se)))
+	       (set-car! (cdr m) se)))
+	   sdlist)
+	  (dm `(EXPORTS: 
+		,(module-name mod) 
+		(DLIST: ,@dlist)
+		(SDLIST: ,@(map-se sdlist))
+		(IEXPORTS: ,@(map-se iexports))
+		(VEXPORTS: ,@(map-se vexports))
+		(SEXPORTS: ,@(map-se sexports))))
+	  (set-module-vexports! mod vexports)
+	  (set-module-sexports! mod sexports))))))
 
 (define ##sys#module-table '())
Trap