1.0.31.9: some PCL micro-optimizations
[sbcl.git] / src / pcl / braid.lisp
index ae39f21..b0e3f3c 100644 (file)
           (allocate-standard-funcallable-instance-slots
            wrapper slots-init-p slots-init))
     fin))
-
-(defun allocate-structure-instance (wrapper &optional
-                                            (slots-init nil slots-init-p))
-  (let* ((class (wrapper-class wrapper))
-         (constructor (class-defstruct-constructor class)))
-    (if constructor
-        (let ((instance (funcall constructor))
-              (slots (class-slots class)))
-          (when slots-init-p
-            (dolist (slot slots)
-              (setf (slot-value-using-class class instance slot)
-                    (pop slots-init))))
-          instance)
-        (error "can't allocate an instance of class ~S" (class-name class)))))
 \f
 ;;;; BOOTSTRAP-META-BRAID
 ;;;;
                   class name class-eq-specializer-wrapper source
                   direct-supers direct-subclasses cpl wrapper))))))))
 
+    (setq **standard-method-classes**
+          (mapcar (lambda (name)
+                    (symbol-value (make-class-symbol name)))
+                  *standard-method-class-names*))
+
     (let* ((smc-class (find-class 'standard-method-combination))
            (smc-wrapper (!bootstrap-get-slot 'standard-class
                                              smc-class
                  slot-name
                  readers
                  writers
-                 nil)))))))))
+                 nil
+                 (ecd-source-location definition))))))))))
 
-(defun !bootstrap-accessor-definition (class-name accessor-name slot-name type)
+(defun !bootstrap-accessor-definition (class-name accessor-name slot-name type source-location)
   (multiple-value-bind (accessor-class make-method-function arglist specls doc)
       (ecase type
         (reader (values 'standard-reader-method
                                      doc
                                      :slot-name slot-name
                                      :object-class class-name
-                                     :method-class-function (constantly (find-class accessor-class))))))))
+                                     :method-class-function (constantly (find-class accessor-class))
+                                     :definition-source source-location))))))
 
 (defun !bootstrap-accessor-definitions1 (class-name
-                                        slot-name
-                                        readers
-                                        writers
-                                        boundps)
+                                         slot-name
+                                         readers
+                                         writers
+                                         boundps
+                                         source-location)
   (flet ((do-reader-definition (reader)
            (!bootstrap-accessor-definition class-name
                                            reader
                                            slot-name
-                                           'reader))
+                                           'reader
+                                           source-location))
          (do-writer-definition (writer)
            (!bootstrap-accessor-definition class-name
                                            writer
                                            slot-name
-                                           'writer))
+                                           'writer
+                                           source-location))
          (do-boundp-definition (boundp)
            (!bootstrap-accessor-definition class-name
                                            boundp
                                            slot-name
-                                           'boundp)))
+                                           'boundp
+                                           source-location)))
     (dolist (reader readers) (do-reader-definition reader))
     (dolist (writer writers) (do-writer-definition writer))
     (dolist (boundp boundps) (do-boundp-definition boundp))))
 (defun eval-form (form)
   (lambda () (eval form)))
 
-(defun ensure-non-standard-class (name &optional existing-class)
+(defun ensure-non-standard-class (name classoid &optional existing-class)
   (flet
       ((ensure (metaclass &optional (slots nil slotsp))
-         (let ((supers
-                (mapcar #'classoid-name (classoid-direct-superclasses
-                                         (find-classoid name)))))
+         (let ((supers (mapcar #'classoid-name (classoid-direct-superclasses classoid))))
            (if slotsp
                (ensure-class-using-class existing-class name
                                          :metaclass metaclass :name name
           ((condition-type-p name)
            (ensure 'condition-class
                    (mapcar #'slot-initargs-from-condition-slot
-                           (condition-classoid-slots (find-classoid name)))))
+                           (condition-classoid-slots classoid))))
           (t
            (error "~@<~S is not the name of a class.~@:>" name)))))
 
 (defun ensure-deffoo-class (classoid)
   (let ((class (classoid-pcl-class classoid)))
     (cond (class
-           (ensure-non-standard-class (class-name class) class))
-          ((eq 'complete *boot-state*)
-           (ensure-non-standard-class (classoid-name classoid))))))
+           (ensure-non-standard-class (class-name class) classoid class))
+          ((eq 'complete **boot-state**)
+           (ensure-non-standard-class (classoid-name classoid) classoid)))))
 
 (pushnew 'ensure-deffoo-class sb-kernel::*defstruct-hooks*)
 (pushnew 'ensure-deffoo-class sb-kernel::*define-condition-hooks*)
 ;;; FIXME: only needed during bootstrap
 (defun make-class-predicate (class name)
   (let* ((gf (ensure-generic-function name :lambda-list '(object)))
-         (mlist (if (eq *boot-state* 'complete)
-                    (generic-function-methods gf)
-                    (early-gf-methods gf))))
+         (mlist (if (eq **boot-state** 'complete)
+                    (early-gf-methods gf)
+                    (generic-function-methods gf))))
     (unless mlist
       (unless (eq class *the-class-t*)
         (let* ((default-method-function #'constantly-nil)
 
 ;;; Set the inherits from CPL, and register the layout. This actually
 ;;; installs the class in the Lisp type system.
-(defun update-lisp-class-layout (class layout)
+(defun %update-lisp-class-layout (class layout)
+  ;; Protected by *world-lock* in callers.
   (let ((classoid (layout-classoid layout))
         (olayout (class-wrapper class)))
     (unless (eq (classoid-layout classoid) layout)
         (when (and name (symbolp name) (eq name (classoid-name classoid)))
           (setf (find-classoid name) classoid))))))
 
-(defun set-class-type-translation (class classoid)
+(defun %set-class-type-translation (class classoid)
   (when (not (typep classoid 'classoid))
     (setq classoid (find-classoid classoid nil)))
   (etypecase classoid
      (setf (info :type :translator class)
            (lambda (spec) (declare (ignore spec)) classoid)))))
 
-(clrhash *find-class*)
 (!bootstrap-meta-braid)
 (!bootstrap-accessor-definitions t)
 (!bootstrap-class-predicates t)
 (!bootstrap-class-predicates nil)
 (!bootstrap-built-in-classes)
 
-(dohash ((name x) *find-class*)
-  (let* ((class (find-class-from-cell name x))
-         (layout (class-wrapper class))
-         (lclass (layout-classoid layout))
-         (lclass-pcl-class (classoid-pcl-class lclass))
-         (olclass (find-classoid name nil)))
-    (if lclass-pcl-class
-        (aver (eq class lclass-pcl-class))
-        (setf (classoid-pcl-class lclass) class))
+(dohash ((name x) sb-kernel::*classoid-cells*)
+  (when (classoid-cell-pcl-class x)
+    (let* ((class (find-class-from-cell name x))
+           (layout (class-wrapper class))
+           (lclass (layout-classoid layout))
+           (lclass-pcl-class (classoid-pcl-class lclass))
+           (olclass (find-classoid name nil)))
+      (if lclass-pcl-class
+          (aver (eq class lclass-pcl-class))
+          (setf (classoid-pcl-class lclass) class))
 
-    (update-lisp-class-layout class layout)
+      (%update-lisp-class-layout class layout)
 
-    (cond (olclass
-           (aver (eq lclass olclass)))
-          (t
-           (setf (find-classoid name) lclass)))
+      (cond (olclass
+             (aver (eq lclass olclass)))
+            (t
+             (setf (find-classoid name) lclass)))
 
-    (set-class-type-translation class name)))
+      (%set-class-type-translation class name))))
 
-(setq *boot-state* 'braid)
+(setq **boot-state** 'braid)
 
 (defmethod no-applicable-method (generic-function &rest args)
   (error "~@<There is no applicable method for the generic function ~2I~_~S~