X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-package.lisp;h=00cbc54efe98a64f8ab6cd244cdcd6923e28fa8b;hb=d720bc359f03734ccb9baf66cb45dc01d623f369;hp=fddb492a1395581db09ad55420c537185258d26c;hpb=b400484e0aa71c263c456fe7c85f80ed5661bff1;p=sbcl.git diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index fddb492..00cbc54 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -61,9 +61,6 @@ (declare (function function)) ;; FIXME: Since name conflicts can be signalled while holding the ;; mutex, user code can be run leading to lock ordering problems. - ;; - ;; This used to be a spinlock, but there it can be held for a long - ;; time while the debugger waits for user input. (sb!thread:with-recursive-lock (*package-graph-lock*) (funcall function))) @@ -75,7 +72,7 @@ (defmacro with-package-names ((names &key) &body body) `(let ((,names *package-names*)) - (with-locked-hash-table (,names) + (with-locked-system-table (,names) ,@body))) ;;;; PACKAGE-HASHTABLE stuff @@ -338,7 +335,8 @@ error if any of PACKAGES is not a valid package designator." ;;; most other operations, are unspecified for deleted packages. We ;;; just do the easy thing and signal errors in that case. (macrolet ((def (ext real) - `(defun ,ext (x) (,real (find-undeleted-package-or-lose x))))) + `(defun ,ext (package-designator) + (,real (find-undeleted-package-or-lose package-designator))))) (def package-nicknames package-%nicknames) (def package-use-list package-%use-list) (def package-used-by-list package-%used-by-list) @@ -599,7 +597,7 @@ implementation it is ~S." *default-package-use-list*) (cerror "Clobber existing package." "A package named ~S already exists" name) (setf clobber t)) - (with-packages () + (with-package-graph () ;; Check for race, signal the error outside the lock. (when (and (not clobber) (find-package name)) (go :restart)) @@ -640,9 +638,10 @@ implementation it is ~S." *default-package-use-list*) (defun rename-package (package-designator name &optional (nicknames ())) #!+sb-doc "Changes the name and nicknames for a package." + (let ((package nil)) (tagbody :restart - (let* ((package (find-undeleted-package-or-lose package-designator)) - (name (package-namify name)) + (setq package (find-undeleted-package-or-lose package-designator)) + (let* ((name (package-namify name)) (found (find-package name)) (nicks (mapcar #'string nicknames))) (unless (or (not found) (eq found package)) @@ -668,8 +667,8 @@ implementation it is ~S." *default-package-use-list*) (setf (package-%name package) name (gethash name names) package (package-%nicknames package) ())) - (%enter-new-nicknames package nicknames)) - package))) + (%enter-new-nicknames package nicknames)))) + package)) (defun delete-package (package-designator) #!+sb-doc @@ -778,7 +777,7 @@ implementation it is ~S." *default-package-use-list*) ;;; If the symbol named by the first LENGTH characters of NAME doesn't exist, ;;; then create it, special-casing the keyword package. -(defun intern* (name length package) +(defun intern* (name length package &key no-copy) (declare (simple-string name)) (multiple-value-bind (symbol where) (find-symbol* name length package) (cond (where @@ -792,7 +791,18 @@ implementation it is ~S." *default-package-use-list*) (setf (values symbol where) (find-symbol* name length package)) (if where (values symbol where) - (let ((symbol-name (subseq name 0 length))) + (let ((symbol-name (cond (no-copy + (aver (= (length name) length)) + name) + (t + ;; This so that SUBSEQ is inlined, + ;; because we need it fixed for cold init. + (string-dispatch + ((simple-array base-char (*)) + (simple-array character (*))) + name + (declare (optimize speed)) + (subseq name 0 length)))))) (with-single-package-locked-error (:package package "interning ~A" symbol-name) (let ((symbol (make-symbol symbol-name))) @@ -966,8 +976,8 @@ uninterned." (remove symbol shadowing-symbols))) (multiple-value-bind (s w) (find-symbol name package) - (declare (ignore s)) - (cond ((or (eq w :internal) (eq w :external)) + (cond ((not (eq symbol s)) nil) + ((or (eq w :internal) (eq w :external)) (nuke-symbol (if (eq w :internal) (package-internal-symbols package) (package-external-symbols package)) @@ -1116,6 +1126,7 @@ the importation, then a correctable error is signalled." (let ((found (member sym syms :test #'string=))) (if found (when (not (eq (car found) sym)) + (setf syms (remove (car found) syms)) (name-conflict package 'import sym sym (car found))) (push sym syms)))) ((not (eq s sym))