[Git][cmucl/cmucl][issue-242-c-call-char-result-wrong] Remove arg from test function and set the value directly.

Raymond Toy (@rtoy) gitlab at common-lisp.net
Sat Jul 1 04:36:17 UTC 2023



Raymond Toy pushed to branch issue-242-c-call-char-result-wrong at cmucl / cmucl


Commits:
1f87ddfc by Raymond Toy at 2023-06-30T21:33:50-07:00
Remove arg from test function and set the value directly.

As suggested by @cshapiro, define a global var that we can set and
which is used by the functions to compute the return value.  This
reduces any possible issues with round-tripping a value through the
FFI.

Update the tests appropriately to define the alien variable and set it
before calling the test function.

- - - - -


2 changed files:

- tests/issues.lisp
- tests/test-return.c


Changes:

=====================================
tests/issues.lisp
=====================================
@@ -991,13 +991,15 @@
   ;; load-foreign apparently returns NIL if it succeeds.
   (assert-true (eql nil (ext:load-foreign (merge-pathnames "test-return.o" *test-path*)))))
 
+(alien:def-alien-variable "test_arg" c-call:int)
+
 (define-test issue.242.test-alien-return-signed-char
   (:tag :issues)
   (flet ((fun (n)
+	   (setf test-arg n)
 	   (alien:alien-funcall
 	    (alien:extern-alien "int_to_signed_char"
-				(function c-call:char c-call:int))
-	    n))
+				(function c-call:char))))
 	 (sign-extend (n)
 	   (let ((n (ldb (byte 8 0) n)))
 	     (if (> n #x7f)
@@ -1009,10 +1011,10 @@
 (define-test issue.242.test-alien-return-signed-short
   (:tag :issues)
   (flet ((fun (n)
+	   (setf test-arg n)
 	   (alien:alien-funcall
 	    (alien:extern-alien "int_to_short"
-				(function c-call:short c-call:int))
-	    n))
+				(function c-call:short))))
 	 (sign-extend (n)
 	   (let ((n (ldb (byte 16 0) n)))
 	     (if (> n #x7fff)
@@ -1024,20 +1026,20 @@
 (define-test issue.242.test-alien-return-signed-int
   (:tag :issues)
   (flet ((fun (n)
+	   (setf test-arg n)
 	   (alien:alien-funcall
 	    (alien:extern-alien "int_to_int"
-				(function c-call:int c-call:int))
-	    n)))
+				(function c-call:int)))))
     (dolist (x '(1023 -1023 #x7fffffff #x-80000000))
       (assert-equal x (fun x) x))))
 
 (define-test issue.242.test-alien-return-unsigned-char
   (:tag :issues)
   (flet ((fun (n)
+	   (setf test-arg n)
 	   (alien:alien-funcall
 	    (alien:extern-alien "int_to_unsigned_char"
-				(function c-call:unsigned-char c-call:int))
-	    n))
+				(function c-call:unsigned-char))))
 	 (expected (n)
 	   (ldb (byte 8 0) n)))
     (dolist (x '(99 -99 1023 -1023))
@@ -1046,10 +1048,10 @@
 (define-test issue.242.test-alien-return-unsigned-short
   (:tag :issues)
   (flet ((fun (n)
+	   (setf test-arg n)
 	   (alien:alien-funcall
 	    (alien:extern-alien "int_to_unsigned_short"
-				(function c-call:unsigned-short c-call:int))
-	    n))
+				(function c-call:unsigned-short))))
 	 (expected (n)
 	   (ldb (byte 16 0) n)))
     (dolist (x '(1023 -1023 100000 -100000))
@@ -1058,10 +1060,10 @@
 (define-test issue.242.test-alien-return-unsigned-int
   (:tag :issues)
   (flet ((fun (n)
+	   (setf test-arg n)
 	   (alien:alien-funcall
 	    (alien:extern-alien "int_to_unsigned_int"
-				(function c-call:unsigned-int c-call:int))
-	    n))
+				(function c-call:unsigned-int))))
 	 (expected (n)
 	   (ldb (byte 32 0) n)))
     (dolist (x '(1023 -1023 #x7fffffff #x-80000000))
@@ -1070,10 +1072,10 @@
 (define-test issue.242.test-alien-return-bool
   (:tag :issues)
   (flet ((fun (n)
+	   (setf test-arg n)
 	   (alien:alien-funcall
 	    (alien:extern-alien "unsigned_to_bool"
-				(function c-call:char c-call:unsigned-int))
-	    n))
+				(function c-call:char))))
 	 (expected (n)
 	   (if (zerop n)
 	       0
@@ -1084,10 +1086,10 @@
 (define-test issue.242.test-alien-return-bool.2
   (:tag :issues)
   (flet ((fun (n)
+	   (setf test-arg n)
 	   (alien:alien-funcall
 	    (alien:extern-alien "unsigned_to_bool"
-				(function alien:boolean c-call:unsigned-int))
-	    n))
+				(function alien:boolean))))
 	 (expected (n)
 	   (not (zerop n))))
     (dolist (x '(0 1 1000))


=====================================
tests/test-return.c
=====================================
@@ -1,43 +1,45 @@
 #include <stdbool.h>
 
+int test_arg;
+
 signed char
-int_to_signed_char(int x)
+int_to_signed_char()
 {
-  return (signed char) x;
+  return (signed char) test_arg;
 }
 
 short
-int_to_short(int x)
+int_to_short()
 {
-  return (short) x;
+  return (short) test_arg;
 }
 
 int
-int_to_int(int x)
+int_to_int()
 {
-  return (int) x;
+  return (int) test_arg;
 }
 
 unsigned char
-int_to_unsigned_char(int x)
+int_to_unsigned_char()
 {
-  return (unsigned char) x;
+  return (unsigned char) test_arg;
 }
 
 unsigned short
-int_to_unsigned_short(int x)
+int_to_unsigned_short()
 {
-  return (unsigned short) x;
+  return (unsigned short) test_arg;
 }
 
 unsigned int
-int_to_unsigned_int(int x)
+int_to_unsigned_int()
 {
-  return (unsigned int) x;
+  return (unsigned int) test_arg;
 }
 
-_Bool unsigned_to_bool(unsigned u)
+_Bool unsigned_to_bool()
 {
-  return (_Bool) u;
+  return (_Bool) test_arg;
 }
 



View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/1f87ddfc5760085d3426604aa6a400e372da3a70

-- 
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/1f87ddfc5760085d3426604aa6a400e372da3a70
You're receiving this email because of your account on gitlab.common-lisp.net.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cmucl-cvs/attachments/20230701/509cd8df/attachment-0001.html>


More information about the cmucl-cvs mailing list