1.0.6.30: clean up FD-SOUT a little bit
[sbcl.git] / src / code / array.lisp
index 45c15a5..50f730a 100644 (file)
         (values vector index))
       (values array index)))
 
+(declaim (inline simple-vector-compare-and-swap))
+(defun simple-vector-compare-and-swap (vector index old new)
+  #!+(or x86 x86-64)
+  (%simple-vector-compare-and-swap vector
+                                   (%check-bound vector (length vector) index)
+                                   old
+                                   new)
+  #!-(or x86 x86-64)
+  (let ((n-old (svref vector index)))
+    (when (eq old n-old)
+      (setf (svref vector index) new))
+    n-old))
+
 ;;; It'd waste space to expand copies of error handling in every
 ;;; inline %WITH-ARRAY-DATA, so we have them call this function
 ;;; instead. This is just a wrapper which is known never to return.
@@ -337,11 +350,7 @@ of specialized arrays is supported."
                             (:little-endian
                              (- sb!vm:other-pointer-lowtag))
                             (:big-endian
-                             ;; I'm not completely sure of what this
-                             ;; 3 represents symbolically. It's
-                             ;; just what all the LOAD-TYPE vops
-                             ;; are doing.
-                             (- 3 sb!vm:other-pointer-lowtag)))))
+                             (- (1- sb!vm:n-word-bytes) sb!vm:other-pointer-lowtag)))))
                    ;; WIDETAG-OF needs extra code to handle
                    ;; LIST and FUNCTION lowtags. We're only
                    ;; dispatching on other pointers, so let's