~ chicken-core (chicken-5) 3a524bdd948e8643652d85ae840f1609bd2d2a68


commit 3a524bdd948e8643652d85ae840f1609bd2d2a68
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Sat Apr 23 20:43:11 2016 +0200
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Sat Apr 23 20:43:11 2016 +0200

    Fix fixnum literal decoding on ARM64 (#1280)
    
    In literal_decode, we relied on sign extension of characters when
    putting them into a C_word.
    
    On ARM64, characters are unsigned by default, which causes fixnum
    literals (but only if embedded in other objects) to be decoded
    incorrectly.
    
    The fix is simple: explicitly cast the first value to a signed character.
    
    Many thanks to Alexander Shendi for reporting the bug and helping to
    come up with and testing this fix.
    
    Signed-off-by: Evan Hanson <evhan@foldling.org>

diff --git a/manual/Acknowledgements b/manual/Acknowledgements
index 87ad40f0..2039fab7 100644
--- a/manual/Acknowledgements
+++ b/manual/Acknowledgements
@@ -42,18 +42,18 @@ Raikov, Santosh Rajan, Joel Reymont, "rivo", Chris Roberts, Eric
 Rochester, Paul Romanchenko, Andreas Rottman, David Rush, Lars
 Rustemeier, Daniel Sadilek, Otavio Salvador, Burton Samograd, "Sandro",
 "satori", Aleksej Saushev, Oskar Schirmer, Reed Sheridan, Ronald
-Schröder, Spencer Schumann, Ivan Shcheklein, Alex Shinn, Ivan Shmakov,
-"Shmul", Tony Sidaway, Jeffrey B. Siegal, Andrey Sidorenko, Michele
-Simionato, Iruata Souza, Volker Stolz, Jon Strait, Dorai Sitaram, Robert
-Skeels, Jason Songhurst, Clifford Stein, David Steiner, Sunnan, Zbigniew
-Szadkowski, Rick Taube, Nathan Thern, Mike Thomas, Minh Thu, Christian
-Tismer, Andre van Tonder, John Tobey, Henrik Tramberend, Vladimir
-Tsichevsky, James Ursetto, Neil van Dyke, Sam Varner, Taylor Venable,
-Sander Vesik, Jaques Vidrine, Panagiotis Vossos, Shawn Wagner, Peter
-Wang, Ed Watkeys, Brad Watson, Thomas Weidner, Göran Weinholt, Matthew
-Welland, Drake Wilson, Jörg Wittenberger, Peter Wright, Mark Wutka, Adam
-Young, Richard Zidlicky, Houman Zolfaghari and Florian Zumbiehl for
-bug-fixes, tips and suggestions.
+Schröder, Spencer Schumann, Ivan Shcheklein, Alexander Shendi, Alex
+Shinn, Ivan Shmakov, "Shmul", Tony Sidaway, Jeffrey B. Siegal, Andrey
+Sidorenko, Michele Simionato, Iruata Souza, Volker Stolz, Jon Strait,
+Dorai Sitaram, Robert Skeels, Jason Songhurst, Clifford Stein, David
+Steiner, Sunnan, Zbigniew Szadkowski, Rick Taube, Nathan Thern, Mike
+Thomas, Minh Thu, Christian Tismer, Andre van Tonder, John Tobey, Henrik
+Tramberend, Vladimir Tsichevsky, James Ursetto, Neil van Dyke, Sam
+Varner, Taylor Venable, Sander Vesik, Jaques Vidrine, Panagiotis Vossos,
+Shawn Wagner, Peter Wang, Ed Watkeys, Brad Watson, Thomas Weidner, Göran
+Weinholt, Matthew Welland, Drake Wilson, Jörg Wittenberger, Peter
+Wright, Mark Wutka, Adam Young, Richard Zidlicky, Houman Zolfaghari and
+Florian Zumbiehl for bug-fixes, tips and suggestions.
 
 Special thanks to Brandon van Every for contributing the (now defunct)
 [[http://www.cmake.org|CMake]] support and for helping with Windows
diff --git a/runtime.c b/runtime.c
index fe22310e..3c0ce3d7 100644
--- a/runtime.c
+++ b/runtime.c
@@ -12853,7 +12853,7 @@ static C_regparm C_word C_fcall decode_literal2(C_word **ptr, C_char **str,
       return (C_word)(*(*str - 1));
 
     case C_FIXNUM_BIT:
-      val = (C_uword)*((*str)++) << 24; /* always big endian */
+      val = (C_uword)(signed char)*((*str)++) << 24; /* always big endian */
       val |= ((C_uword)*((*str)++) & 0xff) << 16;
       val |= ((C_uword)*((*str)++) & 0xff) << 8;
       val |= ((C_uword)*((*str)++) & 0xff);
Trap