0.6.11.43:
[sbcl.git] / src / pcl / boot.lisp
index 8dcef58..9249bde 100644 (file)
@@ -163,7 +163,7 @@ bootstrapping.
   (let ((initargs ())
        (methods ()))
     (flet ((duplicate-option (name)
-            (error 'sb-kernel:simple-program-error
+            (error 'simple-program-error
                    :format-control "The option ~S appears more than once."
                    :format-arguments (list name)))
           (expand-method-definition (qab) ; QAB = qualifiers, arglist, body
@@ -199,7 +199,7 @@ bootstrapping.
              (t
               ;; ANSI requires that unsupported things must get a
               ;; PROGRAM-ERROR.
-              (error 'sb-kernel:simple-program-error
+              (error 'simple-program-error
                      :format-control "unsupported option ~S"
                      :format-arguments (list option))))))
 
@@ -707,7 +707,7 @@ bootstrapping.
                `(not (null .next-method.))))
      ,@body))
 
-(defstruct method-call
+(defstruct (method-call (:copier nil))
   (function #'identity :type function)
   call-method-args)
 
@@ -728,7 +728,7 @@ bootstrapping.
                             `(list ,@required-args+rest-arg))
                        (method-call-call-method-args ,method-call)))
 
-(defstruct fast-method-call
+(defstruct (fast-method-call (:copier nil))
   (function #'identity :type function)
   pv-cell
   next-method-call
@@ -745,7 +745,7 @@ bootstrapping.
                (fast-method-call-next-method-call ,method-call)
                ,@required-args+rest-arg))
 
-(defstruct fast-instance-boundp
+(defstruct (fast-instance-boundp (:copier nil))
   (index 0 :type fixnum))
 
 #-sb-fluid (declaim (sb-ext:freeze-type fast-instance-boundp))
@@ -806,7 +806,22 @@ bootstrapping.
   (unless (constantp restp)
     (error "The RESTP argument is not constant."))
   (setq restp (eval restp))
-  `(progn
+  `(locally
+
+     ;; In sbcl-0.6.11.43, the compiler would issue bogus warnings
+     ;; about type mismatches in unreachable code when we
+     ;; macroexpanded the GET-SLOTS-OR-NIL expressions here and
+     ;; byte-compiled the code. GET-SLOTS-OR-NIL is now an inline
+     ;; function instead of a macro, which seems sufficient to solve
+     ;; the problem all by itself (probably because of some quirk in
+     ;; the relative order of expansion and type inference) but we
+     ;; also use overkill by NOTINLINEing GET-SLOTS-OR-NIL, because it
+     ;; looks as though (1) inlining isn't that much of a win anyway,
+     ;; and (2a) once you miss the FAST-METHOD-CALL clause you're
+     ;; going to be slow anyway, but (2b) code bloat still hurts even
+     ;; when it's off the critical path.
+     (declare (notinline get-slots-or-nil))
+
      (trace-emf-call ,emf ,restp (list ,@required-args+rest-arg))
      (cond ((typep ,emf 'fast-method-call)
             (invoke-fast-method-call ,emf ,@required-args+rest-arg))
@@ -963,8 +978,8 @@ bootstrapping.
              (null closurep)
              (null applyp))
         `(let () ,@body))
-        ((and (null closurep)
-              (null applyp))
+       ((and (null closurep)
+             (null applyp))
         ;; OK to use MACROLET, and all args are mandatory
         ;; (else APPLYP would be true).
         `(call-next-method-bind
@@ -1190,7 +1205,6 @@ bootstrapping.
   (let ((method-spec (or (getf initargs ':method-spec)
                         (make-method-spec name quals specls))))
     (setf (getf initargs ':method-spec) method-spec)
-    (record-definition 'method method-spec)
     (load-defmethod-internal class name quals specls
                             ll initargs pv-table-symbol)))
 
@@ -1284,7 +1298,7 @@ bootstrapping.
 \f
 (defun analyze-lambda-list (lambda-list)
   (flet (;; FIXME: Is this redundant with SB-C::MAKE-KEYWORD-FOR-ARG?
-        (parse-keyword-argument (arg)
+        (parse-key-argument (arg)
           (if (listp arg)
               (if (listp (car arg))
                   (caar arg)
@@ -1314,7 +1328,7 @@ bootstrapping.
            (ecase state
              (required  (incf nrequired))
              (optional  (incf noptional))
-             (key       (push (parse-keyword-argument x) keywords)
+             (key       (push (parse-key-argument x) keywords)
                         (push x keyword-parameters))
              (rest      ()))))
       (values nrequired noptional keysp restp allow-other-keys-p
@@ -1382,9 +1396,8 @@ bootstrapping.
               existing function-name all-keys))))
 
 (defun generic-clobbers-function (function-name)
-  (error 'sb-kernel:simple-program-error
-        :format-control
-        "~S already names an ordinary function or a macro."
+  (error 'simple-program-error
+        :format-control "~S already names an ordinary function or a macro."
         :format-arguments (list function-name)))
 
 (defvar *sgf-wrapper*
@@ -1425,16 +1438,17 @@ bootstrapping.
   (!bootstrap-slot-index 'standard-generic-function 'dfun-state))
 
 (defstruct (arg-info
-            (:conc-name nil)
-            (:constructor make-arg-info ()))
+           (:conc-name nil)
+           (:constructor make-arg-info ())
+           (:copier nil))
   (arg-info-lambda-list :no-lambda-list)
   arg-info-precedence
   arg-info-metatypes
   arg-info-number-optional
   arg-info-key/rest-p
-  arg-info-keywords ;nil       no keyword or rest allowed
-                   ;(k1 k2 ..) each method must accept these keyword arguments
-                   ;T    must have &key or &rest
+  arg-info-keys   ;nil        no &KEY or &REST allowed
+                 ;(k1 k2 ..) Each method must accept these &KEY arguments.
+                 ;T          must have &KEY or &REST
 
   gf-info-simple-accessor-type ; nil, reader, writer, boundp
   (gf-precompute-dfun-and-emf-p nil) ; set by set-arg-info
@@ -1502,7 +1516,7 @@ bootstrapping.
        (esetf (arg-info-metatypes arg-info) (make-list nreq))
        (esetf (arg-info-number-optional arg-info) nopt)
        (esetf (arg-info-key/rest-p arg-info) (not (null (or keysp restp))))
-       (esetf (arg-info-keywords arg-info)
+       (esetf (arg-info-keys arg-info)
               (if lambda-list-p
                   (if allow-other-keys-p t keywords)
                   (arg-info-key/rest-p arg-info)))))
@@ -1528,7 +1542,7 @@ bootstrapping.
       (let ((gf-nreq (arg-info-number-required arg-info))
            (gf-nopt (arg-info-number-optional arg-info))
            (gf-key/rest-p (arg-info-key/rest-p arg-info))
-           (gf-keywords (arg-info-keywords arg-info)))
+           (gf-keywords (arg-info-keys arg-info)))
        (unless (= nreq gf-nreq)
          (lose
           "the method has ~A required arguments than the generic function."
@@ -1545,7 +1559,7 @@ bootstrapping.
          (unless (or (and restp (not keysp))
                      allow-other-keys-p
                      (every #'(lambda (k) (memq k keywords)) gf-keywords))
-           (lose "the method does not accept each of the keyword arguments~%~
+           (lose "the method does not accept each of the &KEY arguments~%~
                   ~S."
                  gf-keywords)))))))
 
@@ -2047,7 +2061,7 @@ bootstrapping.
 ;;; into the 'real' arguments. This is where the syntax of DEFMETHOD
 ;;; is really implemented.
 (defun parse-defmethod (cdr-of-form)
-  ;;(declare (values name qualifiers specialized-lambda-list body))
+  (declare (list cdr-of-form))
   (let ((name (pop cdr-of-form))
        (qualifiers ())
        (spec-ll ()))
@@ -2058,6 +2072,7 @@ bootstrapping.
     (values name qualifiers spec-ll cdr-of-form)))
 
 (defun parse-specializers (specializers)
+  (declare (list specializers))
   (flet ((parse (spec)
           (let ((result (specializer-from-type spec)))
             (if (specializerp result)