0.pre7.98:
[sbcl.git] / src / compiler / ir1tran.lisp
index 5b025c6..8f68038 100644 (file)
 ;;; the continuation has no block, then we make it be in the block
 ;;; that the node is in. If the continuation heads its block, we end
 ;;; our block and link it to that block. If the continuation is not
-;;; currently used, then we set the derived-type for the continuation
+;;; currently used, then we set the DERIVED-TYPE for the continuation
 ;;; to that of the node, so that a little type propagation gets done.
 ;;;
 ;;; We also deal with a bit of THE's semantics here: we weaken the
 ;;; otherwise NIL is returned.
 ;;;
 ;;; This function may have arbitrary effects on the global environment
-;;; due to processing of PROCLAIMs and EVAL-WHENs. All syntax error
-;;; checking is done, with erroneous forms being replaced by a proxy
-;;; which signals an error if it is evaluated. Warnings about possibly
-;;; inconsistent or illegal changes to the global environment will
-;;; also be given.
+;;; due to processing of EVAL-WHENs. All syntax error checking is
+;;; done, with erroneous forms being replaced by a proxy which signals
+;;; an error if it is evaluated. Warnings about possibly inconsistent
+;;; or illegal changes to the global environment will also be given.
 ;;;
 ;;; We make the initial component and convert the form in a PROGN (and
 ;;; an optional NIL tacked on the end.) We then return the lambda. We
           (res (ir1-convert-lambda-body
                 forms ()
                 :debug-name (debug-namify "top level form ~S" form))))
-      (setf (functional-entry-function res) res
+      (setf (functional-entry-fun res) res
            (functional-arg-documentation res) ()
            (functional-kind res) :toplevel)
       res)))
        (use-continuation res cont)))
     (values)))
 
-;;; Add FUN to the COMPONENT-REANALYZE-FUNCTIONS. FUN is returned.
- (defun maybe-reanalyze-function (fun)
+;;; Add FUN to the COMPONENT-REANALYZE-FUNS. FUN is returned.
+(defun maybe-reanalyze-fun (fun)
   (declare (type functional fun))
   (when (typep fun '(or optional-dispatch clambda))
-    (pushnew fun (component-reanalyze-functions *current-component*)))
+    (pushnew fun (component-reanalyze-funs *current-component*)))
   fun)
 
 ;;; Generate a REF node for LEAF, frobbing the LEAF structure as
                                 :notinline))
                        (let ((fun (defined-fun-functional leaf)))
                          (when (and fun (not (functional-kind fun)))
-                           (maybe-reanalyze-function fun))))
+                           (maybe-reanalyze-fun fun))))
                   leaf))
         (res (make-ref (or (lexenv-find leaf type-restrictions)
                            (leaf-type leaf))
 ;;; Convert a reference to a symbolic constant or variable. If the
 ;;; symbol is entered in the LEXENV-VARIABLES we use that definition,
 ;;; otherwise we find the current global definition. This is also
-;;; where we pick off symbol macro and Alien variable references.
+;;; where we pick off symbol macro and alien variable references.
 (defun ir1-convert-variable (start cont name)
   (declare (type continuation start cont) (symbol name))
   (let ((var (or (lexenv-find name variables) (find-free-variable name))))
     (etypecase var
       (leaf
-       (when (and (lambda-var-p var) (lambda-var-ignorep var))
-        ;; (ANSI's specification for the IGNORE declaration requires
-        ;; that this be a STYLE-WARNING, not a full WARNING.)
-        (compiler-style-warning "reading an ignored variable: ~S" name))
+       (when (lambda-var-p var)
+        (let ((home (continuation-home-lambda-or-null start)))
+          (when home
+            (pushnew var (lambda-calls-or-closes home))))
+        (when (lambda-var-ignorep var)
+          ;; (ANSI's specification for the IGNORE declaration requires
+          ;; that this be a STYLE-WARNING, not a full WARNING.)
+          (compiler-style-warning "reading an ignored variable: ~S" name)))
        (reference-leaf start cont var))
       (cons
        (aver (eq (car var) 'MACRO))
          (t
           (ir1-convert-global-functoid-no-cmacro start cont form fun)))))
 
-;;; Handle the case of where the call was not a compiler macro, or was a
-;;; compiler macro and passed.
+;;; Handle the case of where the call was not a compiler macro, or was
+;;; a compiler macro and passed.
 (defun ir1-convert-global-functoid-no-cmacro (start cont form fun)
   (declare (type continuation start cont) (list form))
   ;; FIXME: Couldn't all the INFO calls here be converted into
              (return))
            (let ((this-cont (make-continuation)))
              (ir1-convert this-start this-cont form)
-             (setq this-start this-cont  forms (cdr forms)))))))
+             (setq this-start this-cont
+                   forms (cdr forms)))))))
   (values))
 \f
 ;;;; converting combinations
 
 ;;; Convert a function call where the function (i.e. the FUN argument)
-;;; is a LEAF. We return the COMBINATION node so that we can poke at
-;;; it if we want to.
+;;; is a LEAF. We return the COMBINATION node so that the caller can
+;;; poke at it if it wants to.
 (declaim (ftype (function (continuation continuation list leaf) combination)
                ir1-convert-combination))
 (defun ir1-convert-combination (start cont form fun)
   (if (functional-kind fun)
       (throw 'local-call-lossage fun)
       (ir1-convert-combination start cont form
-                              (maybe-reanalyze-function fun))))
+                              (maybe-reanalyze-fun fun))))
 \f
 ;;;; PROCESS-DECLS
 
           key))))
     key))
 
-;;; Parse a lambda-list into a list of VAR structures, stripping off
-;;; any aux bindings. Each arg name is checked for legality, and
+;;; Parse a lambda list into a list of VAR structures, stripping off
+;;; any &AUX bindings. Each arg name is checked for legality, and
 ;;; duplicate names are checked for. If an arg is globally special,
 ;;; the var is marked as :SPECIAL instead of :LEXICAL. &KEY,
 ;;; &OPTIONAL and &REST args are annotated with an ARG-INFO structure
 ;;;  4. a list of the &AUX variables; and
 ;;;  5. a list of the &AUX values.
 (declaim (ftype (function (list) (values list boolean boolean list list))
-               find-lambda-vars))
-(defun find-lambda-vars (list)
+               make-lambda-vars))
+(defun make-lambda-vars (list)
   (multiple-value-bind (required optional restp rest keyp keys allowp aux
                        morep more-context more-count)
       (parse-lambda-list list)
 ;;; Create a lambda node out of some code, returning the result. The
 ;;; bindings are specified by the list of VAR structures VARS. We deal
 ;;; with adding the names to the LEXENV-VARIABLES for the conversion.
-;;; The result is added to the NEW-FUNCTIONS in the
-;;; *CURRENT-COMPONENT* and linked to the component head and tail.
+;;; The result is added to the NEW-FUNS in the *CURRENT-COMPONENT* and
+;;; linked to the component head and tail.
 ;;;
 ;;; We detect special bindings here, replacing the original VAR in the
 ;;; lambda list with a temporary variable. We then pass a list of the
                              :%debug-name debug-name))
         (result (or result (make-continuation))))
 
-    ;; This function should fail internal assertions if we didn't set
-    ;; up a valid debug name above.
+    ;; just to check: This function should fail internal assertions if
+    ;; we didn't set up a valid debug name above.
     ;;
     ;; (In SBCL we try to make everything have a debug name, since we
     ;; lack the omniscient perspective the original implementors used
        (let ((block (continuation-block result)))
          (when block
            (let ((return (make-return :result result :lambda lambda))
-                 (tail-set (make-tail-set :functions (list lambda)))
+                 (tail-set (make-tail-set :funs (list lambda)))
                  (dummy (make-continuation)))
              (setf (lambda-tail-set lambda) tail-set)
              (setf (lambda-return lambda) return)
            (link-blocks block (component-tail *current-component*))))))
 
     (link-blocks (component-head *current-component*) (node-block bind))
-    (push lambda (component-new-functions *current-component*))
+    (push lambda (component-new-funs *current-component*))
     lambda))
 
 ;;; Create the actual entry-point function for an optional entry
                                     :%source-name source-name
                                     :%debug-name debug-name))
        (min (or (position-if #'lambda-var-arg-info vars) (length vars))))
-    (push res (component-new-functions *current-component*))
+    (push res (component-new-funs *current-component*))
     (ir1-convert-hairy-args res () () () () vars nil body aux-vars aux-vals
                            cont)
     (setf (optional-dispatch-min-args res) min)
                    form))
   (unless (and (consp (cdr form)) (listp (cadr form)))
     (compiler-error
-     "The lambda expression has a missing or non-list lambda-list:~%  ~S"
+     "The lambda expression has a missing or non-list lambda list:~%  ~S"
      form))
 
   (multiple-value-bind (vars keyp allow-other-keys aux-vars aux-vals)
-      (find-lambda-vars (cadr form))
+      (make-lambda-vars (cadr form))
     (multiple-value-bind (forms decls) (sb!sys:parse-body (cddr form))
-      (let* ((cont (make-continuation))
+      (let* ((result-cont (make-continuation))
             (*lexenv* (process-decls decls
                                      (append aux-vars vars)
-                                     nil cont))
+                                     nil result-cont))
             (res (if (or (find-if #'lambda-var-arg-info vars) keyp)
                      (ir1-convert-hairy-lambda forms vars keyp
                                                allow-other-keys
-                                               aux-vars aux-vals cont
+                                               aux-vars aux-vals result-cont
                                                :source-name source-name
                                                :debug-name debug-name)
                      (ir1-convert-lambda-body forms vars
                                               :aux-vars aux-vars
                                               :aux-vals aux-vals
-                                              :result cont
+                                              :result result-cont
                                               :source-name source-name
                                               :debug-name debug-name))))
        (setf (functional-inline-expansion res) form)
            (specifier-type 'function))))
 
   (values))
-\f
-;;;; hacking function names
-
-;;; This is like LAMBDA, except the result is tweaked so that FUN-NAME
-;;; can extract a name. (Also possibly the name could also be used at
-;;; compile time to emit more-informative name-based compiler
-;;; diagnostic messages as well.)
-(defmacro-mundanely named-lambda (name args &body body)
-
-  ;; FIXME: For now, in this stub version, we just discard the name. A
-  ;; non-stub version might use either macro-level LOAD-TIME-VALUE
-  ;; hackery or customized IR1-transform level magic to actually put
-  ;; the name in place.
-  (aver (legal-fun-name-p name))
-  `(lambda ,args ,@body))