X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Falien.impure.lisp;h=50297747d3028c094a5e93a2a0f41f31bb02f23f;hb=273757631306c5d5c36f3aa7fed496a6d5c5f35e;hp=c85ee8ef571728d9e78f22a2757cb43054537a10;hpb=e602d69296d74060610880680e9381b12a8dd4d3;p=sbcl.git diff --git a/tests/alien.impure.lisp b/tests/alien.impure.lisp index c85ee8e..5029774 100644 --- a/tests/alien.impure.lisp +++ b/tests/alien.impure.lisp @@ -203,8 +203,46 @@ (error () :ok))))) -;; This used to signal an error on x86 due to primitive type T not having -;; been compatible with ANY-REG. (On x86 and -64 ANY-REG is fine.) -(sb-alien:with-alien ((buf (array (sb-alien:signed 8) 16)))) +;;; 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