diff options
| author | Paul Eggert | 2016-08-09 00:37:41 -0700 |
|---|---|---|
| committer | Paul Eggert | 2016-08-09 01:31:23 -0700 |
| commit | e09dc1112b1f209d8141fc847edf23bd9cfa5ae1 (patch) | |
| tree | 80adec2a76cf77ec0de6de512cf3312e13b1b2d4 /src/bytecode.c | |
| parent | 644fc17b9ae181174a842e3876e887666d505666 (diff) | |
| download | emacs-e09dc1112b1f209d8141fc847edf23bd9cfa5ae1.tar.gz emacs-e09dc1112b1f209d8141fc847edf23bd9cfa5ae1.zip | |
Simplify exec_byte_code via moving decls etc.
* src/bytecode.c (exec_byte_code): Simplify, mostly by moving
initializers into decls, and by omitting some unnecessary
changes to ‘top’. This improves performance a bit on x86-64,
as it happens.
Diffstat (limited to 'src/bytecode.c')
| -rw-r--r-- | src/bytecode.c | 438 |
1 files changed, 136 insertions, 302 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index 995d37c09d5..e2d8ab706c7 100644 --- a/src/bytecode.c +++ b/src/bytecode.c | |||
| @@ -337,25 +337,15 @@ Lisp_Object | |||
| 337 | exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | 337 | exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, |
| 338 | Lisp_Object args_template, ptrdiff_t nargs, Lisp_Object *args) | 338 | Lisp_Object args_template, ptrdiff_t nargs, Lisp_Object *args) |
| 339 | { | 339 | { |
| 340 | USE_SAFE_ALLOCA; | ||
| 341 | #ifdef BYTE_CODE_METER | 340 | #ifdef BYTE_CODE_METER |
| 342 | int volatile this_op = 0; | 341 | int volatile this_op = 0; |
| 343 | int prev_op; | ||
| 344 | #endif | 342 | #endif |
| 345 | int op; | ||
| 346 | /* Lisp_Object v1, v2; */ | ||
| 347 | Lisp_Object *vectorp; | ||
| 348 | ptrdiff_t const_length; | ||
| 349 | ptrdiff_t bytestr_length; | ||
| 350 | Lisp_Object *top; | ||
| 351 | Lisp_Object result; | ||
| 352 | enum handlertype type; | ||
| 353 | 343 | ||
| 354 | CHECK_STRING (bytestr); | 344 | CHECK_STRING (bytestr); |
| 355 | CHECK_VECTOR (vector); | 345 | CHECK_VECTOR (vector); |
| 356 | CHECK_NATNUM (maxdepth); | 346 | CHECK_NATNUM (maxdepth); |
| 357 | 347 | ||
| 358 | const_length = ASIZE (vector); | 348 | ptrdiff_t const_length = ASIZE (vector); |
| 359 | 349 | ||
| 360 | if (STRING_MULTIBYTE (bytestr)) | 350 | if (STRING_MULTIBYTE (bytestr)) |
| 361 | /* BYTESTR must have been produced by Emacs 20.2 or the earlier | 351 | /* BYTESTR must have been produced by Emacs 20.2 or the earlier |
| @@ -365,15 +355,16 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 365 | convert them back to the originally intended unibyte form. */ | 355 | convert them back to the originally intended unibyte form. */ |
| 366 | bytestr = Fstring_as_unibyte (bytestr); | 356 | bytestr = Fstring_as_unibyte (bytestr); |
| 367 | 357 | ||
| 368 | bytestr_length = SBYTES (bytestr); | 358 | ptrdiff_t bytestr_length = SBYTES (bytestr); |
| 369 | vectorp = XVECTOR (vector)->contents; | 359 | Lisp_Object *vectorp = XVECTOR (vector)->contents; |
| 370 | 360 | ||
| 371 | unsigned char quitcounter = 1; | 361 | unsigned char quitcounter = 1; |
| 372 | EMACS_INT stack_items = XFASTINT (maxdepth) + 1; | 362 | EMACS_INT stack_items = XFASTINT (maxdepth) + 1; |
| 363 | USE_SAFE_ALLOCA; | ||
| 373 | Lisp_Object *stack_base; | 364 | Lisp_Object *stack_base; |
| 374 | SAFE_ALLOCA_LISP_EXTRA (stack_base, stack_items, bytestr_length); | 365 | SAFE_ALLOCA_LISP_EXTRA (stack_base, stack_items, bytestr_length); |
| 375 | Lisp_Object *stack_lim = stack_base + stack_items; | 366 | Lisp_Object *stack_lim = stack_base + stack_items; |
| 376 | top = stack_base; | 367 | Lisp_Object *top = stack_base; |
| 377 | memcpy (stack_lim, SDATA (bytestr), bytestr_length); | 368 | memcpy (stack_lim, SDATA (bytestr), bytestr_length); |
| 378 | void *void_stack_lim = stack_lim; | 369 | void *void_stack_lim = stack_lim; |
| 379 | unsigned char const *bytestr_data = void_stack_lim; | 370 | unsigned char const *bytestr_data = void_stack_lim; |
| @@ -402,20 +393,21 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 402 | PUSH (Qnil); | 393 | PUSH (Qnil); |
| 403 | } | 394 | } |
| 404 | 395 | ||
| 405 | while (1) | 396 | while (true) |
| 406 | { | 397 | { |
| 398 | int op; | ||
| 399 | enum handlertype type; | ||
| 400 | |||
| 407 | if (BYTE_CODE_SAFE && ! (stack_base <= top && top < stack_lim)) | 401 | if (BYTE_CODE_SAFE && ! (stack_base <= top && top < stack_lim)) |
| 408 | emacs_abort (); | 402 | emacs_abort (); |
| 409 | 403 | ||
| 410 | #ifdef BYTE_CODE_METER | 404 | #ifdef BYTE_CODE_METER |
| 411 | prev_op = this_op; | 405 | int prev_op = this_op; |
| 412 | this_op = op = FETCH; | 406 | this_op = op = FETCH; |
| 413 | METER_CODE (prev_op, op); | 407 | METER_CODE (prev_op, op); |
| 414 | #else | 408 | #elif !defined BYTE_CODE_THREADED |
| 415 | #ifndef BYTE_CODE_THREADED | ||
| 416 | op = FETCH; | 409 | op = FETCH; |
| 417 | #endif | 410 | #endif |
| 418 | #endif | ||
| 419 | 411 | ||
| 420 | /* The interpreter can be compiled one of two ways: as an | 412 | /* The interpreter can be compiled one of two ways: as an |
| 421 | ordinary switch-based interpreter, or as a threaded | 413 | ordinary switch-based interpreter, or as a threaded |
| @@ -496,7 +488,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 496 | CASE (Bvarref3): | 488 | CASE (Bvarref3): |
| 497 | CASE (Bvarref4): | 489 | CASE (Bvarref4): |
| 498 | CASE (Bvarref5): | 490 | CASE (Bvarref5): |
| 499 | op = op - Bvarref; | 491 | op -= Bvarref; |
| 500 | goto varref; | 492 | goto varref; |
| 501 | 493 | ||
| 502 | /* This seems to be the most frequently executed byte-code | 494 | /* This seems to be the most frequently executed byte-code |
| @@ -505,79 +497,51 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 505 | op = FETCH; | 497 | op = FETCH; |
| 506 | varref: | 498 | varref: |
| 507 | { | 499 | { |
| 508 | Lisp_Object v1, v2; | 500 | Lisp_Object v1 = vectorp[op], v2; |
| 509 | 501 | if (!SYMBOLP (v1) | |
| 510 | v1 = vectorp[op]; | 502 | || XSYMBOL (v1)->redirect != SYMBOL_PLAINVAL |
| 511 | if (SYMBOLP (v1)) | 503 | || (v2 = SYMBOL_VAL (XSYMBOL (v1)), EQ (v2, Qunbound))) |
| 512 | { | 504 | v2 = Fsymbol_value (v1); |
| 513 | if (XSYMBOL (v1)->redirect != SYMBOL_PLAINVAL | ||
| 514 | || (v2 = SYMBOL_VAL (XSYMBOL (v1)), | ||
| 515 | EQ (v2, Qunbound))) | ||
| 516 | { | ||
| 517 | v2 = Fsymbol_value (v1); | ||
| 518 | } | ||
| 519 | } | ||
| 520 | else | ||
| 521 | { | ||
| 522 | v2 = Fsymbol_value (v1); | ||
| 523 | } | ||
| 524 | PUSH (v2); | 505 | PUSH (v2); |
| 525 | NEXT; | 506 | NEXT; |
| 526 | } | 507 | } |
| 527 | 508 | ||
| 528 | CASE (Bgotoifnil): | 509 | CASE (Bgotoifnil): |
| 529 | { | 510 | { |
| 530 | Lisp_Object v1; | 511 | Lisp_Object v1 = POP; |
| 531 | op = FETCH2; | 512 | op = FETCH2; |
| 532 | v1 = POP; | ||
| 533 | if (NILP (v1)) | 513 | if (NILP (v1)) |
| 534 | goto op_branch; | 514 | goto op_branch; |
| 535 | NEXT; | 515 | NEXT; |
| 536 | } | 516 | } |
| 537 | 517 | ||
| 538 | CASE (Bcar): | 518 | CASE (Bcar): |
| 539 | { | 519 | if (CONSP (TOP)) |
| 540 | Lisp_Object v1; | 520 | TOP = XCAR (TOP); |
| 541 | v1 = TOP; | 521 | else if (!NILP (TOP)) |
| 542 | if (CONSP (v1)) | 522 | wrong_type_argument (Qlistp, TOP); |
| 543 | TOP = XCAR (v1); | 523 | NEXT; |
| 544 | else if (NILP (v1)) | ||
| 545 | TOP = Qnil; | ||
| 546 | else | ||
| 547 | { | ||
| 548 | wrong_type_argument (Qlistp, v1); | ||
| 549 | } | ||
| 550 | NEXT; | ||
| 551 | } | ||
| 552 | 524 | ||
| 553 | CASE (Beq): | 525 | CASE (Beq): |
| 554 | { | 526 | { |
| 555 | Lisp_Object v1; | 527 | Lisp_Object v1 = POP; |
| 556 | v1 = POP; | ||
| 557 | TOP = EQ (v1, TOP) ? Qt : Qnil; | 528 | TOP = EQ (v1, TOP) ? Qt : Qnil; |
| 558 | NEXT; | 529 | NEXT; |
| 559 | } | 530 | } |
| 560 | 531 | ||
| 561 | CASE (Bmemq): | 532 | CASE (Bmemq): |
| 562 | { | 533 | { |
| 563 | Lisp_Object v1; | 534 | Lisp_Object v1 = POP; |
| 564 | v1 = POP; | ||
| 565 | TOP = Fmemq (TOP, v1); | 535 | TOP = Fmemq (TOP, v1); |
| 566 | NEXT; | 536 | NEXT; |
| 567 | } | 537 | } |
| 568 | 538 | ||
| 569 | CASE (Bcdr): | 539 | CASE (Bcdr): |
| 570 | { | 540 | { |
| 571 | Lisp_Object v1; | 541 | if (CONSP (TOP)) |
| 572 | v1 = TOP; | 542 | TOP = XCDR (TOP); |
| 573 | if (CONSP (v1)) | 543 | else if (!NILP (TOP)) |
| 574 | TOP = XCDR (v1); | 544 | wrong_type_argument (Qlistp, TOP); |
| 575 | else if (NILP (v1)) | ||
| 576 | TOP = Qnil; | ||
| 577 | else | ||
| 578 | { | ||
| 579 | wrong_type_argument (Qlistp, v1); | ||
| 580 | } | ||
| 581 | NEXT; | 545 | NEXT; |
| 582 | } | 546 | } |
| 583 | 547 | ||
| @@ -598,10 +562,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 598 | op = FETCH; | 562 | op = FETCH; |
| 599 | varset: | 563 | varset: |
| 600 | { | 564 | { |
| 601 | Lisp_Object sym, val; | 565 | Lisp_Object sym = vectorp[op]; |
| 602 | 566 | Lisp_Object val = POP; | |
| 603 | sym = vectorp[op]; | ||
| 604 | val = TOP; | ||
| 605 | 567 | ||
| 606 | /* Inline the most common case. */ | 568 | /* Inline the most common case. */ |
| 607 | if (SYMBOLP (sym) | 569 | if (SYMBOLP (sym) |
| @@ -610,17 +572,13 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 610 | && !SYMBOL_CONSTANT_P (sym)) | 572 | && !SYMBOL_CONSTANT_P (sym)) |
| 611 | SET_SYMBOL_VAL (XSYMBOL (sym), val); | 573 | SET_SYMBOL_VAL (XSYMBOL (sym), val); |
| 612 | else | 574 | else |
| 613 | { | 575 | set_internal (sym, val, Qnil, false); |
| 614 | set_internal (sym, val, Qnil, 0); | ||
| 615 | } | ||
| 616 | } | 576 | } |
| 617 | (void) POP; | ||
| 618 | NEXT; | 577 | NEXT; |
| 619 | 578 | ||
| 620 | CASE (Bdup): | 579 | CASE (Bdup): |
| 621 | { | 580 | { |
| 622 | Lisp_Object v1; | 581 | Lisp_Object v1 = TOP; |
| 623 | v1 = TOP; | ||
| 624 | PUSH (v1); | 582 | PUSH (v1); |
| 625 | NEXT; | 583 | NEXT; |
| 626 | } | 584 | } |
| @@ -668,10 +626,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 668 | #ifdef BYTE_CODE_METER | 626 | #ifdef BYTE_CODE_METER |
| 669 | if (byte_metering_on && SYMBOLP (TOP)) | 627 | if (byte_metering_on && SYMBOLP (TOP)) |
| 670 | { | 628 | { |
| 671 | Lisp_Object v1, v2; | 629 | Lisp_Object v1 = TOP; |
| 672 | 630 | Lisp_Object v2 = Fget (v1, Qbyte_code_meter); | |
| 673 | v1 = TOP; | ||
| 674 | v2 = Fget (v1, Qbyte_code_meter); | ||
| 675 | if (INTEGERP (v2) | 631 | if (INTEGERP (v2) |
| 676 | && XINT (v2) < MOST_POSITIVE_FIXNUM) | 632 | && XINT (v2) < MOST_POSITIVE_FIXNUM) |
| 677 | { | 633 | { |
| @@ -729,14 +685,10 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 729 | NEXT; | 685 | NEXT; |
| 730 | 686 | ||
| 731 | CASE (Bgotoifnonnil): | 687 | CASE (Bgotoifnonnil): |
| 732 | { | 688 | op = FETCH2; |
| 733 | Lisp_Object v1; | 689 | if (!NILP (POP)) |
| 734 | op = FETCH2; | 690 | goto op_branch; |
| 735 | v1 = POP; | 691 | NEXT; |
| 736 | if (!NILP (v1)) | ||
| 737 | goto op_branch; | ||
| 738 | NEXT; | ||
| 739 | } | ||
| 740 | 692 | ||
| 741 | CASE (Bgotoifnilelsepop): | 693 | CASE (Bgotoifnilelsepop): |
| 742 | op = FETCH2; | 694 | op = FETCH2; |
| @@ -757,24 +709,16 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 757 | goto op_relative_branch; | 709 | goto op_relative_branch; |
| 758 | 710 | ||
| 759 | CASE (BRgotoifnil): | 711 | CASE (BRgotoifnil): |
| 760 | { | 712 | op = FETCH - 128; |
| 761 | Lisp_Object v1; | 713 | if (NILP (POP)) |
| 762 | v1 = POP; | 714 | goto op_relative_branch; |
| 763 | op = FETCH - 128; | 715 | NEXT; |
| 764 | if (NILP (v1)) | ||
| 765 | goto op_relative_branch; | ||
| 766 | NEXT; | ||
| 767 | } | ||
| 768 | 716 | ||
| 769 | CASE (BRgotoifnonnil): | 717 | CASE (BRgotoifnonnil): |
| 770 | { | 718 | op = FETCH - 128; |
| 771 | Lisp_Object v1; | 719 | if (!NILP (POP)) |
| 772 | v1 = POP; | 720 | goto op_relative_branch; |
| 773 | op = FETCH - 128; | 721 | NEXT; |
| 774 | if (!NILP (v1)) | ||
| 775 | goto op_relative_branch; | ||
| 776 | NEXT; | ||
| 777 | } | ||
| 778 | 722 | ||
| 779 | CASE (BRgotoifnilelsepop): | 723 | CASE (BRgotoifnilelsepop): |
| 780 | op = FETCH - 128; | 724 | op = FETCH - 128; |
| @@ -791,7 +735,6 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 791 | NEXT; | 735 | NEXT; |
| 792 | 736 | ||
| 793 | CASE (Breturn): | 737 | CASE (Breturn): |
| 794 | result = POP; | ||
| 795 | goto exit; | 738 | goto exit; |
| 796 | 739 | ||
| 797 | CASE (Bdiscard): | 740 | CASE (Bdiscard): |
| @@ -829,8 +772,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 829 | 772 | ||
| 830 | CASE (Bcatch): /* Obsolete since 24.4. */ | 773 | CASE (Bcatch): /* Obsolete since 24.4. */ |
| 831 | { | 774 | { |
| 832 | Lisp_Object v1; | 775 | Lisp_Object v1 = POP; |
| 833 | v1 = POP; | ||
| 834 | TOP = internal_catch (TOP, eval_sub, v1); | 776 | TOP = internal_catch (TOP, eval_sub, v1); |
| 835 | NEXT; | 777 | NEXT; |
| 836 | } | 778 | } |
| @@ -842,11 +784,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 842 | type = CONDITION_CASE; | 784 | type = CONDITION_CASE; |
| 843 | pushhandler: | 785 | pushhandler: |
| 844 | { | 786 | { |
| 845 | Lisp_Object tag = POP; | 787 | struct handler *c = push_handler (POP, type); |
| 846 | int dest = FETCH2; | 788 | c->bytecode_dest = FETCH2; |
| 847 | |||
| 848 | struct handler *c = push_handler (tag, type); | ||
| 849 | c->bytecode_dest = dest; | ||
| 850 | c->bytecode_top = top; | 789 | c->bytecode_top = top; |
| 851 | 790 | ||
| 852 | if (sys_setjmp (c->jmp)) | 791 | if (sys_setjmp (c->jmp)) |
| @@ -863,26 +802,22 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 863 | } | 802 | } |
| 864 | 803 | ||
| 865 | CASE (Bpophandler): /* New in 24.4. */ | 804 | CASE (Bpophandler): /* New in 24.4. */ |
| 866 | { | 805 | handlerlist = handlerlist->next; |
| 867 | handlerlist = handlerlist->next; | 806 | NEXT; |
| 868 | NEXT; | ||
| 869 | } | ||
| 870 | 807 | ||
| 871 | CASE (Bunwind_protect): /* FIXME: avoid closure for lexbind. */ | 808 | CASE (Bunwind_protect): /* FIXME: avoid closure for lexbind. */ |
| 872 | { | 809 | { |
| 873 | Lisp_Object handler = POP; | 810 | Lisp_Object handler = POP; |
| 874 | /* Support for a function here is new in 24.4. */ | 811 | /* Support for a function here is new in 24.4. */ |
| 875 | record_unwind_protect (NILP (Ffunctionp (handler)) | 812 | record_unwind_protect ((NILP (Ffunctionp (handler)) |
| 876 | ? unwind_body : bcall0, | 813 | ? unwind_body : bcall0), |
| 877 | handler); | 814 | handler); |
| 878 | NEXT; | 815 | NEXT; |
| 879 | } | 816 | } |
| 880 | 817 | ||
| 881 | CASE (Bcondition_case): /* Obsolete since 24.4. */ | 818 | CASE (Bcondition_case): /* Obsolete since 24.4. */ |
| 882 | { | 819 | { |
| 883 | Lisp_Object handlers, body; | 820 | Lisp_Object handlers = POP, body = POP; |
| 884 | handlers = POP; | ||
| 885 | body = POP; | ||
| 886 | TOP = internal_lisp_condition_case (TOP, body, handlers); | 821 | TOP = internal_lisp_condition_case (TOP, body, handlers); |
| 887 | NEXT; | 822 | NEXT; |
| 888 | } | 823 | } |
| @@ -895,8 +830,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 895 | 830 | ||
| 896 | CASE (Btemp_output_buffer_show): /* Obsolete since 24.1. */ | 831 | CASE (Btemp_output_buffer_show): /* Obsolete since 24.1. */ |
| 897 | { | 832 | { |
| 898 | Lisp_Object v1; | 833 | Lisp_Object v1 = POP; |
| 899 | v1 = POP; | ||
| 900 | temp_output_buffer_show (TOP); | 834 | temp_output_buffer_show (TOP); |
| 901 | TOP = v1; | 835 | TOP = v1; |
| 902 | /* pop binding of standard-output */ | 836 | /* pop binding of standard-output */ |
| @@ -906,17 +840,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 906 | 840 | ||
| 907 | CASE (Bnth): | 841 | CASE (Bnth): |
| 908 | { | 842 | { |
| 909 | Lisp_Object v1, v2; | 843 | Lisp_Object v2 = POP, v1 = TOP; |
| 910 | EMACS_INT n; | 844 | CHECK_NUMBER (v1); |
| 911 | v1 = POP; | 845 | EMACS_INT n = XINT (v1); |
| 912 | v2 = TOP; | 846 | immediate_quit = true; |
| 913 | CHECK_NUMBER (v2); | 847 | while (--n >= 0 && CONSP (v2)) |
| 914 | n = XINT (v2); | 848 | v2 = XCDR (v2); |
| 915 | immediate_quit = 1; | 849 | immediate_quit = false; |
| 916 | while (--n >= 0 && CONSP (v1)) | 850 | TOP = CAR (v2); |
| 917 | v1 = XCDR (v1); | ||
| 918 | immediate_quit = 0; | ||
| 919 | TOP = CAR (v1); | ||
| 920 | NEXT; | 851 | NEXT; |
| 921 | } | 852 | } |
| 922 | 853 | ||
| @@ -942,8 +873,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 942 | 873 | ||
| 943 | CASE (Bcons): | 874 | CASE (Bcons): |
| 944 | { | 875 | { |
| 945 | Lisp_Object v1; | 876 | Lisp_Object v1 = POP; |
| 946 | v1 = POP; | ||
| 947 | TOP = Fcons (TOP, v1); | 877 | TOP = Fcons (TOP, v1); |
| 948 | NEXT; | 878 | NEXT; |
| 949 | } | 879 | } |
| @@ -954,8 +884,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 954 | 884 | ||
| 955 | CASE (Blist2): | 885 | CASE (Blist2): |
| 956 | { | 886 | { |
| 957 | Lisp_Object v1; | 887 | Lisp_Object v1 = POP; |
| 958 | v1 = POP; | ||
| 959 | TOP = list2 (TOP, v1); | 888 | TOP = list2 (TOP, v1); |
| 960 | NEXT; | 889 | NEXT; |
| 961 | } | 890 | } |
| @@ -982,16 +911,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 982 | 911 | ||
| 983 | CASE (Baref): | 912 | CASE (Baref): |
| 984 | { | 913 | { |
| 985 | Lisp_Object v1; | 914 | Lisp_Object v1 = POP; |
| 986 | v1 = POP; | ||
| 987 | TOP = Faref (TOP, v1); | 915 | TOP = Faref (TOP, v1); |
| 988 | NEXT; | 916 | NEXT; |
| 989 | } | 917 | } |
| 990 | 918 | ||
| 991 | CASE (Baset): | 919 | CASE (Baset): |
| 992 | { | 920 | { |
| 993 | Lisp_Object v1, v2; | 921 | Lisp_Object v2 = POP, v1 = POP; |
| 994 | v2 = POP; v1 = POP; | ||
| 995 | TOP = Faset (TOP, v1, v2); | 922 | TOP = Faset (TOP, v1, v2); |
| 996 | NEXT; | 923 | NEXT; |
| 997 | } | 924 | } |
| @@ -1006,32 +933,28 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1006 | 933 | ||
| 1007 | CASE (Bset): | 934 | CASE (Bset): |
| 1008 | { | 935 | { |
| 1009 | Lisp_Object v1; | 936 | Lisp_Object v1 = POP; |
| 1010 | v1 = POP; | ||
| 1011 | TOP = Fset (TOP, v1); | 937 | TOP = Fset (TOP, v1); |
| 1012 | NEXT; | 938 | NEXT; |
| 1013 | } | 939 | } |
| 1014 | 940 | ||
| 1015 | CASE (Bfset): | 941 | CASE (Bfset): |
| 1016 | { | 942 | { |
| 1017 | Lisp_Object v1; | 943 | Lisp_Object v1 = POP; |
| 1018 | v1 = POP; | ||
| 1019 | TOP = Ffset (TOP, v1); | 944 | TOP = Ffset (TOP, v1); |
| 1020 | NEXT; | 945 | NEXT; |
| 1021 | } | 946 | } |
| 1022 | 947 | ||
| 1023 | CASE (Bget): | 948 | CASE (Bget): |
| 1024 | { | 949 | { |
| 1025 | Lisp_Object v1; | 950 | Lisp_Object v1 = POP; |
| 1026 | v1 = POP; | ||
| 1027 | TOP = Fget (TOP, v1); | 951 | TOP = Fget (TOP, v1); |
| 1028 | NEXT; | 952 | NEXT; |
| 1029 | } | 953 | } |
| 1030 | 954 | ||
| 1031 | CASE (Bsubstring): | 955 | CASE (Bsubstring): |
| 1032 | { | 956 | { |
| 1033 | Lisp_Object v1, v2; | 957 | Lisp_Object v2 = POP, v1 = POP; |
| 1034 | v2 = POP; v1 = POP; | ||
| 1035 | TOP = Fsubstring (TOP, v1, v2); | 958 | TOP = Fsubstring (TOP, v1, v2); |
| 1036 | NEXT; | 959 | NEXT; |
| 1037 | } | 960 | } |
| @@ -1058,84 +981,55 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1058 | NEXT; | 981 | NEXT; |
| 1059 | 982 | ||
| 1060 | CASE (Bsub1): | 983 | CASE (Bsub1): |
| 1061 | { | 984 | TOP = INTEGERP (TOP) ? make_number (XINT (TOP) - 1) : Fsub1 (TOP); |
| 1062 | Lisp_Object v1; | 985 | NEXT; |
| 1063 | v1 = TOP; | ||
| 1064 | if (INTEGERP (v1)) | ||
| 1065 | { | ||
| 1066 | XSETINT (v1, XINT (v1) - 1); | ||
| 1067 | TOP = v1; | ||
| 1068 | } | ||
| 1069 | else | ||
| 1070 | { | ||
| 1071 | TOP = Fsub1 (v1); | ||
| 1072 | } | ||
| 1073 | NEXT; | ||
| 1074 | } | ||
| 1075 | 986 | ||
| 1076 | CASE (Badd1): | 987 | CASE (Badd1): |
| 1077 | { | 988 | TOP = INTEGERP (TOP) ? make_number (XINT (TOP) + 1) : Fadd1 (TOP); |
| 1078 | Lisp_Object v1; | 989 | NEXT; |
| 1079 | v1 = TOP; | ||
| 1080 | if (INTEGERP (v1)) | ||
| 1081 | { | ||
| 1082 | XSETINT (v1, XINT (v1) + 1); | ||
| 1083 | TOP = v1; | ||
| 1084 | } | ||
| 1085 | else | ||
| 1086 | { | ||
| 1087 | TOP = Fadd1 (v1); | ||
| 1088 | } | ||
| 1089 | NEXT; | ||
| 1090 | } | ||
| 1091 | 990 | ||
| 1092 | CASE (Beqlsign): | 991 | CASE (Beqlsign): |
| 1093 | { | 992 | { |
| 1094 | Lisp_Object v1, v2; | 993 | Lisp_Object v2 = POP, v1 = TOP; |
| 1095 | v2 = POP; v1 = TOP; | ||
| 1096 | CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v1); | 994 | CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v1); |
| 1097 | CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v2); | 995 | CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v2); |
| 996 | bool equal; | ||
| 1098 | if (FLOATP (v1) || FLOATP (v2)) | 997 | if (FLOATP (v1) || FLOATP (v2)) |
| 1099 | { | 998 | { |
| 1100 | double f1, f2; | 999 | double f1 = FLOATP (v1) ? XFLOAT_DATA (v1) : XINT (v1); |
| 1101 | 1000 | double f2 = FLOATP (v2) ? XFLOAT_DATA (v2) : XINT (v2); | |
| 1102 | f1 = (FLOATP (v1) ? XFLOAT_DATA (v1) : XINT (v1)); | 1001 | equal = f1 == f2; |
| 1103 | f2 = (FLOATP (v2) ? XFLOAT_DATA (v2) : XINT (v2)); | ||
| 1104 | TOP = (f1 == f2 ? Qt : Qnil); | ||
| 1105 | } | 1002 | } |
| 1106 | else | 1003 | else |
| 1107 | TOP = (XINT (v1) == XINT (v2) ? Qt : Qnil); | 1004 | equal = XINT (v1) == XINT (v2); |
| 1005 | TOP = equal ? Qt : Qnil; | ||
| 1108 | NEXT; | 1006 | NEXT; |
| 1109 | } | 1007 | } |
| 1110 | 1008 | ||
| 1111 | CASE (Bgtr): | 1009 | CASE (Bgtr): |
| 1112 | { | 1010 | { |
| 1113 | Lisp_Object v1; | 1011 | Lisp_Object v1 = POP; |
| 1114 | v1 = POP; | ||
| 1115 | TOP = arithcompare (TOP, v1, ARITH_GRTR); | 1012 | TOP = arithcompare (TOP, v1, ARITH_GRTR); |
| 1116 | NEXT; | 1013 | NEXT; |
| 1117 | } | 1014 | } |
| 1118 | 1015 | ||
| 1119 | CASE (Blss): | 1016 | CASE (Blss): |
| 1120 | { | 1017 | { |
| 1121 | Lisp_Object v1; | 1018 | Lisp_Object v1 = POP; |
| 1122 | v1 = POP; | ||
| 1123 | TOP = arithcompare (TOP, v1, ARITH_LESS); | 1019 | TOP = arithcompare (TOP, v1, ARITH_LESS); |
| 1124 | NEXT; | 1020 | NEXT; |
| 1125 | } | 1021 | } |
| 1126 | 1022 | ||
| 1127 | CASE (Bleq): | 1023 | CASE (Bleq): |
| 1128 | { | 1024 | { |
| 1129 | Lisp_Object v1; | 1025 | Lisp_Object v1 = POP; |
| 1130 | v1 = POP; | ||
| 1131 | TOP = arithcompare (TOP, v1, ARITH_LESS_OR_EQUAL); | 1026 | TOP = arithcompare (TOP, v1, ARITH_LESS_OR_EQUAL); |
| 1132 | NEXT; | 1027 | NEXT; |
| 1133 | } | 1028 | } |
| 1134 | 1029 | ||
| 1135 | CASE (Bgeq): | 1030 | CASE (Bgeq): |
| 1136 | { | 1031 | { |
| 1137 | Lisp_Object v1; | 1032 | Lisp_Object v1 = POP; |
| 1138 | v1 = POP; | ||
| 1139 | TOP = arithcompare (TOP, v1, ARITH_GRTR_OR_EQUAL); | 1033 | TOP = arithcompare (TOP, v1, ARITH_GRTR_OR_EQUAL); |
| 1140 | NEXT; | 1034 | NEXT; |
| 1141 | } | 1035 | } |
| @@ -1146,20 +1040,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1146 | NEXT; | 1040 | NEXT; |
| 1147 | 1041 | ||
| 1148 | CASE (Bnegate): | 1042 | CASE (Bnegate): |
| 1149 | { | 1043 | TOP = INTEGERP (TOP) ? make_number (- XINT (TOP)) : Fminus (1, &TOP); |
| 1150 | Lisp_Object v1; | 1044 | NEXT; |
| 1151 | v1 = TOP; | ||
| 1152 | if (INTEGERP (v1)) | ||
| 1153 | { | ||
| 1154 | XSETINT (v1, - XINT (v1)); | ||
| 1155 | TOP = v1; | ||
| 1156 | } | ||
| 1157 | else | ||
| 1158 | { | ||
| 1159 | TOP = Fminus (1, &TOP); | ||
| 1160 | } | ||
| 1161 | NEXT; | ||
| 1162 | } | ||
| 1163 | 1045 | ||
| 1164 | CASE (Bplus): | 1046 | CASE (Bplus): |
| 1165 | DISCARD (1); | 1047 | DISCARD (1); |
| @@ -1188,19 +1070,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1188 | 1070 | ||
| 1189 | CASE (Brem): | 1071 | CASE (Brem): |
| 1190 | { | 1072 | { |
| 1191 | Lisp_Object v1; | 1073 | Lisp_Object v1 = POP; |
| 1192 | v1 = POP; | ||
| 1193 | TOP = Frem (TOP, v1); | 1074 | TOP = Frem (TOP, v1); |
| 1194 | NEXT; | 1075 | NEXT; |
| 1195 | } | 1076 | } |
| 1196 | 1077 | ||
| 1197 | CASE (Bpoint): | 1078 | CASE (Bpoint): |
| 1198 | { | 1079 | PUSH (make_natnum (PT)); |
| 1199 | Lisp_Object v1; | 1080 | NEXT; |
| 1200 | XSETFASTINT (v1, PT); | ||
| 1201 | PUSH (v1); | ||
| 1202 | NEXT; | ||
| 1203 | } | ||
| 1204 | 1081 | ||
| 1205 | CASE (Bgoto_char): | 1082 | CASE (Bgoto_char): |
| 1206 | TOP = Fgoto_char (TOP); | 1083 | TOP = Fgoto_char (TOP); |
| @@ -1225,40 +1102,24 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1225 | } | 1102 | } |
| 1226 | 1103 | ||
| 1227 | CASE (Bpoint_min): | 1104 | CASE (Bpoint_min): |
| 1228 | { | 1105 | PUSH (make_natnum (BEGV)); |
| 1229 | Lisp_Object v1; | 1106 | NEXT; |
| 1230 | XSETFASTINT (v1, BEGV); | ||
| 1231 | PUSH (v1); | ||
| 1232 | NEXT; | ||
| 1233 | } | ||
| 1234 | 1107 | ||
| 1235 | CASE (Bchar_after): | 1108 | CASE (Bchar_after): |
| 1236 | TOP = Fchar_after (TOP); | 1109 | TOP = Fchar_after (TOP); |
| 1237 | NEXT; | 1110 | NEXT; |
| 1238 | 1111 | ||
| 1239 | CASE (Bfollowing_char): | 1112 | CASE (Bfollowing_char): |
| 1240 | { | 1113 | PUSH (Ffollowing_char ()); |
| 1241 | Lisp_Object v1; | 1114 | NEXT; |
| 1242 | v1 = Ffollowing_char (); | ||
| 1243 | PUSH (v1); | ||
| 1244 | NEXT; | ||
| 1245 | } | ||
| 1246 | 1115 | ||
| 1247 | CASE (Bpreceding_char): | 1116 | CASE (Bpreceding_char): |
| 1248 | { | 1117 | PUSH (Fprevious_char ()); |
| 1249 | Lisp_Object v1; | 1118 | NEXT; |
| 1250 | v1 = Fprevious_char (); | ||
| 1251 | PUSH (v1); | ||
| 1252 | NEXT; | ||
| 1253 | } | ||
| 1254 | 1119 | ||
| 1255 | CASE (Bcurrent_column): | 1120 | CASE (Bcurrent_column): |
| 1256 | { | 1121 | PUSH (make_natnum (current_column ())); |
| 1257 | Lisp_Object v1; | 1122 | NEXT; |
| 1258 | XSETFASTINT (v1, current_column ()); | ||
| 1259 | PUSH (v1); | ||
| 1260 | NEXT; | ||
| 1261 | } | ||
| 1262 | 1123 | ||
| 1263 | CASE (Bindent_to): | 1124 | CASE (Bindent_to): |
| 1264 | TOP = Findent_to (TOP, Qnil); | 1125 | TOP = Findent_to (TOP, Qnil); |
| @@ -1302,16 +1163,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1302 | 1163 | ||
| 1303 | CASE (Bskip_chars_forward): | 1164 | CASE (Bskip_chars_forward): |
| 1304 | { | 1165 | { |
| 1305 | Lisp_Object v1; | 1166 | Lisp_Object v1 = POP; |
| 1306 | v1 = POP; | ||
| 1307 | TOP = Fskip_chars_forward (TOP, v1); | 1167 | TOP = Fskip_chars_forward (TOP, v1); |
| 1308 | NEXT; | 1168 | NEXT; |
| 1309 | } | 1169 | } |
| 1310 | 1170 | ||
| 1311 | CASE (Bskip_chars_backward): | 1171 | CASE (Bskip_chars_backward): |
| 1312 | { | 1172 | { |
| 1313 | Lisp_Object v1; | 1173 | Lisp_Object v1 = POP; |
| 1314 | v1 = POP; | ||
| 1315 | TOP = Fskip_chars_backward (TOP, v1); | 1174 | TOP = Fskip_chars_backward (TOP, v1); |
| 1316 | NEXT; | 1175 | NEXT; |
| 1317 | } | 1176 | } |
| @@ -1322,10 +1181,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1322 | 1181 | ||
| 1323 | CASE (Bchar_syntax): | 1182 | CASE (Bchar_syntax): |
| 1324 | { | 1183 | { |
| 1325 | int c; | ||
| 1326 | |||
| 1327 | CHECK_CHARACTER (TOP); | 1184 | CHECK_CHARACTER (TOP); |
| 1328 | c = XFASTINT (TOP); | 1185 | int c = XFASTINT (TOP); |
| 1329 | if (NILP (BVAR (current_buffer, enable_multibyte_characters))) | 1186 | if (NILP (BVAR (current_buffer, enable_multibyte_characters))) |
| 1330 | MAKE_CHAR_MULTIBYTE (c); | 1187 | MAKE_CHAR_MULTIBYTE (c); |
| 1331 | XSETFASTINT (TOP, syntax_code_spec[SYNTAX (c)]); | 1188 | XSETFASTINT (TOP, syntax_code_spec[SYNTAX (c)]); |
| @@ -1334,24 +1191,21 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1334 | 1191 | ||
| 1335 | CASE (Bbuffer_substring): | 1192 | CASE (Bbuffer_substring): |
| 1336 | { | 1193 | { |
| 1337 | Lisp_Object v1; | 1194 | Lisp_Object v1 = POP; |
| 1338 | v1 = POP; | ||
| 1339 | TOP = Fbuffer_substring (TOP, v1); | 1195 | TOP = Fbuffer_substring (TOP, v1); |
| 1340 | NEXT; | 1196 | NEXT; |
| 1341 | } | 1197 | } |
| 1342 | 1198 | ||
| 1343 | CASE (Bdelete_region): | 1199 | CASE (Bdelete_region): |
| 1344 | { | 1200 | { |
| 1345 | Lisp_Object v1; | 1201 | Lisp_Object v1 = POP; |
| 1346 | v1 = POP; | ||
| 1347 | TOP = Fdelete_region (TOP, v1); | 1202 | TOP = Fdelete_region (TOP, v1); |
| 1348 | NEXT; | 1203 | NEXT; |
| 1349 | } | 1204 | } |
| 1350 | 1205 | ||
| 1351 | CASE (Bnarrow_to_region): | 1206 | CASE (Bnarrow_to_region): |
| 1352 | { | 1207 | { |
| 1353 | Lisp_Object v1; | 1208 | Lisp_Object v1 = POP; |
| 1354 | v1 = POP; | ||
| 1355 | TOP = Fnarrow_to_region (TOP, v1); | 1209 | TOP = Fnarrow_to_region (TOP, v1); |
| 1356 | NEXT; | 1210 | NEXT; |
| 1357 | } | 1211 | } |
| @@ -1366,10 +1220,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1366 | 1220 | ||
| 1367 | CASE (Bset_marker): | 1221 | CASE (Bset_marker): |
| 1368 | { | 1222 | { |
| 1369 | Lisp_Object v1, v2; | 1223 | Lisp_Object v2 = POP, v1 = POP; |
| 1370 | v1 = POP; | 1224 | TOP = Fset_marker (TOP, v1, v2); |
| 1371 | v2 = POP; | ||
| 1372 | TOP = Fset_marker (TOP, v2, v1); | ||
| 1373 | NEXT; | 1225 | NEXT; |
| 1374 | } | 1226 | } |
| 1375 | 1227 | ||
| @@ -1391,56 +1243,49 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1391 | 1243 | ||
| 1392 | CASE (Bstringeqlsign): | 1244 | CASE (Bstringeqlsign): |
| 1393 | { | 1245 | { |
| 1394 | Lisp_Object v1; | 1246 | Lisp_Object v1 = POP; |
| 1395 | v1 = POP; | ||
| 1396 | TOP = Fstring_equal (TOP, v1); | 1247 | TOP = Fstring_equal (TOP, v1); |
| 1397 | NEXT; | 1248 | NEXT; |
| 1398 | } | 1249 | } |
| 1399 | 1250 | ||
| 1400 | CASE (Bstringlss): | 1251 | CASE (Bstringlss): |
| 1401 | { | 1252 | { |
| 1402 | Lisp_Object v1; | 1253 | Lisp_Object v1 = POP; |
| 1403 | v1 = POP; | ||
| 1404 | TOP = Fstring_lessp (TOP, v1); | 1254 | TOP = Fstring_lessp (TOP, v1); |
| 1405 | NEXT; | 1255 | NEXT; |
| 1406 | } | 1256 | } |
| 1407 | 1257 | ||
| 1408 | CASE (Bequal): | 1258 | CASE (Bequal): |
| 1409 | { | 1259 | { |
| 1410 | Lisp_Object v1; | 1260 | Lisp_Object v1 = POP; |
| 1411 | v1 = POP; | ||
| 1412 | TOP = Fequal (TOP, v1); | 1261 | TOP = Fequal (TOP, v1); |
| 1413 | NEXT; | 1262 | NEXT; |
| 1414 | } | 1263 | } |
| 1415 | 1264 | ||
| 1416 | CASE (Bnthcdr): | 1265 | CASE (Bnthcdr): |
| 1417 | { | 1266 | { |
| 1418 | Lisp_Object v1; | 1267 | Lisp_Object v1 = POP; |
| 1419 | v1 = POP; | ||
| 1420 | TOP = Fnthcdr (TOP, v1); | 1268 | TOP = Fnthcdr (TOP, v1); |
| 1421 | NEXT; | 1269 | NEXT; |
| 1422 | } | 1270 | } |
| 1423 | 1271 | ||
| 1424 | CASE (Belt): | 1272 | CASE (Belt): |
| 1425 | { | 1273 | { |
| 1426 | Lisp_Object v1, v2; | ||
| 1427 | if (CONSP (TOP)) | 1274 | if (CONSP (TOP)) |
| 1428 | { | 1275 | { |
| 1429 | /* Exchange args and then do nth. */ | 1276 | /* Exchange args and then do nth. */ |
| 1430 | EMACS_INT n; | 1277 | Lisp_Object v2 = POP, v1 = TOP; |
| 1431 | v2 = POP; | ||
| 1432 | v1 = TOP; | ||
| 1433 | CHECK_NUMBER (v2); | 1278 | CHECK_NUMBER (v2); |
| 1434 | n = XINT (v2); | 1279 | EMACS_INT n = XINT (v2); |
| 1435 | immediate_quit = 1; | 1280 | immediate_quit = true; |
| 1436 | while (--n >= 0 && CONSP (v1)) | 1281 | while (--n >= 0 && CONSP (v1)) |
| 1437 | v1 = XCDR (v1); | 1282 | v1 = XCDR (v1); |
| 1438 | immediate_quit = 0; | 1283 | immediate_quit = false; |
| 1439 | TOP = CAR (v1); | 1284 | TOP = CAR (v1); |
| 1440 | } | 1285 | } |
| 1441 | else | 1286 | else |
| 1442 | { | 1287 | { |
| 1443 | v1 = POP; | 1288 | Lisp_Object v1 = POP; |
| 1444 | TOP = Felt (TOP, v1); | 1289 | TOP = Felt (TOP, v1); |
| 1445 | } | 1290 | } |
| 1446 | NEXT; | 1291 | NEXT; |
| @@ -1448,16 +1293,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1448 | 1293 | ||
| 1449 | CASE (Bmember): | 1294 | CASE (Bmember): |
| 1450 | { | 1295 | { |
| 1451 | Lisp_Object v1; | 1296 | Lisp_Object v1 = POP; |
| 1452 | v1 = POP; | ||
| 1453 | TOP = Fmember (TOP, v1); | 1297 | TOP = Fmember (TOP, v1); |
| 1454 | NEXT; | 1298 | NEXT; |
| 1455 | } | 1299 | } |
| 1456 | 1300 | ||
| 1457 | CASE (Bassq): | 1301 | CASE (Bassq): |
| 1458 | { | 1302 | { |
| 1459 | Lisp_Object v1; | 1303 | Lisp_Object v1 = POP; |
| 1460 | v1 = POP; | ||
| 1461 | TOP = Fassq (TOP, v1); | 1304 | TOP = Fassq (TOP, v1); |
| 1462 | NEXT; | 1305 | NEXT; |
| 1463 | } | 1306 | } |
| @@ -1468,35 +1311,25 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1468 | 1311 | ||
| 1469 | CASE (Bsetcar): | 1312 | CASE (Bsetcar): |
| 1470 | { | 1313 | { |
| 1471 | Lisp_Object v1; | 1314 | Lisp_Object v1 = POP; |
| 1472 | v1 = POP; | ||
| 1473 | TOP = Fsetcar (TOP, v1); | 1315 | TOP = Fsetcar (TOP, v1); |
| 1474 | NEXT; | 1316 | NEXT; |
| 1475 | } | 1317 | } |
| 1476 | 1318 | ||
| 1477 | CASE (Bsetcdr): | 1319 | CASE (Bsetcdr): |
| 1478 | { | 1320 | { |
| 1479 | Lisp_Object v1; | 1321 | Lisp_Object v1 = POP; |
| 1480 | v1 = POP; | ||
| 1481 | TOP = Fsetcdr (TOP, v1); | 1322 | TOP = Fsetcdr (TOP, v1); |
| 1482 | NEXT; | 1323 | NEXT; |
| 1483 | } | 1324 | } |
| 1484 | 1325 | ||
| 1485 | CASE (Bcar_safe): | 1326 | CASE (Bcar_safe): |
| 1486 | { | 1327 | TOP = CAR_SAFE (TOP); |
| 1487 | Lisp_Object v1; | 1328 | NEXT; |
| 1488 | v1 = TOP; | ||
| 1489 | TOP = CAR_SAFE (v1); | ||
| 1490 | NEXT; | ||
| 1491 | } | ||
| 1492 | 1329 | ||
| 1493 | CASE (Bcdr_safe): | 1330 | CASE (Bcdr_safe): |
| 1494 | { | 1331 | TOP = CDR_SAFE (TOP); |
| 1495 | Lisp_Object v1; | 1332 | NEXT; |
| 1496 | v1 = TOP; | ||
| 1497 | TOP = CDR_SAFE (v1); | ||
| 1498 | NEXT; | ||
| 1499 | } | ||
| 1500 | 1333 | ||
| 1501 | CASE (Bnconc): | 1334 | CASE (Bnconc): |
| 1502 | DISCARD (1); | 1335 | DISCARD (1); |
| @@ -1504,7 +1337,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1504 | NEXT; | 1337 | NEXT; |
| 1505 | 1338 | ||
| 1506 | CASE (Bnumberp): | 1339 | CASE (Bnumberp): |
| 1507 | TOP = (NUMBERP (TOP) ? Qt : Qnil); | 1340 | TOP = NUMBERP (TOP) ? Qt : Qnil; |
| 1508 | NEXT; | 1341 | NEXT; |
| 1509 | 1342 | ||
| 1510 | CASE (Bintegerp): | 1343 | CASE (Bintegerp): |
| @@ -1540,32 +1373,32 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1540 | CASE (Bstack_ref4): | 1373 | CASE (Bstack_ref4): |
| 1541 | CASE (Bstack_ref5): | 1374 | CASE (Bstack_ref5): |
| 1542 | { | 1375 | { |
| 1543 | Lisp_Object *ptr = top - (op - Bstack_ref); | 1376 | Lisp_Object v1 = top[Bstack_ref - op]; |
| 1544 | PUSH (*ptr); | 1377 | PUSH (v1); |
| 1545 | NEXT; | 1378 | NEXT; |
| 1546 | } | 1379 | } |
| 1547 | CASE (Bstack_ref6): | 1380 | CASE (Bstack_ref6): |
| 1548 | { | 1381 | { |
| 1549 | Lisp_Object *ptr = top - (FETCH); | 1382 | Lisp_Object v1 = top[- FETCH]; |
| 1550 | PUSH (*ptr); | 1383 | PUSH (v1); |
| 1551 | NEXT; | 1384 | NEXT; |
| 1552 | } | 1385 | } |
| 1553 | CASE (Bstack_ref7): | 1386 | CASE (Bstack_ref7): |
| 1554 | { | 1387 | { |
| 1555 | Lisp_Object *ptr = top - (FETCH2); | 1388 | Lisp_Object v1 = top[- FETCH2]; |
| 1556 | PUSH (*ptr); | 1389 | PUSH (v1); |
| 1557 | NEXT; | 1390 | NEXT; |
| 1558 | } | 1391 | } |
| 1559 | CASE (Bstack_set): | 1392 | CASE (Bstack_set): |
| 1560 | /* stack-set-0 = discard; stack-set-1 = discard-1-preserve-tos. */ | 1393 | /* stack-set-0 = discard; stack-set-1 = discard-1-preserve-tos. */ |
| 1561 | { | 1394 | { |
| 1562 | Lisp_Object *ptr = top - (FETCH); | 1395 | Lisp_Object *ptr = top - FETCH; |
| 1563 | *ptr = POP; | 1396 | *ptr = POP; |
| 1564 | NEXT; | 1397 | NEXT; |
| 1565 | } | 1398 | } |
| 1566 | CASE (Bstack_set2): | 1399 | CASE (Bstack_set2): |
| 1567 | { | 1400 | { |
| 1568 | Lisp_Object *ptr = top - (FETCH2); | 1401 | Lisp_Object *ptr = top - FETCH2; |
| 1569 | *ptr = POP; | 1402 | *ptr = POP; |
| 1570 | NEXT; | 1403 | NEXT; |
| 1571 | } | 1404 | } |
| @@ -1599,6 +1432,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1599 | error ("binding stack not balanced (serious byte compiler bug)"); | 1432 | error ("binding stack not balanced (serious byte compiler bug)"); |
| 1600 | } | 1433 | } |
| 1601 | 1434 | ||
| 1435 | Lisp_Object result = TOP; | ||
| 1602 | SAFE_FREE (); | 1436 | SAFE_FREE (); |
| 1603 | return result; | 1437 | return result; |
| 1604 | } | 1438 | } |
| @@ -1638,7 +1472,7 @@ The variable byte-code-meter indicates how often each byte opcode is used. | |||
| 1638 | If a symbol has a property named `byte-code-meter' whose value is an | 1472 | If a symbol has a property named `byte-code-meter' whose value is an |
| 1639 | integer, it is incremented each time that symbol's function is called. */); | 1473 | integer, it is incremented each time that symbol's function is called. */); |
| 1640 | 1474 | ||
| 1641 | byte_metering_on = 0; | 1475 | byte_metering_on = false; |
| 1642 | Vbyte_code_meter = Fmake_vector (make_number (256), make_number (0)); | 1476 | Vbyte_code_meter = Fmake_vector (make_number (256), make_number (0)); |
| 1643 | DEFSYM (Qbyte_code_meter, "byte-code-meter"); | 1477 | DEFSYM (Qbyte_code_meter, "byte-code-meter"); |
| 1644 | { | 1478 | { |