1.0.15.31: thread-safe FIND-CLASS -- really this time
[sbcl.git] / src / pcl / early-low.lisp
index 39d21d1..b69c592 100644 (file)
 ;;;; warranty about the software, its performance or its conformity to any
 ;;;; specification.
 
-(sb-int:file-comment
-  "$Header$")
-
 (in-package "SB-PCL")
+
+(/show "starting early-low.lisp")
 \f
 ;;; FIXME: The PCL package is internal and is used by code in potential
 ;;; bottlenecks. Access to it might be faster through #.(find-package "SB-PCL")
 ;;; could be made less viciously brittle when SB-FLUID.)
 ;;; (Or perhaps just define a macro
 ;;;   (DEFMACRO PKG (NAME)
-;;;     #!-SB-FLUID (FIND-PACKAGE NAME)
-;;;     #!+SB-FLUID `(FIND-PACKAGE ,NAME))
+;;;     #-SB-FLUID (FIND-PACKAGE NAME)
+;;;     #+SB-FLUID `(FIND-PACKAGE ,NAME))
 ;;; and use that to replace all three variables.)
-(defvar *pcl-package*               (find-package "SB-PCL"))
-(defvar *slot-accessor-name-package* (find-package "SB-SLOT-ACCESSOR-NAME"))
+(defvar *pcl-package*                (find-package "SB-PCL"))
+
+(declaim (inline defstruct-classoid-p))
+(defun defstruct-classoid-p (classoid)
+  ;; It is non-obvious to me why STRUCTURE-CLASSOID-P doesn't
+  ;; work instead of this. -- NS 2008-03-14
+  (typep (layout-info (classoid-layout classoid)) 'defstruct-description))
 
 ;;; This excludes structure types created with the :TYPE option to
 ;;; DEFSTRUCT. It also doesn't try to deal with types created by
 ;;; it needs a more mnemonic name. -- WHN 19991204
 (defun structure-type-p (type)
   (and (symbolp type)
-       (let ((class  (cl:find-class type nil)))
-        (and class
-             (typep (sb-kernel:layout-info (sb-kernel:class-layout class))
-                    'sb-kernel:defstruct-description)))))
+       (let ((classoid (find-classoid type nil)))
+         (and classoid
+              (not (condition-classoid-p classoid))
+              (defstruct-classoid-p classoid)))))
+
+;;; Symbol contruction utilities
+(defun format-symbol (package format-string &rest format-arguments)
+  (without-package-locks
+   (intern (apply #'format nil format-string format-arguments) package)))
+
+(defun make-class-symbol (class-name)
+  (format-symbol *pcl-package* "*THE-CLASS-~A*" (symbol-name class-name)))
+
+(defun make-wrapper-symbol (class-name)
+  (format-symbol *pcl-package* "*THE-WRAPPER-~A*" (symbol-name class-name)))
+
+(defun condition-type-p (type)
+  (and (symbolp type)
+       (condition-classoid-p (find-classoid type nil))))
+\f
+(declaim (special *the-class-t*
+                  *the-class-vector* *the-class-symbol*
+                  *the-class-string* *the-class-sequence*
+                  *the-class-rational* *the-class-ratio*
+                  *the-class-number* *the-class-null* *the-class-list*
+                  *the-class-integer* *the-class-float* *the-class-cons*
+                  *the-class-complex* *the-class-character*
+                  *the-class-bit-vector* *the-class-array*
+                  *the-class-stream* *the-class-file-stream*
+                  *the-class-string-stream*
+
+                  *the-class-slot-object*
+                  *the-class-structure-object*
+                  *the-class-standard-object*
+                  *the-class-funcallable-standard-object*
+                  *the-class-class*
+                  *the-class-generic-function*
+                  *the-class-built-in-class*
+                  *the-class-slot-class*
+                  *the-class-condition-class*
+                  *the-class-structure-class*
+                  *the-class-std-class*
+                  *the-class-standard-class*
+                  *the-class-funcallable-standard-class*
+                  *the-class-method*
+                  *the-class-standard-method*
+                  *the-class-standard-reader-method*
+                  *the-class-standard-writer-method*
+                  *the-class-standard-boundp-method*
+                  *the-class-global-reader-method*
+                  *the-class-global-writer-method*
+                  *the-class-global-boundp-method*
+                  *the-class-standard-generic-function*
+                  *the-class-standard-effective-slot-definition*
+
+                  *the-eslotd-standard-class-slots*
+                  *the-eslotd-funcallable-standard-class-slots*))
+
+(declaim (special *the-wrapper-of-t*
+                  *the-wrapper-of-vector* *the-wrapper-of-symbol*
+                  *the-wrapper-of-string* *the-wrapper-of-sequence*
+                  *the-wrapper-of-rational* *the-wrapper-of-ratio*
+                  *the-wrapper-of-number* *the-wrapper-of-null*
+                  *the-wrapper-of-list* *the-wrapper-of-integer*
+                  *the-wrapper-of-float* *the-wrapper-of-cons*
+                  *the-wrapper-of-complex* *the-wrapper-of-character*
+                  *the-wrapper-of-bit-vector* *the-wrapper-of-array*))
+\f
+(/show "finished with early-low.lisp")