0.pre7.129:
[sbcl.git] / src / compiler / ir2tran.lisp
index 3bd5223..06caf36 100644 (file)
@@ -57,7 +57,7 @@
 (declaim (ftype (function ((or nlx-info lambda-var) physenv) tn)
                find-in-physenv))
 (defun find-in-physenv (thing physenv)
-  (or (cdr (assoc thing (ir2-physenv-environment (physenv-info physenv))))
+  (or (cdr (assoc thing (ir2-physenv-closure (physenv-info physenv))))
       (etypecase thing
        (lambda-var
         ;; I think that a failure of this assertion means that we're
     (move-continuation-result node block locs cont))
   (values))
 
-;;; Emit code to load a function object representing LEAF into RES.
-;;; This gets interesting when the referenced function is a closure:
-;;; we must make the closure and move the closed over values into it.
+;;; Emit code to load a function object implementing FUN into
+;;; RES. This gets interesting when the referenced function is a
+;;; closure: we must make the closure and move the closed-over values
+;;; into it.
 ;;;
-;;; LEAF is either a :TOPLEVEL-XEP functional or the XEP lambda for
-;;; the called function, since local call analysis converts all
-;;; closure references. If a TL-XEP, we know it is not a closure.
+;;; FUN is either a :TOPLEVEL-XEP functional or the XEP lambda for the
+;;; called function, since local call analysis converts all closure
+;;; references. If a :TOPLEVEL-XEP, we know it is not a closure.
 ;;;
 ;;; If a closed-over LAMBDA-VAR has no refs (is deleted), then we
 ;;; don't initialize that slot. This can happen with closures over
 ;;; top level variables, where optimization of the closure deleted the
 ;;; variable. Since we committed to the closure format when we
 ;;; pre-analyzed the top level code, we just leave an empty slot.
-(defun ir2-convert-closure (node block leaf res)
-  (declare (type ref node) (type ir2-block block)
-          (type functional leaf) (type tn res))
-  (unless (leaf-info leaf)
-    (setf (leaf-info leaf) (make-entry-info)))
-  (let ((entry (make-load-time-constant-tn :entry leaf))
-       (closure (etypecase leaf
+(defun ir2-convert-closure (ref ir2-block fun res)
+  (declare (type ref ref) (type ir2-block ir2-block)
+          (type functional fun) (type tn res))
+
+  (unless (leaf-info fun)
+    (setf (leaf-info fun)
+         (make-entry-info :name (functional-debug-name fun))))
+  (let ((entry (make-load-time-constant-tn :entry fun))
+       (closure (etypecase fun
                   (clambda
-                   (physenv-closure (get-lambda-physenv leaf)))
+
+                   ;; This assertion was sort of an experiment. It
+                   ;; would be nice and sane and easier to understand
+                   ;; things if it were *always* true, but
+                   ;; experimentally I observe that it's only
+                   ;; *almost* always true. -- WHN 2001-01-02
+                   #+nil 
+                   (aver (eql (lambda-component fun)
+                              (block-component (ir2-block-block ir2-block))))
+
+                   ;; Check for some weirdness which came up in bug
+                   ;; 138, 2002-01-02.
+                   ;;
+                   ;; The MAKE-LOAD-TIME-CONSTANT-TN call above puts
+                   ;; an :ENTRY record into the
+                   ;; IR2-COMPONENT-CONSTANTS table. The
+                   ;; dump-a-COMPONENT code
+                   ;;   * treats every HANDLEless :ENTRY record into a
+                   ;;     patch, and
+                   ;;   * expects every patch to correspond to an
+                   ;;     IR2-COMPONENT-ENTRIES record.
+                   ;; The IR2-COMPONENT-ENTRIES records are set by
+                   ;; ENTRY-ANALYZE walking over COMPONENT-LAMBDAS.
+                   ;; Bug 138b arose because there was a HANDLEless
+                   ;; :ENTRY record which didn't correspond to an
+                   ;; IR2-COMPONENT-ENTRIES record. That problem is
+                   ;; hard to debug when it's caught at dump time, so
+                   ;; this assertion tries to catch it here.
+                   (aver (member fun
+                                 (component-lambdas (lambda-component fun))))
+
+                   ;; another bug-138-related issue: COMPONENT-NEW-FUNS
+                   ;; is an IR1 temporary, and now that we're doing IR2
+                   ;; it should've been completely flushed (but wasn't).
+                   (aver (null (component-new-funs (lambda-component fun))))
+
+                   (physenv-closure (get-lambda-physenv fun)))
                   (functional
-                   (aver (eq (functional-kind leaf) :toplevel-xep))
+                   (aver (eq (functional-kind fun) :toplevel-xep))
                    nil))))
+
     (cond (closure
-          (let ((this-env (node-physenv node)))
-            (vop make-closure node block entry (length closure) res)
+          (let ((this-env (node-physenv ref)))
+            (vop make-closure ref ir2-block entry (length closure) res)
             (loop for what in closure and n from 0 do
               (unless (and (lambda-var-p what)
                            (null (leaf-refs what)))
-                (vop closure-init node block
+                (vop closure-init ref ir2-block
                      res
                      (find-in-physenv what this-env)
                      n)))))
          (t
-          (emit-move node block entry res))))
+          (emit-move ref ir2-block entry res))))
   (values))
 
 ;;; Convert a SET node. If the node's CONT is annotated, then we also
        (multiple-value-bind (check types) (continuation-check-types cont)
          (aver (eq check :simple))
          (let ((ntypes (length types)))
-           (mapcar #'(lambda (from to-type assertion)
-                       (let ((temp (make-normal-tn to-type)))
-                         (if assertion
-                             (emit-type-check node block from temp assertion)
-                             (emit-move node block from temp))
-                         temp))
+           (mapcar (lambda (from to-type assertion)
+                     (let ((temp (make-normal-tn to-type)))
+                       (if assertion
+                           (emit-type-check node block from temp assertion)
+                           (emit-move node block from temp))
+                       temp))
                    locs ptypes
                    (if (< ntypes nlocs)
                        (append types (make-list (- nlocs ntypes)
                                                 :initial-element nil))
                        types))))
-       (mapcar #'(lambda (from to-type)
-                   (if (eq (tn-primitive-type from) to-type)
-                       from
-                       (let ((temp (make-normal-tn to-type)))
-                         (emit-move node block from temp)
-                         temp)))
+       (mapcar (lambda (from to-type)
+                 (if (eq (tn-primitive-type from) to-type)
+                     from
+                     (let ((temp (make-normal-tn to-type)))
+                       (emit-move node block from temp)
+                       temp)))
                locs
                ptypes))))
 \f
                        (unless (eq (tn-primitive-type (car loc)) (car type))
                          (return nil))))
                 locs
-                (mapcar #'(lambda (loc type)
-                            (if (eq (tn-primitive-type loc) type)
-                                loc
-                                (make-normal-tn type)))
+                (mapcar (lambda (loc type)
+                          (if (eq (tn-primitive-type loc) type)
+                              loc
+                              (make-normal-tn type)))
                         (if (< nlocs ntypes)
                             (append locs
                                     (mapcar #'make-normal-tn
   (declare (type node node) (type ir2-block block) (list src dest))
   (let ((nsrc (length src))
        (ndest (length dest)))
-    (mapc #'(lambda (from to)
-             (unless (eq from to)
-               (emit-move node block from to)))
+    (mapc (lambda (from to)
+           (unless (eq from to)
+             (emit-move node block from to)))
          (if (> ndest nsrc)
              (append src (make-list (- ndest nsrc)
                                     :initial-element (emit-constant nil)))
 ;;; this.
 (defun ir2-convert-let (node block fun)
   (declare (type combination node) (type ir2-block block) (type clambda fun))
-  (mapc #'(lambda (var arg)
-           (when arg
-             (let ((src (continuation-tn node block arg))
-                   (dest (leaf-info var)))
-               (if (lambda-var-indirect var)
-                   (do-make-value-cell node block src dest)
-                   (emit-move node block src dest)))))
+  (mapc (lambda (var arg)
+         (when arg
+           (let ((src (continuation-tn node block arg))
+                 (dest (leaf-info var)))
+             (if (lambda-var-indirect var)
+                 (do-make-value-cell node block src dest)
+                 (emit-move node block src dest)))))
        (lambda-vars fun) (basic-combination-args node))
   (values))
 
           (type (or tn null) old-fp))
   (let* ((called-env (physenv-info (lambda-physenv fun)))
         (this-1env (node-physenv node))
-        (actuals (mapcar #'(lambda (x)
-                            (when x
-                              (continuation-tn node block x)))
-                        (combination-args node))))
+        (actuals (mapcar (lambda (x)
+                           (when x
+                             (continuation-tn node block x)))
+                         (combination-args node))))
     (collect ((temps)
              (locs))
       (dolist (var (lambda-vars fun))
            (locs loc))))
 
       (when old-fp
-       (dolist (thing (ir2-physenv-environment called-env))
+       (dolist (thing (ir2-physenv-closure called-env))
          (temps (find-in-physenv (car thing) this-1env))
          (locs (cdr thing)))
        
     (multiple-value-bind (temps locs)
        (emit-psetq-moves node block fun (ir2-physenv-old-fp this-env))
 
-      (mapc #'(lambda (temp loc)
-               (emit-move node block temp loc))
+      (mapc (lambda (temp loc)
+             (emit-move node block temp loc))
            temps locs))
 
     (emit-move node block
   (declare (type combination node) (type ir2-block block) (type clambda fun))
     (multiple-value-bind (temps locs) (emit-psetq-moves node block fun nil)
 
-      (mapc #'(lambda (temp loc)
-               (emit-move node block temp loc))
+      (mapc (lambda (temp loc)
+             (emit-move node block temp loc))
            temps locs))
   (values))
 
 ;;;   -- Known to be a function, no check needed: return the
 ;;;      continuation loc.
 ;;;   -- Not known what it is.
-(defun function-continuation-tn (node block cont)
+(defun fun-continuation-tn (node block cont)
   (declare (type continuation cont))
   (let ((2cont (continuation-info cont)))
     (if (eq (ir2-continuation-kind 2cont) :delayed)
         (return-pc (ir2-physenv-return-pc env)))
 
     (multiple-value-bind (fun-tn named)
-       (function-continuation-tn node block (basic-combination-fun node))
+       (fun-continuation-tn node block (basic-combination-fun node))
       (if named
          (vop* tail-call-named node block
                (fun-tn old-fp return-pc pass-refs)
           (loc-refs (reference-tn-list locs t))
           (nvals (length locs)))
       (multiple-value-bind (fun-tn named)
-         (function-continuation-tn node block (basic-combination-fun node))
+         (fun-continuation-tn node block (basic-combination-fun node))
        (if named
            (vop* call-named node block (fp fun-tn args) (loc-refs)
                  arg-locs nargs nvals)
           (locs (ir2-continuation-locs (continuation-info cont)))
           (loc-refs (reference-tn-list locs t)))
       (multiple-value-bind (fun-tn named)
-         (function-continuation-tn node block (basic-combination-fun node))
+         (fun-continuation-tn node block (basic-combination-fun node))
        (if named
            (vop* multiple-call-named node block (fp fun-tn args) (loc-refs)
                  arg-locs nargs)
            (t
             ;; No more args, so normal entry.
             (vop xep-allocate-frame node block start-label nil)))
-      (if (ir2-physenv-environment env)
+      (if (ir2-physenv-closure env)
          (let ((closure (make-normal-tn *backend-t-primitive-type*)))
            (vop setup-closure-environment node block start-label closure)
            (when (getf (functional-plist ef) :fin-function)
              (vop funcallable-instance-lexenv node block closure closure))
            (let ((n -1))
-             (dolist (loc (ir2-physenv-environment env))
+             (dolist (loc (ir2-physenv-closure env))
                (vop closure-ref node block closure (incf n) (cdr loc)))))
          (vop setup-environment node block start-label)))
 
     (aver (member (functional-kind fun)
                  '(nil :external :optional :toplevel :cleanup)))
 
-    (when (external-entry-point-p fun)
+    (when (xep-p fun)
       (init-xep-environment node block fun)
       #!+sb-dyncount
       (when *collect-dynamic-statistics*
         (returns (tail-set-info (lambda-tail-set fun))))
     (cond
      ((and (eq (return-info-kind returns) :fixed)
-          (not (external-entry-point-p fun)))
+          (not (xep-p fun)))
       (let ((locs (continuation-tns node block cont
                                    (return-info-types returns))))
        (vop* known-return node block
             (cont-locs (continuation-tns node block cont types))
             (nvals (length cont-locs))
             (locs (make-standard-value-tns nvals)))
-       (mapc #'(lambda (val loc)
-                 (emit-move node block val loc))
+       (mapc (lambda (val loc)
+               (emit-move node block val loc))
              cont-locs
              locs)
        (if (= nvals 1)
         (fun (ref-leaf (continuation-use (basic-combination-fun node))))
         (vars (lambda-vars fun)))
     (aver (eq (functional-kind fun) :mv-let))
-    (mapc #'(lambda (src var)
-             (when (leaf-refs var)
-               (let ((dest (leaf-info var)))
-                 (if (lambda-var-indirect var)
-                     (do-make-value-cell node block src dest)
-                     (emit-move node block src dest)))))
+    (mapc (lambda (src var)
+           (when (leaf-refs var)
+             (let ((dest (leaf-info var)))
+               (if (lambda-var-indirect var)
+                   (do-make-value-cell node block src dest)
+                   (emit-move node block src dest)))))
          (continuation-tns node block cont
-                           (mapcar #'(lambda (x)
-                                       (primitive-type (leaf-type x)))
+                           (mapcar (lambda (x)
+                                     (primitive-type (leaf-type x)))
                                    vars))
          vars))
   (values))
         (cont (node-cont node))
         (2cont (continuation-info cont)))
     (multiple-value-bind (fun named)
-       (function-continuation-tn node block (basic-combination-fun node))
+       (fun-continuation-tn node block (basic-combination-fun node))
       (aver (and (not named)
                 (eq (ir2-continuation-kind start-cont) :unknown)))
       (cond
 
 ;;; Deliver the values TNs to CONT using MOVE-CONTINUATION-RESULT.
 (defoptimizer (values ir2-convert) ((&rest values) node block)
-  (let ((tns (mapcar #'(lambda (x)
-                        (continuation-tn node block x))
+  (let ((tns (mapcar (lambda (x)
+                      (continuation-tn node block x))
                     values)))
     (move-continuation-result node block tns (node-cont node))))
 
    (once-only ((n-save-bs '(%primitive current-binding-pointer)))
      `(unwind-protect
          (progn
-           (mapc #'(lambda (var val)
-                     (%primitive bind val var))
+           (mapc (lambda (var val)
+                   (%primitive bind val var))
                  ,vars
                  ,vals)
            ,@body)
            (ir2-continuation-locs (continuation-info (second args)))
            nil))
          (nil)))
-
   (move-continuation-result node block () (node-cont node))
   (values))
 
            (when *collect-dynamic-statistics*
              (let ((first-node (continuation-next (block-start block))))
                (unless (or (and (bind-p first-node)
-                                (external-entry-point-p
-                                 (bind-lambda first-node)))
+                                (xep-p (bind-lambda first-node)))
                            (eq (continuation-fun-name
                                 (node-cont first-node))
                                '%nlx-entry))
                   (unless (or (node-tail-p last)
                               (info :function :info name)
                               (policy last (zerop safety)))
-                    (vop nil-function-returned-error last 2block
+                    (vop nil-fun-returned-error last 2block
                          (if name
                              (emit-constant name)
                              (multiple-value-bind (tn named)
-                                 (function-continuation-tn last 2block fun)
+                                 (fun-continuation-tn last 2block fun)
                                (aver (not named))
                                tn)))))))
              ((not (eq (ir2-block-next 2block) (block-info target)))
             (:full
              (ir2-convert-full-call node 2block))
             (t
-             (let ((fun (function-info-ir2-convert kind)))
+             (let ((fun (fun-info-ir2-convert kind)))
                (cond (fun
                       (funcall fun node 2block))
                      ((eq (basic-combination-info node) :full)