0.6.11.11:
[sbcl.git] / src / compiler / main.lisp
index 24dc333..e70a997 100644 (file)
               sb!xc:*compile-file-pathname*
               sb!xc:*compile-file-truename*))
 
-;;; the values of *PACKAGE* and policy when compilation started
-(defvar *initial-package*)
-(defvar *initial-policy*)
-(defvar *initial-interface-policy*)
-
-;;; The source-info structure for the current compilation. This is null
-;;; globally to indicate that we aren't currently in any identifiable
-;;; compilation.
+;;; the SOURCE-INFO structure for the current compilation. This is
+;;; null globally to indicate that we aren't currently in any
+;;; identifiable compilation.
 (defvar *source-info* nil)
 
-;;; True if we are within a WITH-COMPILATION-UNIT form (which normally
-;;; causes nested uses to be no-ops).
+;;; This is true if we are within a WITH-COMPILATION-UNIT form (which
+;;; normally causes nested uses to be no-ops).
 (defvar *in-compilation-unit* nil)
 
 ;;; Count of the number of compilation units dynamically enclosed by
          (entry-analyze component)
          (ir2-convert component)
 
-         (when (policy nil (>= speed cspeed))
+         (when (policy nil (>= speed compilation-speed))
            (maybe-mumble "copy ")
            (copy-propagate component))
 
 
 ;;; A FILE-INFO structure holds all the source information for a
 ;;; given file.
-(defstruct file-info
+(defstruct (file-info (:copier nil))
   ;; If a file, the truename of the corresponding source file. If from
   ;; a Lisp form, :LISP. If from a stream, :STREAM.
   (name (required-argument) :type (or pathname (member :lisp :stream)))
 (defstruct (source-info
            #-no-ansi-print-object
            (:print-object (lambda (s stream)
-                            (print-unreadable-object (s stream :type t)))))
+                            (print-unreadable-object (s stream :type t))))
+           (:copier nil))
   ;; the UT that compilation started at
   (start-time (get-universal-time) :type unsigned-byte)
   ;; a list of the FILE-INFO structures for this compilation
 ;;; rebinding around each file.
 ;;;
 ;;; FIXME: Since we now do the standard ANSI thing of only one file
-;;; per compile (unlike the CMU CL extended COMPILE-FILE) can't this
-;;; complexity (including ADVANCE-SOURCE-FILE) go away?
+;;; per compile (unlike the CMU CL extended COMPILE-FILE) this code is
+;;; becoming stale, and the remaining bits of it (and the related code
+;;; in ADVANCE-SOURCE-FILE) can go away.
 (defun get-source-stream (info)
   (declare (type source-info info))
   (cond ((source-info-stream info))
        (t
-        (setq *package* *initial-package*)
-        (setq *default-policy* (copy-policy *initial-policy*))
-        (setq *default-interface-policy*
-              (copy-policy *initial-interface-policy*))
         (let* ((finfo (first (source-info-current-file info)))
                (name (file-info-name finfo)))
           (setq sb!xc:*compile-file-truename* name)
 ;;; *TOP-LEVEL-LAMBDAS* instead.
 (defun convert-and-maybe-compile (form path)
   (declare (list path))
-  (let* ((*lexenv* (make-lexenv :policy *default-policy*
-                               :interface-policy *default-interface-policy*))
+  (let* ((*lexenv* (make-lexenv :policy *policy*
+                               :interface-policy *interface-policy*))
         (tll (ir1-top-level form path nil)))
     (cond ((eq *block-compile* t) (push tll *top-level-lambdas*))
          (t (compile-top-level (list tll) nil)))))
 
 ;;; Process a top-level use of LOCALLY. We parse declarations and then
 ;;; recursively process the body.
-;;;
-;;; Binding *DEFAULT-xxx-POLICY* is pretty much of a hack, since it
-;;; causes LOCALLY to "capture" enclosed proclamations. It is
-;;; necessary because CONVERT-AND-MAYBE-COMPILE uses the value of
-;;; *DEFAULT-POLICY* as the policy. The need for this hack is due to
-;;; the quirk that there is no way to represent in a POLICY that an
-;;; optimize quality came from the default.
-;;; FIXME: Ideally, something should be done so that DECLAIM inside LOCALLY
-;;; works OK. Failing that, at least we could issue a warning instead
-;;; of silently screwing up.
 (defun process-top-level-locally (form path)
   (declare (list path))
   (multiple-value-bind (forms decls) (sb!sys:parse-body (cdr form) nil)
     (let* ((*lexenv*
            (process-decls decls nil nil (make-continuation)))
-          (*default-policy* (lexenv-policy *lexenv*))
-          (*default-interface-policy* (lexenv-interface-policy *lexenv*)))
+          ;; Binding *xxx-POLICY* is pretty much of a hack, since it
+          ;; causes LOCALLY to "capture" enclosed proclamations. It
+          ;; is necessary because CONVERT-AND-MAYBE-COMPILE uses the
+          ;; value of *POLICY* as the policy. The need for this hack
+          ;; is due to the quirk that there is no way to represent in
+          ;; a POLICY that an optimize quality came from the default.
+          ;; FIXME: Ideally, something should be done so that DECLAIM
+          ;; inside LOCALLY works OK. Failing that, at least we could
+          ;; issue a warning instead of silently screwing up.
+          (*policy* (lexenv-policy *lexenv*))
+          (*interface-policy* (lexenv-interface-policy *lexenv*)))
       (process-top-level-progn forms path))))
 
 ;;; Force any pending top-level forms to be compiled and dumped so
         #+nil (*compiler-note-count* 0)
         (*block-compile* *block-compile-argument*)
         (*package* (sane-package))
-        (*initial-package* (sane-package))
-        (*initial-policy* *default-policy*)
-        (*initial-interface-policy* *default-interface-policy*)
-        (*default-policy* (copy-policy *initial-policy*))
-        (*default-interface-policy* (copy-policy *initial-interface-policy*))
+        (*policy* *policy*)
+        (*interface-policy* *interface-policy*)
         (*lexenv* (make-null-lexenv))
         (*converting-for-interpreter* nil)
         (*source-info* info)