aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytecode.c')
-rw-r--r--src/bytecode.c76
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,
1468Lisp_Object 1474Lisp_Object
1469get_byte_code_arity (Lisp_Object args_template) 1475get_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
1481void 1487void
@@ -1500,13 +1506,13 @@ If a symbol has a property named `byte-code-meter' whose value is an
1500integer, it is incremented each time that symbol's function is called. */); 1506integer, 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}