1.0.21.29: handle alien record type redefinitions (bug 431)
[sbcl.git] / tests / alien.impure.lisp
index 288b7da..5029774 100644 (file)
 #+win32
 (progn
   (load-shared-object "USER32")
-  (assert 
+  (assert
    (eq :ok
        (handler-case
            (tagbody
                0 0 0 0)
             up
               (funcall 0))
-         (error () 
+         (error ()
            :ok)))))
 
+;;; Unused local alien caused a compiler error
+(with-test (:name unused-local-alien)
+  (let ((fun `(lambda ()
+                (sb-alien:with-alien ((alien1923 (array (sb-alien:unsigned 8) 72)))
+                  (values)))))
+    (assert (not (funcall (compile nil fun))))))
+
+;;; Non-local exit from WITH-ALIEN caused alien stack to be leaked.
+(defvar *sap-int*)
+(defun try-to-leak-alien-stack (x)
+  (with-alien ((alien (array (sb-alien:unsigned 8) 72)))
+    (let ((sap-int (sb-sys:sap-int (alien-sap alien))))
+      (if *sap-int*
+          (assert (= *sap-int* sap-int))
+          (setf *sap-int* sap-int)))
+    (when x
+      (return-from try-to-leak-alien-stack 'going))
+    (never)))
+(with-test (:name :nlx-causes-alien-stack-leak)
+  (let ((*sap-int* nil))
+    (loop repeat 1024
+          do (try-to-leak-alien-stack t))))
+
+;;; bug 431
+(with-test (:name :alien-struct-redefinition)
+  (eval '(progn
+          (define-alien-type nil (struct mystruct (myshort short) (mychar char)))
+          (with-alien ((myst (struct mystruct)))
+            (with-alien ((mysh short (slot myst 'myshort)))
+              (assert (integerp mysh))))))
+  (let ((restarted 0))
+    (handler-bind ((error (lambda (e)
+                            (let ((cont (find-restart 'continue e)))
+                              (when cont
+                                (incf restarted)
+                                (invoke-restart cont))))))
+      (eval '(define-alien-type nil (struct mystruct (myint int) (mychar char)))))
+    (assert (= 1 restarted)))
+  (eval '(with-alien ((myst (struct mystruct)))
+          (with-alien ((myin int (slot myst 'myint)))
+            (assert (integerp myin))))))
+
 ;;; success