X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fpackage.lisp;h=66c924231ab9593daa9d8011604a3d55a7b85665;hb=771b864c8f32af7734bc0550aeaf1539fc4df194;hp=7f67aa633d90e1c0e59fdf063d2a6a8f552fd385;hpb=e92a2f8844d9125e76a4b96dc27b56632bfd85b6;p=sbcl.git diff --git a/src/code/package.lisp b/src/code/package.lisp index 7f67aa6..66c9242 100644 --- a/src/code/package.lisp +++ b/src/code/package.lisp @@ -30,12 +30,12 @@ ;;; the entry is unused. If it is one, then it is deleted. ;;; Double-hashing is used for collision resolution. -(sb!xc:deftype hash-vector () '(simple-array (unsigned-byte 8) (*))) +(def!type hash-vector () '(simple-array (unsigned-byte 8) (*))) -(sb!xc:defstruct (package-hashtable - (:constructor %make-package-hashtable - (table hash size &aux (free size))) - (:copier nil)) +(def!struct (package-hashtable + (:constructor %make-package-hashtable + (table hash size &aux (free size))) + (:copier nil)) ;; The g-vector of symbols. (table (missing-arg) :type simple-vector) ;; The i-vector of pname hash values. @@ -73,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 @@ -99,7 +99,12 @@ ;; 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)) + ;; package locking + #!+sb-package-locks + (lock nil :type boolean) + #!+sb-package-locks + (%implementation-packages nil :type list)) ;;;; iteration macros @@ -111,7 +116,8 @@ "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) (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) @@ -146,7 +152,8 @@ "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) @@ -171,7 +178,8 @@ "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) @@ -282,7 +290,7 @@ (error 'simple-program-error :format-control "At least one of :INTERNAL, :EXTERNAL, or ~ - :INHERITED must be supplied.")) + :INHERITED must be supplied.")) ,(dolist (symbol symbol-types) (unless (member symbol '(:internal :external :inherited)) (error 'program-error @@ -341,12 +349,13 @@ (car ,',packages))) :inherited))))) (setf ,',counter - (position-if #',',inherited-symbol-p - (the hash-vector - ,',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