1.0.10.6: nested DX allocation
[sbcl.git] / tests / dynamic-extent.impure.lisp
index ead5757..4ec3d4d 100644 (file)
 
 (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))
+
 ;;; 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))
+  ;; Not strictly DX..
+  (assert-no-consing (test-hash-table))
   #+sb-thread
   (assert-no-consing (test-spinlock)))