5 (macrolet ((test (init op
)
9 (assert (eql nil
(compare-and-swap (,op x
) nil y
)))
10 (assert (eql y
(compare-and-swap (,op x
) nil z
)))
11 (assert (eql y
(,op x
)))
13 (multiple-value-bind (res err
)
14 (ignore-errors (compare-and-swap (,op x
) nil nil
))
16 (assert (typep err
'type-error
)))))))
17 (test (cons nil
:no
) car
)
18 (test (cons nil
:no
) first
)
19 (test (cons :no nil
) cdr
)
20 (test (cons :no nil
) rest
)
21 (test '.foo. symbol-plist
)
22 (test (progn (set '.bar. nil
) '.bar.
) symbol-value
)
23 (test (make-xxx) xxx-yyy
))
27 ;;; thread-local bindings
31 (assert (eql nil
(compare-and-swap (symbol-value '*foo
*) nil t
)))
32 (assert (eql t
(compare-and-swap (symbol-value '*foo
*) nil
:foo
)))
33 (assert (eql t
*foo
*)))
34 (assert (eql 42 *foo
*)))
36 ;;; unbound symbols + symbol-value
38 (assert (not (boundp '*foo
*)))
40 (multiple-value-bind (res err
)
41 (ignore-errors (compare-and-swap (symbol-value '*foo
*) nil t
))
43 (assert (typep err
'unbound-variable
)))
49 (multiple-value-bind (res err
)
50 (ignore-errors (compare-and-swap (symbol-value '*bar
*) nil t
))
52 (assert (typep err
'unbound-variable
))))
56 (defvar *v
* (vector 1))
59 (assert (eql 1 (compare-and-swap (svref *v
* 0) 1 2)))
60 (assert (eql 2 (compare-and-swap (svref *v
* 0) 1 3)))
61 (assert (eql 2 (svref *v
* 0)))
64 (multiple-value-bind (res err
)
65 (ignore-errors (compare-and-swap (svref *v
* -
1) 1 2))
67 (assert (typep err
'type-error
)))
68 (multiple-value-bind (res err
)
69 (ignore-errors (compare-and-swap (svref *v
* 1) 1 2))
71 (assert (typep err
'type-error
)))
73 ;; type of the first argument
74 (multiple-value-bind (res err
)
75 (ignore-errors (compare-and-swap (svref "foo" 1) 1 2))
77 (assert (typep err
'type-error
)))