X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Flexenv.lisp;h=5eba1fabae94d93bef1bebb955e84a4302d46afb;hb=b08e81cd5a06fe5d792f0be1d1c2bf3409a4ae60;hp=8ff267423e4f849adc124cdbbf96eeb732b024af;hpb=28ce7a00cbce6d27b127fd6a2783325c8198a568;p=sbcl.git diff --git a/src/compiler/lexenv.lisp b/src/compiler/lexenv.lisp index 8ff2674..5eba1fa 100644 --- a/src/compiler/lexenv.lisp +++ b/src/compiler/lexenv.lisp @@ -11,24 +11,17 @@ (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 - 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 . ) (a @@ -47,23 +40,26 @@ (vars nil :type list) ;; BLOCKS and TAGS are alists from block and go-tag names to 2-lists ;; of the form ( ), where is the - ;; continuation to exit to, and is the corresponding ENTRY node. + ;; continuation to exit to, and 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) ;; 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)) @@ -74,6 +70,15 @@ (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))