diff options
author | Richard M. Stallman <rms@gnu.org> | 1998-04-29 00:59:22 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1998-04-29 00:59:22 +0000 |
commit | 81d7062685d40fa1e58a291db552b7866e088d33 (patch) | |
tree | 04a2e22fa1f220a75dd260a7c940a2c822a09269 /src/data.c | |
parent | 3036594f2ac4967e7c89efaec9fcba574eefdf30 (diff) | |
download | emacs-81d7062685d40fa1e58a291db552b7866e088d33.tar.gz |
(Flsh, Fash): Handle out-of-range shift counts reasonably.
Diffstat (limited to 'src/data.c')
-rw-r--r-- | src/data.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/data.c b/src/data.c index 18354046210..eb1cbf77bbc 100644 --- a/src/data.c +++ b/src/data.c @@ -2481,8 +2481,12 @@ In this case, the sign bit is duplicated.") CHECK_NUMBER (value, 0); CHECK_NUMBER (count, 1); - if (XINT (count) > 0) + if (XINT (count) >= BITS_PER_EMACS_INT) + XSETINT (val, 0); + else if (XINT (count) > 0) XSETINT (val, XINT (value) << XFASTINT (count)); + else if (XINT (count) <= -BITS_PER_EMACS_INT) + XSETINT (val, XINT (value) < 0 ? -1 : 0); else XSETINT (val, XINT (value) >> -XINT (count)); return val; @@ -2500,8 +2504,12 @@ In this case, zeros are shifted in on the left.") CHECK_NUMBER (value, 0); CHECK_NUMBER (count, 1); - if (XINT (count) > 0) + if (XINT (count) >= BITS_PER_EMACS_INT) + XSETINT (val, 0); + else if (XINT (count) > 0) XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count)); + else if (XINT (count) <= -BITS_PER_EMACS_INT) + XSETINT (val, 0); else XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count)); return val; |