~ chicken-core (chicken-5) de3731bd8b0fef528a1d2d0ebfb6af2e65dfa71e


commit de3731bd8b0fef528a1d2d0ebfb6af2e65dfa71e
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Wed Apr 13 06:14:45 2011 -0400
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Wed Apr 13 06:14:45 2011 -0400

    proper environment switching with ,m (reported by ckeen)

diff --git a/csi.scm b/csi.scm
index 705e6beb..6527e2d3 100644
--- a/csi.scm
+++ b/csi.scm
@@ -428,7 +428,7 @@ EOF
    (lambda ()
      (let ((name (read)))
        (cond ((not name)
-	      (##sys#current-module #f)
+	      (##sys#switch-module #f)
 	      (printf "; resetting current module to toplevel~%"))
 	     ((string? name)
 	      (set! name (##sys#string->symbol name)))
@@ -436,7 +436,7 @@ EOF
 	      (printf "invalid module name `~a'~%" name))
 	     ((##sys#find-module (##sys#resolve-module-name name #f) #f) =>
 	      (lambda (m)
-		(##sys#current-module m)
+		(##sys#switch-module m)
 		(printf "; switching current module to `~a'~%" name)))
 	     (else
 	      (printf "undefined module `~a'~%" name))))))
diff --git a/modules.scm b/modules.scm
index d60560e2..3c190e77 100644
--- a/modules.scm
+++ b/modules.scm
@@ -68,12 +68,13 @@
 	module-meta-import-forms set-module-meta-import-forms!
 	module-exist-list set-module-exist-list!
 	module-meta-expressions set-module-meta-expressions!
-	module-defined-syntax-list set-module-defined-syntax-list!))
+	module-defined-syntax-list set-module-defined-syntax-list!
+	module-saved-environments set-module-saved-environments!))
 
 (define-record-type module
   (%make-module name export-list defined-list exist-list defined-syntax-list
 		undefined-list import-forms meta-import-forms meta-expressions 
-		vexports sexports) 
+		vexports sexports saved-environments) 
   module?
   (name module-name)			; SYMBOL
   (export-list module-export-list set-module-export-list!) ; (SYMBOL | (SYMBOL ...) ...)
@@ -85,7 +86,8 @@
   (meta-import-forms module-meta-import-forms set-module-meta-import-forms!)	    ; (SPEC ...)
   (meta-expressions module-meta-expressions set-module-meta-expressions!) ; (EXP ...)
   (vexports module-vexports set-module-vexports!)	      ; ((SYMBOL . SYMBOL) ...)
-  (sexports module-sexports set-module-sexports!) )	      ; ((SYMBOL SE TRANSFORMER) ...)
+  (sexports module-sexports set-module-sexports!)	      ; ((SYMBOL SE TRANSFORMER) ...)
+  (saved-environments module-saved-environments set-module-saved-environments!)) ; for csi's ",m" command, holds (<env> . <macroenv>)
 
 (define ##sys#module-name module-name)
 
@@ -96,7 +98,7 @@
    (module-sexports m)))
 
 (define (make-module name explist vexports sexports)
-  (%make-module name explist '() '() '() '() '() '() '() vexports sexports))
+  (%make-module name explist '() '() '() '() '() '() '() vexports sexports #f))
 
 (define (##sys#register-module-alias alias name)
   (##sys#module-alias-environment
@@ -124,6 +126,21 @@
 	(err (error loc "module not found" name))
 	(else #f)))
 
+(define ##sys#switch-module
+  (let ((saved-default-envs #f))
+    (lambda (mod)
+      (let ((now (cons (##sys#current-environment) (##sys#macro-environment))))
+	(cond ((##sys#current-module) =>
+	       (lambda (m)
+		 (set-module-saved-environments! m now)))
+	      (else 
+	       (set! saved-default-envs now)))
+	(let ((saved (if mod (module-saved-environments mod) saved-default-envs)))
+	  (when saved
+	    (##sys#current-environment (car saved))
+	    (##sys#macro-environment (cdr saved))
+	    (##sys#current-module mod)))))))
+
 (define (##sys#toplevel-definition-hook sym mod exp val) #f)
 
 (define (##sys#register-meta-expression exp)
@@ -484,7 +501,11 @@
 		(VEXPORTS: ,@(map-se vexports))
 		(SEXPORTS: ,@(map-se sexports))))
 	  (set-module-vexports! mod vexports)
-	  (set-module-sexports! mod sexports))))))
+	  (set-module-sexports! mod sexports)
+	  (set-module-saved-environments!
+	   mod
+	   (cons (##sys#current-environment)
+		 (##sys#macro-environment))))))))
 
 (define ##sys#module-table '())
 
Trap