diff options
| author | Richard M. Stallman | 1998-04-29 00:59:22 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1998-04-29 00:59:22 +0000 |
| commit | 81d7062685d40fa1e58a291db552b7866e088d33 (patch) | |
| tree | 04a2e22fa1f220a75dd260a7c940a2c822a09269 /src/data.c | |
| parent | 3036594f2ac4967e7c89efaec9fcba574eefdf30 (diff) | |
| download | emacs-81d7062685d40fa1e58a291db552b7866e088d33.tar.gz emacs-81d7062685d40fa1e58a291db552b7866e088d33.zip | |
(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.") | |||
| 2481 | CHECK_NUMBER (value, 0); | 2481 | CHECK_NUMBER (value, 0); |
| 2482 | CHECK_NUMBER (count, 1); | 2482 | CHECK_NUMBER (count, 1); |
| 2483 | 2483 | ||
| 2484 | if (XINT (count) > 0) | 2484 | if (XINT (count) >= BITS_PER_EMACS_INT) |
| 2485 | XSETINT (val, 0); | ||
| 2486 | else if (XINT (count) > 0) | ||
| 2485 | XSETINT (val, XINT (value) << XFASTINT (count)); | 2487 | XSETINT (val, XINT (value) << XFASTINT (count)); |
| 2488 | else if (XINT (count) <= -BITS_PER_EMACS_INT) | ||
| 2489 | XSETINT (val, XINT (value) < 0 ? -1 : 0); | ||
| 2486 | else | 2490 | else |
| 2487 | XSETINT (val, XINT (value) >> -XINT (count)); | 2491 | XSETINT (val, XINT (value) >> -XINT (count)); |
| 2488 | return val; | 2492 | return val; |
| @@ -2500,8 +2504,12 @@ In this case, zeros are shifted in on the left.") | |||
| 2500 | CHECK_NUMBER (value, 0); | 2504 | CHECK_NUMBER (value, 0); |
| 2501 | CHECK_NUMBER (count, 1); | 2505 | CHECK_NUMBER (count, 1); |
| 2502 | 2506 | ||
| 2503 | if (XINT (count) > 0) | 2507 | if (XINT (count) >= BITS_PER_EMACS_INT) |
| 2508 | XSETINT (val, 0); | ||
| 2509 | else if (XINT (count) > 0) | ||
| 2504 | XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count)); | 2510 | XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count)); |
| 2511 | else if (XINT (count) <= -BITS_PER_EMACS_INT) | ||
| 2512 | XSETINT (val, 0); | ||
| 2505 | else | 2513 | else |
| 2506 | XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count)); | 2514 | XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count)); |
| 2507 | return val; | 2515 | return val; |