diff options
| author | Paul Eggert | 2018-08-21 11:40:23 -0700 |
|---|---|---|
| committer | Paul Eggert | 2018-08-21 11:41:54 -0700 |
| commit | 81e7eef8224c8a99a207b7a7b9dae1d598392ef7 (patch) | |
| tree | 1404996c717b76961b02c6a238242d63afc23660 /src/bytecode.c | |
| parent | ad31afc35be2c64863a03b8f3995847332870cb6 (diff) | |
| download | emacs-81e7eef8224c8a99a207b7a7b9dae1d598392ef7.tar.gz emacs-81e7eef8224c8a99a207b7a7b9dae1d598392ef7.zip | |
Fix bignum bugs with nth, elt, =
* src/bytecode.c (exec_byte_code): Support bignums
when implementing nth, elt, and =.
* src/lisp.h (SMALL_LIST_LEN_MAX): New constant.
* src/fns.c (Fnthcdr): Use it.
(Felt): Do not reject bignum indexes.
Diffstat (limited to 'src/bytecode.c')
| -rw-r--r-- | src/bytecode.c | 39 |
1 files changed, 13 insertions, 26 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index b27fa7c5c68..17457fc5742 100644 --- a/src/bytecode.c +++ b/src/bytecode.c | |||
| @@ -832,13 +832,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 832 | CASE (Bnth): | 832 | CASE (Bnth): |
| 833 | { | 833 | { |
| 834 | Lisp_Object v2 = POP, v1 = TOP; | 834 | Lisp_Object v2 = POP, v1 = TOP; |
| 835 | CHECK_FIXNUM (v1); | 835 | if (RANGED_FIXNUMP (0, v1, SMALL_LIST_LEN_MAX)) |
| 836 | for (EMACS_INT n = XFIXNUM (v1); 0 < n && CONSP (v2); n--) | ||
| 837 | { | 836 | { |
| 838 | v2 = XCDR (v2); | 837 | for (EMACS_INT n = XFIXNUM (v1); 0 < n && CONSP (v2); n--) |
| 839 | rarely_quit (n); | 838 | v2 = XCDR (v2); |
| 839 | TOP = CAR (v2); | ||
| 840 | } | 840 | } |
| 841 | TOP = CAR (v2); | 841 | else |
| 842 | TOP = Fnth (v1, v2); | ||
| 842 | NEXT; | 843 | NEXT; |
| 843 | } | 844 | } |
| 844 | 845 | ||
| @@ -985,15 +986,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 985 | 986 | ||
| 986 | CASE (Beqlsign): | 987 | CASE (Beqlsign): |
| 987 | { | 988 | { |
| 988 | Lisp_Object v2 = POP, v1 = TOP; | 989 | Lisp_Object v1 = POP; |
| 989 | if (FLOATP (v1) || FLOATP (v2)) | 990 | TOP = arithcompare (TOP, v1, ARITH_EQUAL); |
| 990 | TOP = arithcompare (v1, v2, ARITH_EQUAL); | ||
| 991 | else | ||
| 992 | { | ||
| 993 | CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER (v1); | ||
| 994 | CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER (v2); | ||
| 995 | TOP = EQ (v1, v2) ? Qt : Qnil; | ||
| 996 | } | ||
| 997 | NEXT; | 991 | NEXT; |
| 998 | } | 992 | } |
| 999 | 993 | ||
| @@ -1264,23 +1258,16 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1264 | 1258 | ||
| 1265 | CASE (Belt): | 1259 | CASE (Belt): |
| 1266 | { | 1260 | { |
| 1267 | if (CONSP (TOP)) | 1261 | Lisp_Object v2 = POP, v1 = TOP; |
| 1262 | if (CONSP (v1) && RANGED_FIXNUMP (0, v2, SMALL_LIST_LEN_MAX)) | ||
| 1268 | { | 1263 | { |
| 1269 | /* Exchange args and then do nth. */ | 1264 | /* Like the fast case for Bnth, but with args reversed. */ |
| 1270 | Lisp_Object v2 = POP, v1 = TOP; | ||
| 1271 | CHECK_FIXNUM (v2); | ||
| 1272 | for (EMACS_INT n = XFIXNUM (v2); 0 < n && CONSP (v1); n--) | 1265 | for (EMACS_INT n = XFIXNUM (v2); 0 < n && CONSP (v1); n--) |
| 1273 | { | 1266 | v1 = XCDR (v1); |
| 1274 | v1 = XCDR (v1); | ||
| 1275 | rarely_quit (n); | ||
| 1276 | } | ||
| 1277 | TOP = CAR (v1); | 1267 | TOP = CAR (v1); |
| 1278 | } | 1268 | } |
| 1279 | else | 1269 | else |
| 1280 | { | 1270 | TOP = Felt (v1, v2); |
| 1281 | Lisp_Object v1 = POP; | ||
| 1282 | TOP = Felt (TOP, v1); | ||
| 1283 | } | ||
| 1284 | NEXT; | 1271 | NEXT; |
| 1285 | } | 1272 | } |
| 1286 | 1273 | ||