~ chicken-core (chicken-5) bb36b1d1516b485d7ae522e39fdf9b56e7a70d4f


commit bb36b1d1516b485d7ae522e39fdf9b56e7a70d4f
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Jan 13 18:47:48 2012 +0100
Commit:     Peter Bex <peter.bex@xs4all.nl>
CommitDate: Tue Feb 21 19:52:58 2012 +0100

    Ensure character is extended to full word-length. This doesn't make much of a difference semantically, but avoids a warning with valgrind(1) on 64-bit platforms: gcc stores a character argument using a 32-bit "mov" instruction into the stackframe, keeping the upper half uninitialized.
    
    The argument value of "C_make_character" is cast to "C_uword", which
    was once suggested by Joerg Wittenberger and Alan Post to ensure that
    the default sign of characters (which may be different, depending on
    the compiler and platform) does not influence any character
    operations.
    
    Signed-off-by: Peter Bex <peter.bex@xs4all.nl>

diff --git a/chicken.h b/chicken.h
index fdf4b72c..58d75332 100644
--- a/chicken.h
+++ b/chicken.h
@@ -955,7 +955,7 @@ extern double trunc(double);
 #define C_demand_2(n)              (((C_word *)C_fromspace_top + (n)) < (C_word *)C_fromspace_limit)
 #define C_fix(n)                   (((C_word)(n) << C_FIXNUM_SHIFT) | C_FIXNUM_BIT)
 #define C_unfix(x)                 ((x) >> C_FIXNUM_SHIFT)
-#define C_make_character(c)        ((((c) & C_CHAR_BIT_MASK) << C_CHAR_SHIFT) | C_CHARACTER_BITS)
+#define C_make_character(c)        (((((C_uword)(c)) & C_CHAR_BIT_MASK) << C_CHAR_SHIFT) | C_CHARACTER_BITS)
 #define C_character_code(x)        (((C_word)(x) >> C_CHAR_SHIFT) & C_CHAR_BIT_MASK)
 #define C_flonum_magnitude(x)      (*((double *)(((C_SCHEME_BLOCK *)(x))->data)))
 #define C_c_string(x)              ((C_char *)(((C_SCHEME_BLOCK *)(x))->data))
Trap