1.0.21.26: bullet-proof (?) use of LOAD-SHARED-OBJECT in tests
[sbcl.git] / tests / foreign.test.sh
index 034deef..992ae86 100644 (file)
@@ -36,6 +36,9 @@ build_so() (
   esac
   if [ "`uname`" = Darwin ]; then
     SO_FLAGS="-bundle"
+    if run_sbcl --eval '(sb-ext:quit :unix-status #+x86-64 0 #-x86-64 1)'; then
+       CFLAGS="$CFLAGS -arch x86_64"
+    fi
   else
     SO_FLAGS="-shared"
   fi
@@ -124,8 +127,8 @@ cat > $TEST_FILESTEM.base.lisp <<EOF
   (eval-when (:compile-toplevel :load-toplevel :execute)
     (handler-case
         (progn
-          (load-shared-object "$TEST_FILESTEM.so")
-          (load-shared-object "$TEST_FILESTEM-b.so"))
+          (load-shared-object (truename "$TEST_FILESTEM.so"))
+          (load-shared-object (truename "$TEST_FILESTEM-b.so")))
       (sb-int:unsupported-operator ()
         ;; At least as of sbcl-0.7.0.5, LOAD-SHARED-OBJECT isn't
         ;; supported on every OS. In that case, there's nothing to test,
@@ -221,7 +224,7 @@ cat > $TEST_FILESTEM.test.lisp <<EOF
   (note "/original definitions ok")
   (rename-file "$TEST_FILESTEM-b.so" "$TEST_FILESTEM-b.bak")
   (rename-file "$TEST_FILESTEM-b2.so" "$TEST_FILESTEM-b.so")
-  (load-shared-object "$TEST_FILESTEM-b.so")
+  (load-shared-object (truename "$TEST_FILESTEM-b.so"))
   (note "/reloading ok")
   (assert (= 42 foo))
   (assert (= 13 (bar)))
@@ -242,7 +245,7 @@ cat > $TEST_FILESTEM.test.lisp <<EOF
     (multiple-value-bind (val err) (ignore-errors (late-bar))
       (assert (not val))
       (assert (typep err 'undefined-alien-error)))
-    (load-shared-object "$TEST_FILESTEM-c.so")
+    (load-shared-object (truename "$TEST_FILESTEM-c.so"))
     (assert (= 43 late-foo))
     (assert (= 14 (late-bar)))
     (note "/linkage table ok"))
@@ -311,5 +314,28 @@ run_sbcl_with_core $TEST_FILESTEM.fast.core --no-sysinit --no-userinit <<EOF
 EOF
 check_status_maybe_lose "missing-so" $?
 
+# ADDR of a heap-allocated object
+cat > $TEST_FILESTEM.addr.heap.c <<EOF
+  struct foo
+  {
+    int x, y;
+  } a, *b;
+EOF
+
+build_so $TEST_FILESTEM.addr.heap
+
+run_sbcl <<EOF
+  (load-shared-object (truename "$TEST_FILESTEM.addr.heap.so"))
+  (define-alien-type foo (struct foo (x int) (y int)))
+
+  (define-alien-variable a foo)
+  (define-alien-variable b (* foo))
+  (funcall (compile nil '(lambda () (setq b (addr a)))))
+  (assert (sb-sys:sap= (alien-sap a) (alien-sap (deref b))))
+  (quit :unix-status $EXIT_LISP_WIN)
+EOF
+check_status_maybe_lose "ADDR of a heap-allocated object" $?
+
+
 # success convention for script
 exit $EXIT_TEST_WIN