0.8.3.3:
[sbcl.git] / src / code / package.lisp
index fa1c1da..bc7ca27 100644 (file)
 
 (sb!xc:deftype hash-vector () '(simple-array (unsigned-byte 8) (*)))
 
-(sb!xc:defstruct (package-hashtable (:constructor %make-package-hashtable ())
-                                   (:copier nil))
+(sb!xc:defstruct (package-hashtable
+                   (:constructor %make-package-hashtable
+                                 (table hash size &aux (free size)))
+                   (:copier nil))
   ;; The g-vector of symbols.
-  ;; FIXME: could just be type SIMPLE-VECTOR, with REQUIRED-ARGUMENT
-  (table nil :type (or simple-vector null))
+  (table (missing-arg) :type simple-vector)
   ;; The i-vector of pname hash values.
-  ;; FIXME: could just be type HASH-VECTOR, with REQUIRED-ARGUMENT
-  (hash nil :type (or hash-vector null))
+  (hash (missing-arg) :type hash-vector)
   ;; The total number of entries allowed before resizing.
   ;;
   ;; FIXME: CAPACITY would be a more descriptive name. (This is
   ;; related to but not quite the same as HASH-TABLE-SIZE, so calling
   ;; it SIZE seems somewhat misleading.)
-  (size 0 :type index)
+  (size (missing-arg) :type index)
   ;; The remaining number of entries that can be made before we have to rehash.
-  (free 0 :type index)
+  (free (missing-arg) :type index)
   ;; The number of deleted entries.
   (deleted 0 :type index))
 \f
@@ -56,8 +56,9 @@
 ;;; KLUDGE: We use DEF!STRUCT to define this not because we need to
 ;;; manipulate target package objects on the cross-compilation host,
 ;;; but only because its MAKE-LOAD-FORM function needs to be hooked
-;;; into the pre-CLOS DEF!STRUCT MAKE-LOAD-FORM system. The DEF!STRUCT
-;;; side-effect of defining a new PACKAGE type on the
+;;; into the pre-CLOS DEF!STRUCT MAKE-LOAD-FORM system so that we can
+;;; compile things like IN-PACKAGE in warm init before CLOS is set up.
+;;; The DEF!STRUCT side effect of defining a new PACKAGE type on the
 ;;; cross-compilation host is just a nuisance, and in order to avoid
 ;;; breaking the cross-compilation host, we need to work around it
 ;;; around by putting the new PACKAGE type (and the PACKAGEP predicate
@@ -72,7 +73,7 @@
   #!+sb-doc
   "the standard structure for the description of a package"
   ;; the name of the package, or NIL for a deleted package
-  (%name nil :type (or simple-string null))
+  (%name nil :type (or simple-base-string null))
   ;; nickname strings
   (%nicknames () :type list)
   ;; packages used by this package
   ;; packages that use this package
   (%used-by-list () :type list)
   ;; PACKAGE-HASHTABLEs of internal & external symbols
-  (internal-symbols (required-argument) :type package-hashtable)
-  (external-symbols (required-argument) :type package-hashtable)
+  (internal-symbols (missing-arg) :type package-hashtable)
+  (external-symbols (missing-arg) :type package-hashtable)
   ;; shadowing symbols
   (%shadowing-symbols () :type list)
   ;; documentation string for this package
-  (doc-string nil :type (or simple-string null)))
+  (doc-string nil :type (or simple-base-string null)))
 \f
 ;;;; iteration macros
 
   "DO-SYMBOLS (VAR [PACKAGE [RESULT-FORM]]) {DECLARATION}* {TAG | FORM}*
    Executes the FORMs at least once for each symbol accessible in the given
    PACKAGE with VAR bound to the current symbol."
-  (multiple-value-bind (body decls) body-decls
+  (multiple-value-bind (body decls)
+      (parse-body body-decls :doc-string-allowed nil)
     (let ((flet-name (gensym "DO-SYMBOLS-")))
       `(block nil
         (flet ((,flet-name (,var)
             (flet ((iterate-over-hash-table (table ignore)
                      (let ((hash-vec (package-hashtable-hash table))
                            (sym-vec (package-hashtable-table table)))
-                       (declare (type (simple-array (unsigned-byte 8) (*))
-                                      hash-vec)
-                                (type simple-vector sym-vec))
                        (dotimes (i (length sym-vec))
                          (when (>= (aref hash-vec i) 2)
                            (let ((sym (aref sym-vec i)))
   "DO-EXTERNAL-SYMBOLS (VAR [PACKAGE [RESULT-FORM]]) {DECL}* {TAG | FORM}*
    Executes the FORMs once for each external symbol in the given PACKAGE with
    VAR bound to the current symbol."
-  (multiple-value-bind (body decls) (parse-body body-decls nil)
+  (multiple-value-bind (body decls)
+      (parse-body body-decls :doc-string-allowed nil)
     (let ((flet-name (gensym "DO-SYMBOLS-")))
       `(block nil
         (flet ((,flet-name (,var)
                  (table (package-external-symbols package))
                  (hash-vec (package-hashtable-hash table))
                  (sym-vec (package-hashtable-table table)))
-            (declare (type (simple-array (unsigned-byte 8) (*))
-                           hash-vec)
-                     (type simple-vector sym-vec))
             (dotimes (i (length sym-vec))
               (when (>= (aref hash-vec i) 2)
                 (,flet-name (aref sym-vec i))))))
   "DO-ALL-SYMBOLS (VAR [RESULT-FORM]) {DECLARATION}* {TAG | FORM}*
    Executes the FORMs once for each symbol in every package with VAR bound
    to the current symbol."
-  (multiple-value-bind (body decls) (parse-body body-decls nil)
+  (multiple-value-bind (body decls)
+      (parse-body body-decls :doc-string-allowed nil)
     (let ((flet-name (gensym "DO-SYMBOLS-")))
       `(block nil
         (flet ((,flet-name (,var)
             (flet ((iterate-over-hash-table (table)
                      (let ((hash-vec (package-hashtable-hash table))
                            (sym-vec (package-hashtable-table table)))
-                       (declare (type (simple-array (unsigned-byte 8) (*))
-                                      hash-vec)
-                                (type simple-vector sym-vec))
                        (dotimes (i (length sym-vec))
                          (when (>= (aref hash-vec i) 2)
                            (,flet-name (aref sym-vec i)))))))
         (inherited-symbol-p (gensym))
         (BLOCK (gensym)))
     `(let* ((,these-packages ,package-list)
-           (,packages `,(mapcar #'(lambda (package)
-                                    (if (packagep package)
-                                        package
-                                        (find-package package)))
+           (,packages `,(mapcar (lambda (package)
+                                  (if (packagep package)
+                                      package
+                                      ;; Maybe FIND-PACKAGE-OR-DIE?
+                                      (or (find-package package)
+                                          (error 'simple-package-error
+                                                 ;; could be a character
+                                                 :name (string package)
+                                                 :format-control "~@<~S does not name a package ~:>"
+                                                 :format-arguments (list package)))))
                                 (if (consp ,these-packages)
                                     ,these-packages
                                     (list ,these-packages))))
            `(setf ,package-use-list (package-%use-list (car ,packages)))
            `(declare (ignore ,package-use-list)))
        (macrolet ((,init-macro (next-kind)
+        (declare (optimize (inhibit-warnings 3)))
         (let ((symbols (gensym)))
           `(progn
              (setf ,',kind ,next-kind)
                                    (car ,',packages))))
                     (when ,symbols
                       (setf ,',vector (package-hashtable-table ,symbols))
-                      (setf ,',hash-vector (package-hashtable-hash ,symbols)))))
+                      (setf ,',hash-vector
+                            (package-hashtable-hash ,symbols)))))
                 (:external
                  `(let ((,symbols (package-external-symbols
                                    (car ,',packages))))
                                  (,',init-macro ,(car ',ordered-types)))))))
         (when ,packages
           ,(when (null symbol-types)
-             (error 'program-error
+             (error 'simple-program-error
                     :format-control
-                    "Must supply at least one of :internal, :external, or ~
-                     :inherited."))
+                    "At least one of :INTERNAL, :EXTERNAL, or ~
+                     :INHERITED must be supplied."))
           ,(dolist (symbol symbol-types)
              (unless (member symbol '(:internal :external :inherited))
                (error 'program-error
                       :format-control
-                      "~S is not one of :internal, :external, or :inherited."
+                      "~S is not one of :INTERNAL, :EXTERNAL, or :INHERITED."
                       :format-argument symbol)))
           (,init-macro ,(car ordered-types))
           (flet ((,real-symbol-p (number)
                    (> number 1)))
             (macrolet ((,mname ()
+             (declare (optimize (inhibit-warnings 3)))
              `(block ,',BLOCK
                 (loop
                   (case ,',kind
                         `((:internal
                            (setf ,',counter
                                  (position-if #',',real-symbol-p
-                                              ,',hash-vector
+                                              (the hash-vector ,',hash-vector)
                                               :start (if ,',counter
                                                          (1+ ,',counter)
                                                          0)))
                         `((:external
                            (setf ,',counter
                                  (position-if #',',real-symbol-p
-                                              ,',hash-vector
+                                              (the hash-vector ,',hash-vector)
                                               :start (if ,',counter
                                                          (1+ ,',counter)
                                                          0)))
                            (flet ((,',inherited-symbol-p (number)
                                     (when (,',real-symbol-p number)
                                       (let* ((p (position
-                                                 number ,',hash-vector
+                                                 number
+                                                 (the hash-vector
+                                                   ,',hash-vector)
                                                  :start (if ,',counter
                                                             (1+ ,',counter)
                                                             0)))
                                                  (car ,',packages)))
                                              :inherited)))))
                              (setf ,',counter
-                                   (position-if #',',inherited-symbol-p
-                                                ,',hash-vector
-                                                :start (if ,',counter
-                                                           (1+ ,',counter)
-                                                           0))))
+                                   (when ,',hash-vector
+                                     (position-if #',',inherited-symbol-p
+                                                  (the hash-vector
+                                                    ,',hash-vector)
+                                                  :start (if ,',counter
+                                                             (1+ ,',counter)
+                                                             0)))))
                            (cond (,',counter
                                   (return-from
                                    ,',BLOCK