(defun-with-dx dx-value-cell (x)
;; Not implemented everywhere, yet.
- #+(or x86 x86-64)
+ #+(or x86 x86-64 mips)
(let ((cell x))
(declare (dynamic-extent cell))
(flet ((f ()
(declare (dynamic-extent #'f))
(true #'f))))
+;;; CONS
+
+(defun-with-dx cons-on-stack (x)
+ (let ((cons (cons x x)))
+ (declare (dynamic-extent cons))
+ (true cons)
+ nil))
+
+;;; Nested DX
+
+(defun-with-dx nested-dx-lists ()
+ (let ((dx (list (list 1 2) (list 3 4))))
+ (declare (dynamic-extent dx))
+ (true dx)
+ nil))
+
+(defun-with-dx nested-dx-conses ()
+ (let ((dx (cons 1 (cons 2 (cons 3 (cons (cons t t) nil))))))
+ (declare (dynamic-extent dx))
+ (true dx)
+ nil))
+
+;;; multiple uses for dx lvar
+
+(defun-with-dx multiple-dx-uses ()
+ (let ((dx (if (true t)
+ (list 1 2 3)
+ (list 2 3 4))))
+ (declare (dynamic-extent dx))
+ (true dx)
+ nil))
+
;;; with-spinlock should use DX and not cons
(defvar *slock* (sb-thread::make-spinlock :name "slocklock"))
(sb-thread::with-spinlock (*slock*)
(true *slock*)))
+;;; not really DX, but GETHASH and (SETF GETHASH) should not cons
+
+(defvar *table* (make-hash-table))
+
+(defun test-hash-table ()
+ (setf (gethash 5 *table*) 13)
+ (gethash 5 *table*))
\f
(defmacro assert-no-consing (form &optional times)
`(%assert-no-consing (lambda () ,form) ,times))
(assert-no-consing (test-let-var-subst2 17))
(assert-no-consing (test-lvar-subst 11))
(assert-no-consing (dx-value-cell 13))
+ (assert-no-consing (cons-on-stack 42))
+ (assert-no-consing (nested-dx-conses))
+ (assert-no-consing (nested-dx-lists))
+ (assert-no-consing (multiple-dx-uses))
+ ;; Not strictly DX..
+ (assert-no-consing (test-hash-table))
#+sb-thread
(assert-no-consing (test-spinlock)))