gencgc: More precise conservatism for pointers to boxed pages.
[sbcl.git] / src / code / weak.lisp
index 8ce3367..e5300e1 100644 (file)
@@ -9,26 +9,29 @@
 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
 ;;;; files for more information.
 
-(in-package "SB!EXT")
+(in-package "SB!IMPL")
 
 (defun make-weak-pointer (object)
   #!+sb-doc
-  "Allocates and returns a weak pointer which points to OBJECT."
-  (declare (values weak-pointer))
+  "Allocate and return a weak pointer which points to OBJECT."
   (make-weak-pointer object))
 
 #!-sb-fluid (declaim (inline weak-pointer-value))
 (defun weak-pointer-value (weak-pointer)
   #!+sb-doc
-  "If WEAK-POINTER is valid, returns the value of WEAK-POINTER and T.
-   If the referent of WEAK-POINTER has been garbage collected, returns
-   the values NIL and NIL."
-  (declare (type weak-pointer weak-pointer)
-          (values t (member t nil)))
-  ;; We don't need to wrap this with a without-gcing, because once we have
-  ;; extracted the value, our reference to it will keep the weak pointer
-  ;; from becoming broken. We just have to make sure the compiler won't
-  ;; reorder these primitives.
+  "If WEAK-POINTER is valid, return the value of WEAK-POINTER and T.
+If the referent of WEAK-POINTER has been garbage collected,
+returns the values NIL and NIL."
+  (declare (type weak-pointer weak-pointer))
+  ;; We don't need to wrap this with a WITHOUT-GCING, because once we
+  ;; have extracted the value, our reference to it will keep the weak
+  ;; pointer from becoming broken. We just have to make sure the
+  ;; compiler won't reorder these primitives.
+  ;;
+  ;; FIXME: Might it be a good idea to tweak the DEFKNOWNs for
+  ;; %WEAK-POINTER-VALUE and %WEAK-POINTER-BROKEN, so that the
+  ;; compiler will never try to reorder them even in code where we
+  ;; neglect to frame them in a LET?
   (let ((value (sb!c::%weak-pointer-value weak-pointer))
-       (broken (sb!c::%weak-pointer-broken weak-pointer)))
+        (broken (sb!c::%weak-pointer-broken weak-pointer)))
     (values value (not broken))))