Mercurial > emacs
comparison src/bytecode.c @ 934:1e2e41fd188b
entered into RCS
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Tue, 04 Aug 1992 21:22:43 +0000 |
| parents | eca8812e61cd |
| children | 6bebb86e63c2 |
comparison
equal
deleted
inserted
replaced
| 933:bf0e6122c2a9 | 934:1e2e41fd188b |
|---|---|
| 1 /* Execution of byte code produced by bytecomp.el. | 1 /* Execution of byte code produced by bytecomp.el. |
| 2 Copyright (C) 1985, 1986, 1987, 1988, 1992 Free Software Foundation, Inc. | 2 Copyright (C) 1985, 1986, 1987, 1988 Free Software Foundation, Inc. |
| 3 | 3 |
| 4 This file is part of GNU Emacs. | 4 This file is part of GNU Emacs. |
| 5 | 5 |
| 6 GNU Emacs is free software; you can redistribute it and/or modify | 6 GNU Emacs is free software; you can redistribute it and/or modify |
| 7 it under the terms of the GNU General Public License as published by | 7 it under the terms of the GNU General Public License as published by |
| 8 the Free Software Foundation; either version 2, or (at your option) | 8 the Free Software Foundation; either version 1, or (at your option) |
| 9 any later version. | 9 any later version. |
| 10 | 10 |
| 11 GNU Emacs is distributed in the hope that it will be useful, | 11 GNU Emacs is distributed in the hope that it will be useful, |
| 12 but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 | 15 |
| 16 You should have received a copy of the GNU General Public License | 16 You should have received a copy of the GNU General Public License |
| 17 along with GNU Emacs; see the file COPYING. If not, write to | 17 along with GNU Emacs; see the file COPYING. If not, write to |
| 18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | 18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
| 19 | 19 |
| 20 hacked on by jwz@lucid.com 17-jun-91 | 20 hacked on by jwz 17-jun-91 |
| 21 o added a compile-time switch to turn on simple sanity checking; | 21 o added a compile-time switch to turn on simple sanity checking; |
| 22 o put back the obsolete byte-codes for error-detection; | 22 o put back the obsolete byte-codes for error-detection; |
| 23 o put back fset, symbol-function, and read-char because I don't | |
| 24 see any reason for them to have been removed; | |
| 23 o added a new instruction, unbind_all, which I will use for | 25 o added a new instruction, unbind_all, which I will use for |
| 24 tail-recursion elimination; | 26 tail-recursion elimination; |
| 25 o made temp_output_buffer_show be called with the right number | 27 o made temp_output_buffer_show() be called with the right number |
| 26 of args; | 28 of args; |
| 27 o made the new bytecodes be called with args in the right order; | 29 o made the new bytecodes be called with args in the right order; |
| 28 o added metering support. | 30 o added metering support. |
| 29 | 31 |
| 30 by Hallvard: | 32 by Hallvard: |
| 31 o added relative jump instructions; | 33 o added relative jump instructions; |
| 32 o all conditionals now only do QUIT if they jump. | 34 o all conditionals now only do QUIT if they jump. |
| 33 */ | 35 */ |
| 34 | 36 |
| 37 | |
| 35 #include "config.h" | 38 #include "config.h" |
| 36 #include "lisp.h" | 39 #include "lisp.h" |
| 37 #include "buffer.h" | 40 #include "buffer.h" |
| 38 #include "syntax.h" | 41 #include "syntax.h" |
| 39 | 42 |
| 40 /* | 43 /* Define this to enable some minor sanity checking |
| 41 * define BYTE_CODE_SAFE to enable some minor sanity checking (useful for | 44 (useful for debugging the byte compiler...) |
| 42 * debugging the byte compiler...) | |
| 43 * | |
| 44 * define BYTE_CODE_METER to enable generation of a byte-op usage histogram. | |
| 45 */ | 45 */ |
| 46 /* #define BYTE_CODE_SAFE */ | 46 #define BYTE_CODE_SAFE |
| 47 /* #define BYTE_CODE_METER */ | 47 |
| 48 /* Define this to enable generation of a histogram of byte-op usage. | |
| 49 */ | |
| 50 #define BYTE_CODE_METER | |
| 48 | 51 |
| 49 | 52 |
| 50 #ifdef BYTE_CODE_METER | 53 #ifdef BYTE_CODE_METER |
| 51 | 54 |
| 52 Lisp_Object Vbyte_code_meter, Qbyte_code_meter; | 55 Lisp_Object Vbyte_code_meter; |
| 53 int byte_metering_on; | 56 int byte_metering_on; |
| 54 | 57 |
| 55 #define METER_2(code1, code2) \ | 58 # define METER_2(code1,code2) \ |
| 56 XFASTINT (XVECTOR (XVECTOR (Vbyte_code_meter)->contents[(code1)]) \ | 59 XFASTINT (XVECTOR (XVECTOR (Vbyte_code_meter)->contents[(code1)]) \ |
| 57 ->contents[(code2)]) | 60 ->contents[(code2)]) |
| 58 | 61 |
| 59 #define METER_1(code) METER_2 (0, (code)) | 62 # define METER_1(code) METER_2 (0,(code)) |
| 60 | 63 |
| 61 #define METER_CODE(last_code, this_code) \ | 64 # define METER_CODE(last_code, this_code) { \ |
| 62 { \ | 65 if (byte_metering_on) { \ |
| 63 if (byte_metering_on) \ | 66 if (METER_1 (this_code) != ((1<<VALBITS)-1)) \ |
| 64 { \ | 67 METER_1 (this_code) ++; \ |
| 65 if (METER_1 (this_code) != ((1<<VALBITS)-1)) \ | 68 if (last_code && \ |
| 66 METER_1 (this_code)++; \ | 69 METER_2 (last_code,this_code) != ((1<<VALBITS)-1)) \ |
| 67 if (last_code \ | 70 METER_2 (last_code,this_code) ++; \ |
| 68 && METER_2 (last_code, this_code) != ((1<<VALBITS)-1)) \ | 71 } \ |
| 69 METER_2 (last_code, this_code)++; \ | 72 } |
| 70 } \ | 73 |
| 71 } | 74 #else /* ! BYTE_CODE_METER */ |
| 72 | 75 |
| 73 #else /* no BYTE_CODE_METER */ | 76 # define meter_code(last_code, this_code) |
| 74 | 77 |
| 75 #define METER_CODE(last_code, this_code) | 78 #endif |
| 76 | |
| 77 #endif /* no BYTE_CODE_METER */ | |
| 78 | 79 |
| 79 | 80 |
| 80 Lisp_Object Qbytecode; | 81 Lisp_Object Qbytecode; |
| 81 | 82 |
| 82 /* Byte codes: */ | 83 /* Byte codes: */ |
| 144 #define Beobp 0155 | 145 #define Beobp 0155 |
| 145 #define Bbolp 0156 | 146 #define Bbolp 0156 |
| 146 #define Bbobp 0157 | 147 #define Bbobp 0157 |
| 147 #define Bcurrent_buffer 0160 | 148 #define Bcurrent_buffer 0160 |
| 148 #define Bset_buffer 0161 | 149 #define Bset_buffer 0161 |
| 149 #define Bread_char 0162 /* No longer generated as of v19 */ | 150 #define Bread_char 0162 |
| 150 #define Bset_mark 0163 /* this loser is no longer generated as of v18 */ | 151 #define Bset_mark 0163 /* this loser is no longer generated as of v18 */ |
| 151 #define Binteractive_p 0164 /* Needed since interactive-p takes unevalled args */ | 152 #define Binteractive_p 0164 /* Needed since interactive-p takes unevalled args */ |
| 152 | 153 |
| 153 #define Bforward_char 0165 | 154 #define Bforward_char 0165 |
| 154 #define Bforward_word 0166 | 155 #define Bforward_word 0166 |
| 158 #define Bchar_syntax 0172 | 159 #define Bchar_syntax 0172 |
| 159 #define Bbuffer_substring 0173 | 160 #define Bbuffer_substring 0173 |
| 160 #define Bdelete_region 0174 | 161 #define Bdelete_region 0174 |
| 161 #define Bnarrow_to_region 0175 | 162 #define Bnarrow_to_region 0175 |
| 162 #define Bwiden 0176 | 163 #define Bwiden 0176 |
| 163 #define Bend_of_line 0177 | |
| 164 | 164 |
| 165 #define Bconstant2 0201 | 165 #define Bconstant2 0201 |
| 166 #define Bgoto 0202 | 166 #define Bgoto 0202 |
| 167 #define Bgotoifnil 0203 | 167 #define Bgotoifnil 0203 |
| 168 #define Bgotoifnonnil 0204 | 168 #define Bgotoifnonnil 0204 |
| 181 #define Bcondition_case 0217 | 181 #define Bcondition_case 0217 |
| 182 #define Btemp_output_buffer_setup 0220 | 182 #define Btemp_output_buffer_setup 0220 |
| 183 #define Btemp_output_buffer_show 0221 | 183 #define Btemp_output_buffer_show 0221 |
| 184 | 184 |
| 185 #define Bunbind_all 0222 | 185 #define Bunbind_all 0222 |
| 186 | |
| 187 #define Bset_marker 0223 | |
| 188 #define Bmatch_beginning 0224 | |
| 189 #define Bmatch_end 0225 | |
| 190 #define Bupcase 0226 | |
| 191 #define Bdowncase 0227 | |
| 192 | 186 |
| 193 #define Bstringeqlsign 0230 | 187 #define Bstringeqlsign 0230 |
| 194 #define Bstringlss 0231 | 188 #define Bstringlss 0231 |
| 195 #define Bequal 0232 | 189 #define Bequal 0232 |
| 196 #define Bnthcdr 0233 | 190 #define Bnthcdr 0233 |
| 205 #define Bnconc 0244 | 199 #define Bnconc 0244 |
| 206 #define Bquo 0245 | 200 #define Bquo 0245 |
| 207 #define Brem 0246 | 201 #define Brem 0246 |
| 208 #define Bnumberp 0247 | 202 #define Bnumberp 0247 |
| 209 #define Bintegerp 0250 | 203 #define Bintegerp 0250 |
| 210 | |
| 211 #define BRgoto 0252 | |
| 212 #define BRgotoifnil 0253 | |
| 213 #define BRgotoifnonnil 0254 | |
| 214 #define BRgotoifnilelsepop 0255 | |
| 215 #define BRgotoifnonnilelsepop 0256 | |
| 216 | |
| 217 #define BlistN 0257 | |
| 218 #define BconcatN 0260 | |
| 219 #define BinsertN 0261 | |
| 220 | 204 |
| 221 #define Bconstant 0300 | 205 #define Bconstant 0300 |
| 222 #define CONSTANTLIM 0100 | 206 #define CONSTANTLIM 0100 |
| 223 | 207 |
| 224 /* Fetch the next byte from the bytecode stream */ | 208 /* Fetch the next byte from the bytecode stream */ |
| 299 | 283 |
| 300 while (1) | 284 while (1) |
| 301 { | 285 { |
| 302 #ifdef BYTE_CODE_SAFE | 286 #ifdef BYTE_CODE_SAFE |
| 303 if (stackp > stacke) | 287 if (stackp > stacke) |
| 304 error ("Byte code stack overflow (byte compiler bug), pc %d, depth %d", | 288 error ( |
| 289 "Stack overflow in byte code (byte compiler bug), pc = %d, depth = %d", | |
| 305 pc - XSTRING (string_saved)->data, stacke - stackp); | 290 pc - XSTRING (string_saved)->data, stacke - stackp); |
| 306 if (stackp < stack) | 291 if (stackp < stack) |
| 307 error ("Byte code stack underflow (byte compiler bug), pc %d", | 292 error ("Stack underflow in byte code (byte compiler bug), pc = %d", |
| 308 pc - XSTRING (string_saved)->data); | 293 pc - XSTRING (string_saved)->data); |
| 309 #endif | 294 #endif |
| 310 | 295 |
| 311 if (string_saved != bytestr) | 296 if (string_saved != bytestr) |
| 312 { | 297 { |
| 403 | 388 |
| 404 case Bcall: case Bcall+1: case Bcall+2: case Bcall+3: | 389 case Bcall: case Bcall+1: case Bcall+2: case Bcall+3: |
| 405 case Bcall+4: case Bcall+5: | 390 case Bcall+4: case Bcall+5: |
| 406 op -= Bcall; | 391 op -= Bcall; |
| 407 docall: | 392 docall: |
| 408 DISCARD (op); | 393 DISCARD(op); |
| 409 #ifdef BYTE_CODE_METER | |
| 410 if (byte_metering_on && XTYPE (TOP) == Lisp_Symbol) | |
| 411 { | |
| 412 v1 = TOP; | |
| 413 v2 = Fget (v1, Qbyte_code_meter); | |
| 414 if (XTYPE (v2) == Lisp_Int) | |
| 415 { | |
| 416 XSETINT (v2, XINT (v2) + 1); | |
| 417 Fput (v1, Qbyte_code_meter, v2); | |
| 418 } | |
| 419 } | |
| 420 #endif | |
| 421 TOP = Ffuncall (op + 1, &TOP); | 394 TOP = Ffuncall (op + 1, &TOP); |
| 422 break; | 395 break; |
| 423 | 396 |
| 424 case Bunbind+6: | 397 case Bunbind+6: |
| 425 op = FETCH; | 398 op = FETCH; |
| 436 unbind_to (specpdl_ptr - specpdl - op, Qnil); | 409 unbind_to (specpdl_ptr - specpdl - op, Qnil); |
| 437 break; | 410 break; |
| 438 | 411 |
| 439 case Bunbind_all: | 412 case Bunbind_all: |
| 440 /* To unbind back to the beginning of this frame. Not used yet, | 413 /* To unbind back to the beginning of this frame. Not used yet, |
| 441 but will be needed for tail-recursion elimination. */ | 414 but wil be needed for tail-recursion elimination. |
| 415 */ | |
| 442 unbind_to (count, Qnil); | 416 unbind_to (count, Qnil); |
| 443 break; | 417 break; |
| 444 | 418 |
| 445 case Bgoto: | 419 case Bgoto: |
| 446 QUIT; | 420 QUIT; |
| 448 pc = XSTRING (string_saved)->data + op; | 422 pc = XSTRING (string_saved)->data + op; |
| 449 break; | 423 break; |
| 450 | 424 |
| 451 case Bgotoifnil: | 425 case Bgotoifnil: |
| 452 op = FETCH2; | 426 op = FETCH2; |
| 453 if (NILP (POP)) | 427 if (NULL (POP)) |
| 454 { | 428 { |
| 455 QUIT; | 429 QUIT; |
| 456 pc = XSTRING (string_saved)->data + op; | 430 pc = XSTRING (string_saved)->data + op; |
| 457 } | 431 } |
| 458 break; | 432 break; |
| 459 | 433 |
| 460 case Bgotoifnonnil: | 434 case Bgotoifnonnil: |
| 461 op = FETCH2; | 435 op = FETCH2; |
| 462 if (!NILP (POP)) | 436 if (!NULL (POP)) |
| 463 { | 437 { |
| 464 QUIT; | 438 QUIT; |
| 465 pc = XSTRING (string_saved)->data + op; | 439 pc = XSTRING (string_saved)->data + op; |
| 466 } | 440 } |
| 467 break; | 441 break; |
| 468 | 442 |
| 469 case Bgotoifnilelsepop: | 443 case Bgotoifnilelsepop: |
| 470 op = FETCH2; | 444 op = FETCH2; |
| 471 if (NILP (TOP)) | 445 if (NULL (TOP)) |
| 472 { | 446 { |
| 473 QUIT; | 447 QUIT; |
| 474 pc = XSTRING (string_saved)->data + op; | 448 pc = XSTRING (string_saved)->data + op; |
| 475 } | 449 } |
| 476 else DISCARD (1); | 450 else DISCARD(1); |
| 477 break; | 451 break; |
| 478 | 452 |
| 479 case Bgotoifnonnilelsepop: | 453 case Bgotoifnonnilelsepop: |
| 480 op = FETCH2; | 454 op = FETCH2; |
| 481 if (!NILP (TOP)) | 455 if (!NULL (TOP)) |
| 482 { | 456 { |
| 483 QUIT; | 457 QUIT; |
| 484 pc = XSTRING (string_saved)->data + op; | 458 pc = XSTRING (string_saved)->data + op; |
| 485 } | 459 } |
| 486 else DISCARD (1); | 460 else DISCARD(1); |
| 487 break; | |
| 488 | |
| 489 case BRgoto: | |
| 490 QUIT; | |
| 491 pc += *pc - 127; | |
| 492 break; | |
| 493 | |
| 494 case BRgotoifnil: | |
| 495 if (NILP (POP)) | |
| 496 { | |
| 497 QUIT; | |
| 498 pc += *pc - 128; | |
| 499 } | |
| 500 pc++; | |
| 501 break; | |
| 502 | |
| 503 case BRgotoifnonnil: | |
| 504 if (!NILP (POP)) | |
| 505 { | |
| 506 QUIT; | |
| 507 pc += *pc - 128; | |
| 508 } | |
| 509 pc++; | |
| 510 break; | |
| 511 | |
| 512 case BRgotoifnilelsepop: | |
| 513 op = *pc++; | |
| 514 if (NILP (TOP)) | |
| 515 { | |
| 516 QUIT; | |
| 517 pc += op - 128; | |
| 518 } | |
| 519 else DISCARD (1); | |
| 520 break; | |
| 521 | |
| 522 case BRgotoifnonnilelsepop: | |
| 523 op = *pc++; | |
| 524 if (!NILP (TOP)) | |
| 525 { | |
| 526 QUIT; | |
| 527 pc += op - 128; | |
| 528 } | |
| 529 else DISCARD (1); | |
| 530 break; | 461 break; |
| 531 | 462 |
| 532 case Breturn: | 463 case Breturn: |
| 533 v1 = POP; | 464 v1 = POP; |
| 534 goto exit; | 465 goto exit; |
| 535 | 466 |
| 536 case Bdiscard: | 467 case Bdiscard: |
| 537 DISCARD (1); | 468 DISCARD(1); |
| 538 break; | 469 break; |
| 539 | 470 |
| 540 case Bdup: | 471 case Bdup: |
| 541 v1 = TOP; | 472 v1 = TOP; |
| 542 PUSH (v1); | 473 PUSH (v1); |
| 596 immediate_quit = 1; | 527 immediate_quit = 1; |
| 597 while (--op >= 0) | 528 while (--op >= 0) |
| 598 { | 529 { |
| 599 if (CONSP (v1)) | 530 if (CONSP (v1)) |
| 600 v1 = XCONS (v1)->cdr; | 531 v1 = XCONS (v1)->cdr; |
| 601 else if (!NILP (v1)) | 532 else if (!NULL (v1)) |
| 602 { | 533 { |
| 603 immediate_quit = 0; | 534 immediate_quit = 0; |
| 604 v1 = wrong_type_argument (Qlistp, v1); | 535 v1 = wrong_type_argument (Qlistp, v1); |
| 605 immediate_quit = 1; | 536 immediate_quit = 1; |
| 606 op++; | 537 op++; |
| 620 case Bstringp: | 551 case Bstringp: |
| 621 TOP = XTYPE (TOP) == Lisp_String ? Qt : Qnil; | 552 TOP = XTYPE (TOP) == Lisp_String ? Qt : Qnil; |
| 622 break; | 553 break; |
| 623 | 554 |
| 624 case Blistp: | 555 case Blistp: |
| 625 TOP = CONSP (TOP) || NILP (TOP) ? Qt : Qnil; | 556 TOP = CONSP (TOP) || NULL (TOP) ? Qt : Qnil; |
| 626 break; | 557 break; |
| 627 | 558 |
| 628 case Beq: | 559 case Beq: |
| 629 v1 = POP; | 560 v1 = POP; |
| 630 TOP = EQ (v1, TOP) ? Qt : Qnil; | 561 TOP = EQ (v1, TOP) ? Qt : Qnil; |
| 634 v1 = POP; | 565 v1 = POP; |
| 635 TOP = Fmemq (TOP, v1); | 566 TOP = Fmemq (TOP, v1); |
| 636 break; | 567 break; |
| 637 | 568 |
| 638 case Bnot: | 569 case Bnot: |
| 639 TOP = NILP (TOP) ? Qt : Qnil; | 570 TOP = NULL (TOP) ? Qt : Qnil; |
| 640 break; | 571 break; |
| 641 | 572 |
| 642 case Bcar: | 573 case Bcar: |
| 643 v1 = TOP; | 574 v1 = TOP; |
| 644 docar: | 575 docar: |
| 645 if (CONSP (v1)) TOP = XCONS (v1)->car; | 576 if (CONSP (v1)) TOP = XCONS (v1)->car; |
| 646 else if (NILP (v1)) TOP = Qnil; | 577 else if (NULL (v1)) TOP = Qnil; |
| 647 else Fcar (wrong_type_argument (Qlistp, v1)); | 578 else Fcar (wrong_type_argument (Qlistp, v1)); |
| 648 break; | 579 break; |
| 649 | 580 |
| 650 case Bcdr: | 581 case Bcdr: |
| 651 v1 = TOP; | 582 v1 = TOP; |
| 652 if (CONSP (v1)) TOP = XCONS (v1)->cdr; | 583 if (CONSP (v1)) TOP = XCONS (v1)->cdr; |
| 653 else if (NILP (v1)) TOP = Qnil; | 584 else if (NULL (v1)) TOP = Qnil; |
| 654 else Fcdr (wrong_type_argument (Qlistp, v1)); | 585 else Fcdr (wrong_type_argument (Qlistp, v1)); |
| 655 break; | 586 break; |
| 656 | 587 |
| 657 case Bcons: | 588 case Bcons: |
| 658 v1 = POP; | 589 v1 = POP; |
| 667 v1 = POP; | 598 v1 = POP; |
| 668 TOP = Fcons (TOP, Fcons (v1, Qnil)); | 599 TOP = Fcons (TOP, Fcons (v1, Qnil)); |
| 669 break; | 600 break; |
| 670 | 601 |
| 671 case Blist3: | 602 case Blist3: |
| 672 DISCARD (2); | 603 DISCARD(2); |
| 673 TOP = Flist (3, &TOP); | 604 TOP = Flist (3, &TOP); |
| 674 break; | 605 break; |
| 675 | 606 |
| 676 case Blist4: | 607 case Blist4: |
| 677 DISCARD (3); | 608 DISCARD(3); |
| 678 TOP = Flist (4, &TOP); | 609 TOP = Flist (4, &TOP); |
| 679 break; | |
| 680 | |
| 681 case BlistN: | |
| 682 op = FETCH; | |
| 683 DISCARD (op - 1); | |
| 684 TOP = Flist (op, &TOP); | |
| 685 break; | 610 break; |
| 686 | 611 |
| 687 case Blength: | 612 case Blength: |
| 688 TOP = Flength (TOP); | 613 TOP = Flength (TOP); |
| 689 break; | 614 break; |
| 725 v2 = POP; v1 = POP; | 650 v2 = POP; v1 = POP; |
| 726 TOP = Fsubstring (TOP, v1, v2); | 651 TOP = Fsubstring (TOP, v1, v2); |
| 727 break; | 652 break; |
| 728 | 653 |
| 729 case Bconcat2: | 654 case Bconcat2: |
| 730 DISCARD (1); | 655 DISCARD(1); |
| 731 TOP = Fconcat (2, &TOP); | 656 TOP = Fconcat (2, &TOP); |
| 732 break; | 657 break; |
| 733 | 658 |
| 734 case Bconcat3: | 659 case Bconcat3: |
| 735 DISCARD (2); | 660 DISCARD(2); |
| 736 TOP = Fconcat (3, &TOP); | 661 TOP = Fconcat (3, &TOP); |
| 737 break; | 662 break; |
| 738 | 663 |
| 739 case Bconcat4: | 664 case Bconcat4: |
| 740 DISCARD (3); | 665 DISCARD(3); |
| 741 TOP = Fconcat (4, &TOP); | 666 TOP = Fconcat (4, &TOP); |
| 742 break; | |
| 743 | |
| 744 case BconcatN: | |
| 745 op = FETCH; | |
| 746 DISCARD (op - 1); | |
| 747 TOP = Fconcat (op, &TOP); | |
| 748 break; | 667 break; |
| 749 | 668 |
| 750 case Bsub1: | 669 case Bsub1: |
| 751 v1 = TOP; | 670 v1 = TOP; |
| 752 if (XTYPE (v1) == Lisp_Int) | 671 if (XTYPE (v1) == Lisp_Int) |
| 795 v1 = POP; | 714 v1 = POP; |
| 796 TOP = Fgeq (TOP, v1); | 715 TOP = Fgeq (TOP, v1); |
| 797 break; | 716 break; |
| 798 | 717 |
| 799 case Bdiff: | 718 case Bdiff: |
| 800 DISCARD (1); | 719 DISCARD(1); |
| 801 TOP = Fminus (2, &TOP); | 720 TOP = Fminus (2, &TOP); |
| 802 break; | 721 break; |
| 803 | 722 |
| 804 case Bnegate: | 723 case Bnegate: |
| 805 v1 = TOP; | 724 v1 = TOP; |
| 811 else | 730 else |
| 812 TOP = Fminus (1, &TOP); | 731 TOP = Fminus (1, &TOP); |
| 813 break; | 732 break; |
| 814 | 733 |
| 815 case Bplus: | 734 case Bplus: |
| 816 DISCARD (1); | 735 DISCARD(1); |
| 817 TOP = Fplus (2, &TOP); | 736 TOP = Fplus (2, &TOP); |
| 818 break; | 737 break; |
| 819 | 738 |
| 820 case Bmax: | 739 case Bmax: |
| 821 DISCARD (1); | 740 DISCARD(1); |
| 822 TOP = Fmax (2, &TOP); | 741 TOP = Fmax (2, &TOP); |
| 823 break; | 742 break; |
| 824 | 743 |
| 825 case Bmin: | 744 case Bmin: |
| 826 DISCARD (1); | 745 DISCARD(1); |
| 827 TOP = Fmin (2, &TOP); | 746 TOP = Fmin (2, &TOP); |
| 828 break; | 747 break; |
| 829 | 748 |
| 830 case Bmult: | 749 case Bmult: |
| 831 DISCARD (1); | 750 DISCARD(1); |
| 832 TOP = Ftimes (2, &TOP); | 751 TOP = Ftimes (2, &TOP); |
| 833 break; | 752 break; |
| 834 | 753 |
| 835 case Bquo: | 754 case Bquo: |
| 836 DISCARD (1); | 755 DISCARD(1); |
| 837 TOP = Fquo (2, &TOP); | 756 TOP = Fquo (2, &TOP); |
| 838 break; | 757 break; |
| 839 | 758 |
| 840 case Brem: | 759 case Brem: |
| 841 v1 = POP; | 760 v1 = POP; |
| 761 /* This had args in the wrong order. -- jwz */ | |
| 842 TOP = Frem (TOP, v1); | 762 TOP = Frem (TOP, v1); |
| 843 break; | 763 break; |
| 844 | 764 |
| 845 case Bpoint: | 765 case Bpoint: |
| 846 XFASTINT (v1) = point; | 766 XFASTINT (v1) = point; |
| 853 | 773 |
| 854 case Binsert: | 774 case Binsert: |
| 855 TOP = Finsert (1, &TOP); | 775 TOP = Finsert (1, &TOP); |
| 856 break; | 776 break; |
| 857 | 777 |
| 858 case BinsertN: | |
| 859 op = FETCH; | |
| 860 DISCARD (op - 1); | |
| 861 TOP = Finsert (op, &TOP); | |
| 862 break; | |
| 863 | |
| 864 case Bpoint_max: | 778 case Bpoint_max: |
| 865 XFASTINT (v1) = ZV; | 779 XFASTINT (v1) = ZV; |
| 866 PUSH (v1); | 780 PUSH (v1); |
| 867 break; | 781 break; |
| 868 | 782 |
| 926 case Binteractive_p: | 840 case Binteractive_p: |
| 927 PUSH (Finteractive_p ()); | 841 PUSH (Finteractive_p ()); |
| 928 break; | 842 break; |
| 929 | 843 |
| 930 case Bforward_char: | 844 case Bforward_char: |
| 845 /* This was wrong! --jwz */ | |
| 931 TOP = Fforward_char (TOP); | 846 TOP = Fforward_char (TOP); |
| 932 break; | 847 break; |
| 933 | 848 |
| 934 case Bforward_word: | 849 case Bforward_word: |
| 850 /* This was wrong! --jwz */ | |
| 935 TOP = Fforward_word (TOP); | 851 TOP = Fforward_word (TOP); |
| 936 break; | 852 break; |
| 937 | 853 |
| 938 case Bskip_chars_forward: | 854 case Bskip_chars_forward: |
| 855 /* This was wrong! --jwz */ | |
| 939 v1 = POP; | 856 v1 = POP; |
| 940 TOP = Fskip_chars_forward (TOP, v1); | 857 TOP = Fskip_chars_forward (TOP, v1); |
| 941 break; | 858 break; |
| 942 | 859 |
| 943 case Bskip_chars_backward: | 860 case Bskip_chars_backward: |
| 861 /* This was wrong! --jwz */ | |
| 944 v1 = POP; | 862 v1 = POP; |
| 945 TOP = Fskip_chars_backward (TOP, v1); | 863 TOP = Fskip_chars_backward (TOP, v1); |
| 946 break; | 864 break; |
| 947 | 865 |
| 948 case Bforward_line: | 866 case Bforward_line: |
| 867 /* This was wrong! --jwz */ | |
| 949 TOP = Fforward_line (TOP); | 868 TOP = Fforward_line (TOP); |
| 950 break; | 869 break; |
| 951 | 870 |
| 952 case Bchar_syntax: | 871 case Bchar_syntax: |
| 953 CHECK_NUMBER (TOP, 0); | 872 CHECK_NUMBER (TOP, 0); |
| 959 TOP = Fbuffer_substring (TOP, v1); | 878 TOP = Fbuffer_substring (TOP, v1); |
| 960 break; | 879 break; |
| 961 | 880 |
| 962 case Bdelete_region: | 881 case Bdelete_region: |
| 963 v1 = POP; | 882 v1 = POP; |
| 883 /* This had args in the wrong order. -- jwz */ | |
| 964 TOP = Fdelete_region (TOP, v1); | 884 TOP = Fdelete_region (TOP, v1); |
| 965 break; | 885 break; |
| 966 | 886 |
| 967 case Bnarrow_to_region: | 887 case Bnarrow_to_region: |
| 968 v1 = POP; | 888 v1 = POP; |
| 889 /* This had args in the wrong order. -- jwz */ | |
| 969 TOP = Fnarrow_to_region (TOP, v1); | 890 TOP = Fnarrow_to_region (TOP, v1); |
| 970 break; | 891 break; |
| 971 | 892 |
| 972 case Bwiden: | 893 case Bwiden: |
| 973 PUSH (Fwiden ()); | 894 PUSH (Fwiden ()); |
| 974 break; | 895 break; |
| 975 | 896 |
| 976 case Bend_of_line: | |
| 977 TOP = Fend_of_line (TOP); | |
| 978 break; | |
| 979 | |
| 980 case Bset_marker: | |
| 981 v1 = POP; | |
| 982 v2 = POP; | |
| 983 TOP = Fset_marker (TOP, v2, v1); | |
| 984 break; | |
| 985 | |
| 986 case Bmatch_beginning: | |
| 987 TOP = Fmatch_beginning (TOP); | |
| 988 break; | |
| 989 | |
| 990 case Bmatch_end: | |
| 991 TOP = Fmatch_end (TOP); | |
| 992 break; | |
| 993 | |
| 994 case Bupcase: | |
| 995 TOP = Fupcase (TOP); | |
| 996 break; | |
| 997 | |
| 998 case Bdowncase: | |
| 999 TOP = Fdowncase (TOP); | |
| 1000 break; | |
| 1001 | |
| 1002 case Bstringeqlsign: | 897 case Bstringeqlsign: |
| 1003 v1 = POP; | 898 v1 = POP; |
| 899 /* This had args in the wrong order. -- jwz */ | |
| 1004 TOP = Fstring_equal (TOP, v1); | 900 TOP = Fstring_equal (TOP, v1); |
| 1005 break; | 901 break; |
| 1006 | 902 |
| 1007 case Bstringlss: | 903 case Bstringlss: |
| 1008 v1 = POP; | 904 v1 = POP; |
| 905 /* This had args in the wrong order. -- jwz */ | |
| 1009 TOP = Fstring_lessp (TOP, v1); | 906 TOP = Fstring_lessp (TOP, v1); |
| 1010 break; | 907 break; |
| 1011 | 908 |
| 1012 case Bequal: | 909 case Bequal: |
| 1013 v1 = POP; | 910 v1 = POP; |
| 911 /* This had args in the wrong order. -- jwz */ | |
| 1014 TOP = Fequal (TOP, v1); | 912 TOP = Fequal (TOP, v1); |
| 1015 break; | 913 break; |
| 1016 | 914 |
| 1017 case Bnthcdr: | 915 case Bnthcdr: |
| 1018 v1 = POP; | 916 v1 = POP; |
| 917 /* This had args in the wrong order. -- jwz */ | |
| 1019 TOP = Fnthcdr (TOP, v1); | 918 TOP = Fnthcdr (TOP, v1); |
| 1020 break; | 919 break; |
| 1021 | 920 |
| 1022 case Belt: | 921 case Belt: |
| 1023 if (XTYPE (TOP) == Lisp_Cons) | 922 if (XTYPE (TOP) == Lisp_Cons) |
| 1031 TOP = Felt (TOP, v1); | 930 TOP = Felt (TOP, v1); |
| 1032 break; | 931 break; |
| 1033 | 932 |
| 1034 case Bmember: | 933 case Bmember: |
| 1035 v1 = POP; | 934 v1 = POP; |
| 935 /* This had args in the wrong order. -- jwz */ | |
| 1036 TOP = Fmember (TOP, v1); | 936 TOP = Fmember (TOP, v1); |
| 1037 break; | 937 break; |
| 1038 | 938 |
| 1039 case Bassq: | 939 case Bassq: |
| 1040 v1 = POP; | 940 v1 = POP; |
| 941 /* This had args in the wrong order. -- jwz */ | |
| 1041 TOP = Fassq (TOP, v1); | 942 TOP = Fassq (TOP, v1); |
| 1042 break; | 943 break; |
| 1043 | 944 |
| 1044 case Bnreverse: | 945 case Bnreverse: |
| 1045 TOP = Fnreverse (TOP); | 946 TOP = Fnreverse (TOP); |
| 1046 break; | 947 break; |
| 1047 | 948 |
| 1048 case Bsetcar: | 949 case Bsetcar: |
| 1049 v1 = POP; | 950 v1 = POP; |
| 951 /* This had args in the wrong order. -- jwz */ | |
| 1050 TOP = Fsetcar (TOP, v1); | 952 TOP = Fsetcar (TOP, v1); |
| 1051 break; | 953 break; |
| 1052 | 954 |
| 1053 case Bsetcdr: | 955 case Bsetcdr: |
| 1054 v1 = POP; | 956 v1 = POP; |
| 957 /* This had args in the wrong order. -- jwz */ | |
| 1055 TOP = Fsetcdr (TOP, v1); | 958 TOP = Fsetcdr (TOP, v1); |
| 1056 break; | 959 break; |
| 1057 | 960 |
| 1058 case Bcar_safe: | 961 case Bcar_safe: |
| 1059 v1 = TOP; | 962 v1 = TOP; |
| 1070 else | 973 else |
| 1071 TOP = Qnil; | 974 TOP = Qnil; |
| 1072 break; | 975 break; |
| 1073 | 976 |
| 1074 case Bnconc: | 977 case Bnconc: |
| 1075 DISCARD (1); | 978 DISCARD(1); |
| 1076 TOP = Fnconc (2, &TOP); | 979 TOP = Fnconc (2, &TOP); |
| 1077 break; | 980 break; |
| 1078 | 981 |
| 1079 case Bnumberp: | 982 case Bnumberp: |
| 1080 TOP = (NUMBERP (TOP) ? Qt : Qnil); | 983 TOP = (XTYPE (TOP) == Lisp_Int || XTYPE (TOP) == Lisp_Float |
| 984 ? Qt : Qnil); | |
| 1081 break; | 985 break; |
| 1082 | 986 |
| 1083 case Bintegerp: | 987 case Bintegerp: |
| 1084 TOP = XTYPE (TOP) == Lisp_Int ? Qt : Qnil; | 988 TOP = XTYPE (TOP) == Lisp_Int ? Qt : Qnil; |
| 1085 break; | 989 break; |
| 1090 break; | 994 break; |
| 1091 case Bscan_buffer: | 995 case Bscan_buffer: |
| 1092 error ("scan-buffer is an obsolete bytecode"); | 996 error ("scan-buffer is an obsolete bytecode"); |
| 1093 break; | 997 break; |
| 1094 case Bmark: | 998 case Bmark: |
| 1095 error ("mark is an obsolete bytecode"); | 999 error("mark is an obsolete bytecode"); |
| 1096 break; | 1000 break; |
| 1097 #endif | 1001 #endif |
| 1098 | 1002 |
| 1099 default: | 1003 default: |
| 1100 #ifdef BYTE_CODE_SAFE | 1004 #ifdef BYTE_CODE_SAFE |
| 1129 defsubr (&Sbyte_code); | 1033 defsubr (&Sbyte_code); |
| 1130 | 1034 |
| 1131 #ifdef BYTE_CODE_METER | 1035 #ifdef BYTE_CODE_METER |
| 1132 | 1036 |
| 1133 DEFVAR_LISP ("byte-code-meter", &Vbyte_code_meter, | 1037 DEFVAR_LISP ("byte-code-meter", &Vbyte_code_meter, |
| 1134 "A vector of vectors which holds a histogram of byte-code usage."); | 1038 "a vector of vectors which holds a histogram of byte-code usage."); |
| 1135 DEFVAR_BOOL ("byte-metering-on", &byte_metering_on, ""); | 1039 DEFVAR_BOOL ("byte-metering-on", &byte_metering_on, ""); |
| 1136 | 1040 |
| 1137 byte_metering_on = 0; | 1041 byte_metering_on = 0; |
| 1138 Vbyte_code_meter = Fmake_vector (make_number (256), make_number (0)); | 1042 Vbyte_code_meter = Fmake_vector(make_number(256), make_number(0)); |
| 1139 Qbyte_code_meter = intern ("byte-code-meter"); | 1043 |
| 1140 staticpro (&Qbyte_code_meter); | |
| 1141 { | 1044 { |
| 1142 int i = 256; | 1045 int i = 256; |
| 1143 while (i--) | 1046 while (i--) |
| 1144 XVECTOR (Vbyte_code_meter)->contents[i] = | 1047 XVECTOR(Vbyte_code_meter)->contents[i] = |
| 1145 Fmake_vector (make_number (256), make_number (0)); | 1048 Fmake_vector(make_number(256), make_number(0)); |
| 1146 } | 1049 } |
| 1147 #endif | 1050 #endif |
| 1148 } | 1051 } |
