diff options
| author | Tom Tromey | 2018-08-11 13:34:17 -0600 |
|---|---|---|
| committer | Tom Tromey | 2018-08-11 13:34:17 -0600 |
| commit | 78ec68e18f07a90a9ad400683b973ff51baa80e1 (patch) | |
| tree | 638c986bf753e3ddab9992ba1ef0a10a3d4891f0 /src/bytecode.c | |
| parent | ba1c4f63e3d2adbe9b590a3c51c2a0808c84723f (diff) | |
| parent | 79f59d41a3d2ef3b4a9a87265bf517206a5837ad (diff) | |
| download | emacs-78ec68e18f07a90a9ad400683b973ff51baa80e1.tar.gz emacs-78ec68e18f07a90a9ad400683b973ff51baa80e1.zip | |
Merge branch 'feature/bignum'
Diffstat (limited to 'src/bytecode.c')
| -rw-r--r-- | src/bytecode.c | 76 |
1 files changed, 41 insertions, 35 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index 772cc982f9a..b27fa7c5c68 100644 --- a/src/bytecode.c +++ b/src/bytecode.c | |||
| @@ -63,14 +63,14 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 63 | { \ | 63 | { \ |
| 64 | if (byte_metering_on) \ | 64 | if (byte_metering_on) \ |
| 65 | { \ | 65 | { \ |
| 66 | if (XFASTINT (METER_1 (this_code)) < MOST_POSITIVE_FIXNUM) \ | 66 | if (XFIXNAT (METER_1 (this_code)) < MOST_POSITIVE_FIXNUM) \ |
| 67 | XSETFASTINT (METER_1 (this_code), \ | 67 | XSETFASTINT (METER_1 (this_code), \ |
| 68 | XFASTINT (METER_1 (this_code)) + 1); \ | 68 | XFIXNAT (METER_1 (this_code)) + 1); \ |
| 69 | if (last_code \ | 69 | if (last_code \ |
| 70 | && (XFASTINT (METER_2 (last_code, this_code)) \ | 70 | && (XFIXNAT (METER_2 (last_code, this_code)) \ |
| 71 | < MOST_POSITIVE_FIXNUM)) \ | 71 | < MOST_POSITIVE_FIXNUM)) \ |
| 72 | XSETFASTINT (METER_2 (last_code, this_code), \ | 72 | XSETFASTINT (METER_2 (last_code, this_code), \ |
| 73 | XFASTINT (METER_2 (last_code, this_code)) + 1); \ | 73 | XFIXNAT (METER_2 (last_code, this_code)) + 1); \ |
| 74 | } \ | 74 | } \ |
| 75 | } | 75 | } |
| 76 | 76 | ||
| @@ -346,7 +346,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 346 | 346 | ||
| 347 | CHECK_STRING (bytestr); | 347 | CHECK_STRING (bytestr); |
| 348 | CHECK_VECTOR (vector); | 348 | CHECK_VECTOR (vector); |
| 349 | CHECK_NATNUM (maxdepth); | 349 | CHECK_FIXNAT (maxdepth); |
| 350 | 350 | ||
| 351 | ptrdiff_t const_length = ASIZE (vector); | 351 | ptrdiff_t const_length = ASIZE (vector); |
| 352 | 352 | ||
| @@ -362,7 +362,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 362 | Lisp_Object *vectorp = XVECTOR (vector)->contents; | 362 | Lisp_Object *vectorp = XVECTOR (vector)->contents; |
| 363 | 363 | ||
| 364 | unsigned char quitcounter = 1; | 364 | unsigned char quitcounter = 1; |
| 365 | EMACS_INT stack_items = XFASTINT (maxdepth) + 1; | 365 | EMACS_INT stack_items = XFIXNAT (maxdepth) + 1; |
| 366 | USE_SAFE_ALLOCA; | 366 | USE_SAFE_ALLOCA; |
| 367 | void *alloc; | 367 | void *alloc; |
| 368 | SAFE_ALLOCA_LISP_EXTRA (alloc, stack_items, bytestr_length); | 368 | SAFE_ALLOCA_LISP_EXTRA (alloc, stack_items, bytestr_length); |
| @@ -378,16 +378,16 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 378 | 378 | ||
| 379 | if (!NILP (args_template)) | 379 | if (!NILP (args_template)) |
| 380 | { | 380 | { |
| 381 | eassert (INTEGERP (args_template)); | 381 | eassert (FIXNUMP (args_template)); |
| 382 | ptrdiff_t at = XINT (args_template); | 382 | ptrdiff_t at = XFIXNUM (args_template); |
| 383 | bool rest = (at & 128) != 0; | 383 | bool rest = (at & 128) != 0; |
| 384 | int mandatory = at & 127; | 384 | int mandatory = at & 127; |
| 385 | ptrdiff_t nonrest = at >> 8; | 385 | ptrdiff_t nonrest = at >> 8; |
| 386 | ptrdiff_t maxargs = rest ? PTRDIFF_MAX : nonrest; | 386 | ptrdiff_t maxargs = rest ? PTRDIFF_MAX : nonrest; |
| 387 | if (! (mandatory <= nargs && nargs <= maxargs)) | 387 | if (! (mandatory <= nargs && nargs <= maxargs)) |
| 388 | Fsignal (Qwrong_number_of_arguments, | 388 | Fsignal (Qwrong_number_of_arguments, |
| 389 | list2 (Fcons (make_number (mandatory), make_number (nonrest)), | 389 | list2 (Fcons (make_fixnum (mandatory), make_fixnum (nonrest)), |
| 390 | make_number (nargs))); | 390 | make_fixnum (nargs))); |
| 391 | ptrdiff_t pushedargs = min (nonrest, nargs); | 391 | ptrdiff_t pushedargs = min (nonrest, nargs); |
| 392 | for (ptrdiff_t i = 0; i < pushedargs; i++, args++) | 392 | for (ptrdiff_t i = 0; i < pushedargs; i++, args++) |
| 393 | PUSH (*args); | 393 | PUSH (*args); |
| @@ -621,10 +621,10 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 621 | { | 621 | { |
| 622 | Lisp_Object v1 = TOP; | 622 | Lisp_Object v1 = TOP; |
| 623 | Lisp_Object v2 = Fget (v1, Qbyte_code_meter); | 623 | Lisp_Object v2 = Fget (v1, Qbyte_code_meter); |
| 624 | if (INTEGERP (v2) | 624 | if (FIXNUMP (v2) |
| 625 | && XINT (v2) < MOST_POSITIVE_FIXNUM) | 625 | && XFIXNUM (v2) < MOST_POSITIVE_FIXNUM) |
| 626 | { | 626 | { |
| 627 | XSETINT (v2, XINT (v2) + 1); | 627 | XSETINT (v2, XFIXNUM (v2) + 1); |
| 628 | Fput (v1, Qbyte_code_meter, v2); | 628 | Fput (v1, Qbyte_code_meter, v2); |
| 629 | } | 629 | } |
| 630 | } | 630 | } |
| @@ -832,8 +832,8 @@ 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_NUMBER (v1); | 835 | CHECK_FIXNUM (v1); |
| 836 | for (EMACS_INT n = XINT (v1); 0 < n && CONSP (v2); n--) | 836 | for (EMACS_INT n = XFIXNUM (v1); 0 < n && CONSP (v2); n--) |
| 837 | { | 837 | { |
| 838 | v2 = XCDR (v2); | 838 | v2 = XCDR (v2); |
| 839 | rarely_quit (n); | 839 | rarely_quit (n); |
| @@ -972,11 +972,15 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 972 | NEXT; | 972 | NEXT; |
| 973 | 973 | ||
| 974 | CASE (Bsub1): | 974 | CASE (Bsub1): |
| 975 | TOP = INTEGERP (TOP) ? make_number (XINT (TOP) - 1) : Fsub1 (TOP); | 975 | TOP = (FIXNUMP (TOP) && XFIXNUM (TOP) != MOST_NEGATIVE_FIXNUM |
| 976 | ? make_fixnum (XFIXNUM (TOP) - 1) | ||
| 977 | : Fsub1 (TOP)); | ||
| 976 | NEXT; | 978 | NEXT; |
| 977 | 979 | ||
| 978 | CASE (Badd1): | 980 | CASE (Badd1): |
| 979 | TOP = INTEGERP (TOP) ? make_number (XINT (TOP) + 1) : Fadd1 (TOP); | 981 | TOP = (FIXNUMP (TOP) && XFIXNUM (TOP) != MOST_POSITIVE_FIXNUM |
| 982 | ? make_fixnum (XFIXNUM (TOP) + 1) | ||
| 983 | : Fadd1 (TOP)); | ||
| 980 | NEXT; | 984 | NEXT; |
| 981 | 985 | ||
| 982 | CASE (Beqlsign): | 986 | CASE (Beqlsign): |
| @@ -986,8 +990,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 986 | TOP = arithcompare (v1, v2, ARITH_EQUAL); | 990 | TOP = arithcompare (v1, v2, ARITH_EQUAL); |
| 987 | else | 991 | else |
| 988 | { | 992 | { |
| 989 | CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v1); | 993 | CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER (v1); |
| 990 | CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v2); | 994 | CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER (v2); |
| 991 | TOP = EQ (v1, v2) ? Qt : Qnil; | 995 | TOP = EQ (v1, v2) ? Qt : Qnil; |
| 992 | } | 996 | } |
| 993 | NEXT; | 997 | NEXT; |
| @@ -1027,7 +1031,9 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1027 | NEXT; | 1031 | NEXT; |
| 1028 | 1032 | ||
| 1029 | CASE (Bnegate): | 1033 | CASE (Bnegate): |
| 1030 | TOP = INTEGERP (TOP) ? make_number (- XINT (TOP)) : Fminus (1, &TOP); | 1034 | TOP = (FIXNUMP (TOP) && XFIXNUM (TOP) != MOST_NEGATIVE_FIXNUM |
| 1035 | ? make_fixnum (- XFIXNUM (TOP)) | ||
| 1036 | : Fminus (1, &TOP)); | ||
| 1031 | NEXT; | 1037 | NEXT; |
| 1032 | 1038 | ||
| 1033 | CASE (Bplus): | 1039 | CASE (Bplus): |
| @@ -1063,7 +1069,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1063 | } | 1069 | } |
| 1064 | 1070 | ||
| 1065 | CASE (Bpoint): | 1071 | CASE (Bpoint): |
| 1066 | PUSH (make_natnum (PT)); | 1072 | PUSH (make_fixed_natnum (PT)); |
| 1067 | NEXT; | 1073 | NEXT; |
| 1068 | 1074 | ||
| 1069 | CASE (Bgoto_char): | 1075 | CASE (Bgoto_char): |
| @@ -1089,7 +1095,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1089 | } | 1095 | } |
| 1090 | 1096 | ||
| 1091 | CASE (Bpoint_min): | 1097 | CASE (Bpoint_min): |
| 1092 | PUSH (make_natnum (BEGV)); | 1098 | PUSH (make_fixed_natnum (BEGV)); |
| 1093 | NEXT; | 1099 | NEXT; |
| 1094 | 1100 | ||
| 1095 | CASE (Bchar_after): | 1101 | CASE (Bchar_after): |
| @@ -1105,7 +1111,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1105 | NEXT; | 1111 | NEXT; |
| 1106 | 1112 | ||
| 1107 | CASE (Bcurrent_column): | 1113 | CASE (Bcurrent_column): |
| 1108 | PUSH (make_natnum (current_column ())); | 1114 | PUSH (make_fixed_natnum (current_column ())); |
| 1109 | NEXT; | 1115 | NEXT; |
| 1110 | 1116 | ||
| 1111 | CASE (Bindent_to): | 1117 | CASE (Bindent_to): |
| @@ -1169,7 +1175,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1169 | CASE (Bchar_syntax): | 1175 | CASE (Bchar_syntax): |
| 1170 | { | 1176 | { |
| 1171 | CHECK_CHARACTER (TOP); | 1177 | CHECK_CHARACTER (TOP); |
| 1172 | int c = XFASTINT (TOP); | 1178 | int c = XFIXNAT (TOP); |
| 1173 | if (NILP (BVAR (current_buffer, enable_multibyte_characters))) | 1179 | if (NILP (BVAR (current_buffer, enable_multibyte_characters))) |
| 1174 | MAKE_CHAR_MULTIBYTE (c); | 1180 | MAKE_CHAR_MULTIBYTE (c); |
| 1175 | XSETFASTINT (TOP, syntax_code_spec[SYNTAX (c)]); | 1181 | XSETFASTINT (TOP, syntax_code_spec[SYNTAX (c)]); |
| @@ -1262,8 +1268,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1262 | { | 1268 | { |
| 1263 | /* Exchange args and then do nth. */ | 1269 | /* Exchange args and then do nth. */ |
| 1264 | Lisp_Object v2 = POP, v1 = TOP; | 1270 | Lisp_Object v2 = POP, v1 = TOP; |
| 1265 | CHECK_NUMBER (v2); | 1271 | CHECK_FIXNUM (v2); |
| 1266 | for (EMACS_INT n = XINT (v2); 0 < n && CONSP (v1); n--) | 1272 | for (EMACS_INT n = XFIXNUM (v2); 0 < n && CONSP (v1); n--) |
| 1267 | { | 1273 | { |
| 1268 | v1 = XCDR (v1); | 1274 | v1 = XCDR (v1); |
| 1269 | rarely_quit (n); | 1275 | rarely_quit (n); |
| @@ -1415,7 +1421,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1415 | { /* Do a linear search if there are not many cases | 1421 | { /* Do a linear search if there are not many cases |
| 1416 | FIXME: 5 is arbitrarily chosen. */ | 1422 | FIXME: 5 is arbitrarily chosen. */ |
| 1417 | Lisp_Object hash_code = h->test.cmpfn | 1423 | Lisp_Object hash_code = h->test.cmpfn |
| 1418 | ? make_number (h->test.hashfn (&h->test, v1)) : Qnil; | 1424 | ? make_fixnum (h->test.hashfn (&h->test, v1)) : Qnil; |
| 1419 | 1425 | ||
| 1420 | for (i = h->count; 0 <= --i; ) | 1426 | for (i = h->count; 0 <= --i; ) |
| 1421 | if (EQ (v1, HASH_KEY (h, i)) | 1427 | if (EQ (v1, HASH_KEY (h, i)) |
| @@ -1431,9 +1437,9 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1431 | if (i >= 0) | 1437 | if (i >= 0) |
| 1432 | { | 1438 | { |
| 1433 | Lisp_Object val = HASH_VALUE (h, i); | 1439 | Lisp_Object val = HASH_VALUE (h, i); |
| 1434 | if (BYTE_CODE_SAFE && !INTEGERP (val)) | 1440 | if (BYTE_CODE_SAFE && !FIXNUMP (val)) |
| 1435 | emacs_abort (); | 1441 | emacs_abort (); |
| 1436 | op = XINT (val); | 1442 | op = XFIXNUM (val); |
| 1437 | goto op_branch; | 1443 | goto op_branch; |
| 1438 | } | 1444 | } |
| 1439 | } | 1445 | } |
| @@ -1468,14 +1474,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1468 | Lisp_Object | 1474 | Lisp_Object |
| 1469 | get_byte_code_arity (Lisp_Object args_template) | 1475 | get_byte_code_arity (Lisp_Object args_template) |
| 1470 | { | 1476 | { |
| 1471 | eassert (NATNUMP (args_template)); | 1477 | eassert (FIXNATP (args_template)); |
| 1472 | EMACS_INT at = XINT (args_template); | 1478 | EMACS_INT at = XFIXNUM (args_template); |
| 1473 | bool rest = (at & 128) != 0; | 1479 | bool rest = (at & 128) != 0; |
| 1474 | int mandatory = at & 127; | 1480 | int mandatory = at & 127; |
| 1475 | EMACS_INT nonrest = at >> 8; | 1481 | EMACS_INT nonrest = at >> 8; |
| 1476 | 1482 | ||
| 1477 | return Fcons (make_number (mandatory), | 1483 | return Fcons (make_fixnum (mandatory), |
| 1478 | rest ? Qmany : make_number (nonrest)); | 1484 | rest ? Qmany : make_fixnum (nonrest)); |
| 1479 | } | 1485 | } |
| 1480 | 1486 | ||
| 1481 | void | 1487 | void |
| @@ -1500,13 +1506,13 @@ If a symbol has a property named `byte-code-meter' whose value is an | |||
| 1500 | integer, it is incremented each time that symbol's function is called. */); | 1506 | integer, it is incremented each time that symbol's function is called. */); |
| 1501 | 1507 | ||
| 1502 | byte_metering_on = false; | 1508 | byte_metering_on = false; |
| 1503 | Vbyte_code_meter = Fmake_vector (make_number (256), make_number (0)); | 1509 | Vbyte_code_meter = Fmake_vector (make_fixnum (256), make_fixnum (0)); |
| 1504 | DEFSYM (Qbyte_code_meter, "byte-code-meter"); | 1510 | DEFSYM (Qbyte_code_meter, "byte-code-meter"); |
| 1505 | { | 1511 | { |
| 1506 | int i = 256; | 1512 | int i = 256; |
| 1507 | while (i--) | 1513 | while (i--) |
| 1508 | ASET (Vbyte_code_meter, i, | 1514 | ASET (Vbyte_code_meter, i, |
| 1509 | Fmake_vector (make_number (256), make_number (0))); | 1515 | Fmake_vector (make_fixnum (256), make_fixnum (0))); |
| 1510 | } | 1516 | } |
| 1511 | #endif | 1517 | #endif |
| 1512 | } | 1518 | } |