0.9.1.51:
[sbcl.git] / src / compiler / lexenv.lisp
index acdf1a3..5eba1fa 100644 (file)
 
 (in-package "SB!C")
 
-#!-sb-fluid (declaim (inline internal-make-lexenv)) ; only called in one place
-
 ;;; The LEXENV represents the lexical environment used for IR1 conversion.
 ;;; (This is also what shows up as an ENVIRONMENT value in macroexpansion.)
 #!-sb-fluid (declaim (inline internal-make-lexenv)) ; only called in one place
 (def!struct (lexenv
-            (:constructor make-null-lexenv ())
-            (:constructor make-null-interactive-lexenv
-                          (&aux (policy (list '(safety . 3)
-                                              '(compilation-speed . 2)
-                                              '(debug . 2)
-                                              '(speed . 1)
-                                              '(space . 1)
-                                              '(inhibit-warnings . 1)))))
+            (:print-function print-lexenv)
+            (:constructor make-null-lexenv ())      
             (:constructor internal-make-lexenv
                           (funs vars blocks tags
                                  type-restrictions
-                                 weakend-type-restrictions
-                                lambda cleanup policy)))
+                                lambda cleanup handled-conditions
+                                disabled-package-locks policy)))
   ;; an alist of (NAME . WHAT), where WHAT is either a FUNCTIONAL (a
   ;; local function), a DEFINED-FUN, representing an
   ;; INLINE/NOTINLINE declaration, or a list (MACRO . <function>) (a
   (vars nil :type list)
   ;; BLOCKS and TAGS are alists from block and go-tag names to 2-lists
   ;; of the form (<entry> <continuation>), where <continuation> is the
-  ;; continuation to exit to, and <entry> is the corresponding ENTRY node.
+  ;; continuation to exit to, and <entry> is the corresponding ENTRY
+  ;; node.
   (blocks nil :type list)
   (tags nil :type list)
   ;; an alist (THING . CTYPE) which is used to keep track of
   ;; "pervasive" type declarations. When THING is a leaf, this is for
   ;; type declarations that pertain to the type in a syntactic extent
-  ;; which does not correspond to a binding of the affected name. When
-  ;; THING is a continuation, this is used to track the innermost THE
-  ;; type declaration.
+  ;; which does not correspond to a binding of the affected name.
   (type-restrictions nil :type list)
-  (weakend-type-restrictions nil :type list)
   ;; the lexically enclosing lambda, if any
   ;;
   ;; FIXME: This should be :TYPE (OR CLAMBDA NULL), but it was too hard
   ;; to get CLAMBDA defined in time for the cross-compiler.
   (lambda nil)
-  ;; the lexically enclosing cleanup, or NIL if none enclosing within Lambda
+  ;; the lexically enclosing cleanup, or NIL if none enclosing within LAMBDA
   (cleanup nil)
+  ;; condition types we handle with a handler around the compiler
+  (handled-conditions *handled-conditions*)
+  ;; lexically disabled package locks (list of symbols)
+  (disabled-package-locks *disabled-package-locks*)
   ;; the current OPTIMIZE policy
   (policy *policy* :type policy))
 
     (null (make-null-lexenv))
     (lexenv x)))
 
+(defun null-lexenv-p (lexenv)
+  (equalp (coerce-to-lexenv lexenv) (make-null-lexenv)))
+
+(defun print-lexenv (lexenv stream level)
+  (if (null-lexenv-p lexenv)
+      (print-unreadable-object (lexenv stream)
+       (write-string "NULL-LEXENV" stream))
+      (default-structure-print lexenv stream level)))
+
 (defun maybe-inline-syntactic-closure (lambda lexenv)
   (declare (type list lambda) (type lexenv lexenv))
   (aver (eql (first lambda) 'lambda))