~ chicken-core (chicken-5) b1aa804894bf53a78ed93a12d76276b2552f7d2b
commit b1aa804894bf53a78ed93a12d76276b2552f7d2b
Author: Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Tue Nov 26 21:44:53 2013 +0100
Commit: Christian Kellermann <ckeen@pestilenz.org>
CommitDate: Fri Dec 6 10:02:11 2013 +0100
Explicitly use signed chars for s8vector operations.
This fixes the srfi-4 errors on PowerPC and ARM which were uncovered
by tests which were recently added to compiler-tests.scm
Signed-off-by: Christian Kellermann <ckeen@pestilenz.org>
diff --git a/NEWS b/NEWS
index 2f1e06d1..9c66c110 100644
--- a/NEWS
+++ b/NEWS
@@ -13,7 +13,8 @@
use modules and forgot to require ports but use procedures from it.
- Support has been added for the space-safe R7RS macro "delay-force".
- Export file-type from the posix unit (thanks to Alan Post).
- - unsetenv has been fixed on Windows
+ - unsetenv has been fixed on Windows.
+ - SRFI-4 s8vectors now work correctly in compiled code on PowerPC and ARM.
- Platform support
- CHICKEN can now be built on AIX (contributed by Erik Falor)
diff --git a/c-backend.scm b/c-backend.scm
index 17257e5e..1b5d0fc7 100644
--- a/c-backend.scm
+++ b/c-backend.scm
@@ -1172,7 +1172,7 @@
[(c-string-list c-string-list*) "C_char **"]
[(blob nonnull-blob u8vector nonnull-u8vector) (str "unsigned char *")]
[(u16vector nonnull-u16vector) (str "unsigned short *")]
- [(s8vector nonnull-s8vector) (str "char *")]
+ [(s8vector nonnull-s8vector) (str "signed char *")]
[(u32vector nonnull-u32vector) (str "unsigned int *")]
[(s16vector nonnull-s16vector) (str "short *")]
[(s32vector nonnull-s32vector) (str "int *")]
diff --git a/chicken.h b/chicken.h
index bee2e37f..c25f6b8f 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1099,8 +1099,8 @@ extern double trunc(double);
#define C_srfi_4_vector(x) C_data_pointer(C_block_item(x,1))
#define C_c_u8vector(x) ((unsigned char *)C_srfi_4_vector(x))
#define C_c_u8vector_or_null(x) ((unsigned char *)C_srfi_4_vector_or_null(x))
-#define C_c_s8vector(x) ((char *)C_srfi_4_vector(x))
-#define C_c_s8vector_or_null(x) ((char *)C_srfi_4_vector_or_null(x))
+#define C_c_s8vector(x) ((signed char *)C_srfi_4_vector(x))
+#define C_c_s8vector_or_null(x) ((signed char *)C_srfi_4_vector_or_null(x))
#define C_c_u16vector(x) ((unsigned short *)C_srfi_4_vector(x))
#define C_c_u16vector_or_null(x) ((unsigned short *)C_srfi_4_vector_or_null(x))
#define C_c_s16vector(x) ((short *)C_srfi_4_vector(x))
@@ -1537,7 +1537,7 @@ extern double trunc(double);
#define C_ub_i_null_pointerp(p) ((p) == NULL)
#define C_ub_i_pointer_u8_ref(p) (*((unsigned char *)(p)))
-#define C_ub_i_pointer_s8_ref(p) (*((char *)(p)))
+#define C_ub_i_pointer_s8_ref(p) (*((signed char *)(p)))
#define C_ub_i_pointer_u16_ref(p) (*((unsigned short *)(p)))
#define C_ub_i_pointer_s16_ref(p) (*((short *)(p)))
#define C_ub_i_pointer_u32_ref(p) (*((C_u32 *)(p)))
@@ -1545,7 +1545,7 @@ extern double trunc(double);
#define C_ub_i_pointer_f32_ref(p) (*((float *)(p)))
#define C_ub_i_pointer_f64_ref(p) (*((double *)(p)))
#define C_ub_i_pointer_u8_set(p, n) (*((unsigned char *)(p)) = (n))
-#define C_ub_i_pointer_s8_set(p, n) (*((char *)(p)) = (n))
+#define C_ub_i_pointer_s8_set(p, n) (*((signed char *)(p)) = (n))
#define C_ub_i_pointer_u16_set(p, n) (*((unsigned short *)(p)) = (n))
#define C_ub_i_pointer_s16_set(p, n) (*((short *)(p)) = (n))
#define C_ub_i_pointer_u32_set(p, n) (*((C_u32 *)(p)) = (n))
Trap