X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Falien.impure.lisp;h=6c6b002db65527a7ec5e0fc570a62062edb37187;hb=aa8c8cd473f1d487fa2c1a7490c78a59b9955bbe;hp=c800e80a9461b7f097986bf513198ec4e6b0b2ad;hpb=380ea897e2c12a01547f918f73e8a1db0a3a0373;p=sbcl.git diff --git a/tests/alien.impure.lisp b/tests/alien.impure.lisp index c800e80..6c6b002 100644 --- a/tests/alien.impure.lisp +++ b/tests/alien.impure.lisp @@ -10,7 +10,7 @@ ;;;; While most of SBCL is derived from the CMU CL system, the test ;;;; files (like this one) were written from scratch after the fork ;;;; from CMU CL. -;;;; +;;;; ;;;; This software is in the public domain and is provided with ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. @@ -49,10 +49,10 @@ ;;; This used to break due to too eager auxiliary type twiddling in ;;; parse-alien-record-type. (defparameter *maybe* nil) -(defun with-alien-test-for-struct-plus-funcall () +(defun with-alien-test-for-struct-plus-funcall () (with-alien ((x (struct bar (x unsigned) (y unsigned))) - ;; bogus definition, but we just need the symbol - (f (function int (* (struct bar))) :extern "printf")) + ;; bogus definition, but we just need the symbol + (f (function int (* (struct bar))) :extern "printf")) (when *maybe* (alien-funcall f (addr x))))) @@ -62,16 +62,16 @@ (let ((s1 (make-alien struct.1)) (s2 (make-alien struct.2))) (setf (slot s1 'x) s2 - (slot s2 'x) s1 - (slot (slot s1 'x) 'y) 1 - (slot (slot s2 'x) 'y) 2) + (slot s2 'x) s1 + (slot (slot s1 'x) 'y) 1 + (slot (slot s2 'x) 'y) 2) (assert (= 1 (slot (slot s1 'x) 'y))) (assert (= 2 (slot (slot s2 'x) 'y)))) ;;; "Alien bug" on sbcl-devel 2004-10-11 by Thomas F. Burdick caused ;;; by recursive struct definition. (let ((fname "alien-bug-2004-10-11.tmp.lisp")) - (unwind-protect + (unwind-protect (progn (with-open-file (f fname :direction :output) (mapc (lambda (form) (print form f)) @@ -80,7 +80,7 @@ (in-package :alien-bug) (define-alien-type objc-class (struct objc-class - (protocols + (protocols (* (struct protocol-list (list (array (* (struct objc-class)))))))))))) (load fname) @@ -115,6 +115,17 @@ (deref integer-array 1))) (assert (eql (deref enum-array 2) 'k-two)))) +;; enums used to allow values to be used only once +;; C enums allow for multiple tags to point to the same value +(define-alien-type enum.4 + (enum nil (:key1 1) (:key2 2) (:keytwo 2))) +(with-alien ((enum-array (array enum.4 3))) + (setf (deref enum-array 0) :key1) + (setf (deref enum-array 1) :key2) + (setf (deref enum-array 2) :keytwo) + (assert (and (eql (deref enum-array 1) (deref enum-array 2)) + (eql (deref enum-array 1) :key2)))) + ;;; As reported by Baughn on #lisp, ALIEN-FUNCALL loops forever when ;;; compiled with (DEBUG 3). (sb-kernel::values-specifier-type-cache-clear) @@ -125,5 +136,31 @@ v))))) (assert (typep (funcall f "HOME") '(or string null)))) + +;;; CLH: Test for non-standard alignment in alien structs +;;; +(sb-alien:define-alien-type align-test-struct + (sb-alien:union align-test-union + (s (sb-alien:struct nil + (s1 sb-alien:unsigned-char) + (c1 sb-alien:unsigned-char :alignment 16) + (c2 sb-alien:unsigned-char :alignment 32) + (c3 sb-alien:unsigned-char :alignment 32) + (c4 sb-alien:unsigned-char :alignment 8))) + (u (sb-alien:array sb-alien:unsigned-char 16)))) + +(let ((a1 (sb-alien:make-alien align-test-struct))) + (declare (type (sb-alien:alien (* align-test-struct)) a1)) + (setf (sb-alien:slot (sb-alien:slot a1 's) 's1) 1) + (setf (sb-alien:slot (sb-alien:slot a1 's) 'c1) 21) + (setf (sb-alien:slot (sb-alien:slot a1 's) 'c2) 41) + (setf (sb-alien:slot (sb-alien:slot a1 's) 'c3) 61) + (setf (sb-alien:slot (sb-alien:slot a1 's) 'c4) 81) + (assert (equal '(1 21 41 61 81) + (list (sb-alien:deref (sb-alien:slot a1 'u) 0) + (sb-alien:deref (sb-alien:slot a1 'u) 2) + (sb-alien:deref (sb-alien:slot a1 'u) 4) + (sb-alien:deref (sb-alien:slot a1 'u) 8) + (sb-alien:deref (sb-alien:slot a1 'u) 9))))) + ;;; success -(quit :unix-status 104)