Mercurial > emacs
comparison src/bytecode.c @ 26380:97289ec4d7d0
* bytecode.c (Fbyte_code) <BinsertN, Bcall>: Do the
BEFORE_POTENTIAL_GC before DISCARD.
| author | Gerd Moellmann <gerd@gnu.org> |
|---|---|
| date | Mon, 08 Nov 1999 00:06:01 +0000 |
| parents | 6706cd0ece4d |
| children | d94d421ca521 |
comparison
equal
deleted
inserted
replaced
| 26379:cd8c8fcf2d73 | 26380:97289ec4d7d0 |
|---|---|
| 498 | 498 |
| 499 case Bcar: | 499 case Bcar: |
| 500 { | 500 { |
| 501 Lisp_Object v1; | 501 Lisp_Object v1; |
| 502 v1 = TOP; | 502 v1 = TOP; |
| 503 if (CONSP (v1)) TOP = XCAR (v1); | 503 if (CONSP (v1)) |
| 504 else if (NILP (v1)) TOP = Qnil; | 504 TOP = XCAR (v1); |
| 505 else Fcar (wrong_type_argument (Qlistp, v1)); | 505 else if (NILP (v1)) |
| 506 TOP = Qnil; | |
| 507 else | |
| 508 Fcar (wrong_type_argument (Qlistp, v1)); | |
| 506 break; | 509 break; |
| 507 } | 510 } |
| 508 | 511 |
| 509 case Beq: | 512 case Beq: |
| 510 { | 513 { |
| 524 | 527 |
| 525 case Bcdr: | 528 case Bcdr: |
| 526 { | 529 { |
| 527 Lisp_Object v1; | 530 Lisp_Object v1; |
| 528 v1 = TOP; | 531 v1 = TOP; |
| 529 if (CONSP (v1)) TOP = XCDR (v1); | 532 if (CONSP (v1)) |
| 530 else if (NILP (v1)) TOP = Qnil; | 533 TOP = XCDR (v1); |
| 531 else Fcdr (wrong_type_argument (Qlistp, v1)); | 534 else if (NILP (v1)) |
| 535 TOP = Qnil; | |
| 536 else | |
| 537 Fcdr (wrong_type_argument (Qlistp, v1)); | |
| 532 break; | 538 break; |
| 533 } | 539 } |
| 534 | 540 |
| 535 case Bvarset+7: | 541 case Bvarset+7: |
| 536 op = FETCH2; | 542 op = FETCH2; |
| 564 | 570 |
| 565 case Bvarbind+7: | 571 case Bvarbind+7: |
| 566 op = FETCH2; | 572 op = FETCH2; |
| 567 goto varbind; | 573 goto varbind; |
| 568 | 574 |
| 569 case Bvarbind: case Bvarbind+1: case Bvarbind+2: case Bvarbind+3: | 575 case Bvarbind: |
| 570 case Bvarbind+4: case Bvarbind+5: | 576 case Bvarbind+1: |
| 577 case Bvarbind+2: | |
| 578 case Bvarbind+3: | |
| 579 case Bvarbind+4: | |
| 580 case Bvarbind+5: | |
| 571 op -= Bvarbind; | 581 op -= Bvarbind; |
| 572 varbind: | 582 varbind: |
| 573 specbind (vectorp[op], POP); | 583 specbind (vectorp[op], POP); |
| 574 break; | 584 break; |
| 575 | 585 |
| 579 | 589 |
| 580 case Bcall+7: | 590 case Bcall+7: |
| 581 op = FETCH2; | 591 op = FETCH2; |
| 582 goto docall; | 592 goto docall; |
| 583 | 593 |
| 584 case Bcall: case Bcall+1: case Bcall+2: case Bcall+3: | 594 case Bcall: |
| 585 case Bcall+4: case Bcall+5: | 595 case Bcall+1: |
| 596 case Bcall+2: | |
| 597 case Bcall+3: | |
| 598 case Bcall+4: | |
| 599 case Bcall+5: | |
| 586 op -= Bcall; | 600 op -= Bcall; |
| 587 docall: | 601 docall: |
| 588 { | 602 { |
| 603 BEFORE_POTENTIAL_GC (); | |
| 589 DISCARD (op); | 604 DISCARD (op); |
| 590 #ifdef BYTE_CODE_METER | 605 #ifdef BYTE_CODE_METER |
| 591 if (byte_metering_on && SYMBOLP (TOP)) | 606 if (byte_metering_on && SYMBOLP (TOP)) |
| 592 { | 607 { |
| 593 Lisp_Object v1, v2; | 608 Lisp_Object v1, v2; |
| 600 XSETINT (v2, XINT (v2) + 1); | 615 XSETINT (v2, XINT (v2) + 1); |
| 601 Fput (v1, Qbyte_code_meter, v2); | 616 Fput (v1, Qbyte_code_meter, v2); |
| 602 } | 617 } |
| 603 } | 618 } |
| 604 #endif | 619 #endif |
| 605 BEFORE_POTENTIAL_GC (); | |
| 606 TOP = Ffuncall (op + 1, &TOP); | 620 TOP = Ffuncall (op + 1, &TOP); |
| 607 AFTER_POTENTIAL_GC (); | 621 AFTER_POTENTIAL_GC (); |
| 608 break; | 622 break; |
| 609 } | 623 } |
| 610 | 624 |
| 614 | 628 |
| 615 case Bunbind+7: | 629 case Bunbind+7: |
| 616 op = FETCH2; | 630 op = FETCH2; |
| 617 goto dounbind; | 631 goto dounbind; |
| 618 | 632 |
| 619 case Bunbind: case Bunbind+1: case Bunbind+2: case Bunbind+3: | 633 case Bunbind: |
| 620 case Bunbind+4: case Bunbind+5: | 634 case Bunbind+1: |
| 635 case Bunbind+2: | |
| 636 case Bunbind+3: | |
| 637 case Bunbind+4: | |
| 638 case Bunbind+5: | |
| 621 op -= Bunbind; | 639 op -= Bunbind; |
| 622 dounbind: | 640 dounbind: |
| 623 BEFORE_POTENTIAL_GC (); | 641 BEFORE_POTENTIAL_GC (); |
| 624 unbind_to (specpdl_ptr - specpdl - op, Qnil); | 642 unbind_to (specpdl_ptr - specpdl - op, Qnil); |
| 625 AFTER_POTENTIAL_GC (); | 643 AFTER_POTENTIAL_GC (); |
| 735 case Bconstant2: | 753 case Bconstant2: |
| 736 PUSH (vectorp[FETCH2]); | 754 PUSH (vectorp[FETCH2]); |
| 737 break; | 755 break; |
| 738 | 756 |
| 739 case Bsave_excursion: | 757 case Bsave_excursion: |
| 740 record_unwind_protect (save_excursion_restore, save_excursion_save ()); | 758 record_unwind_protect (save_excursion_restore, |
| 759 save_excursion_save ()); | |
| 741 break; | 760 break; |
| 742 | 761 |
| 743 case Bsave_current_buffer: | 762 case Bsave_current_buffer: |
| 744 case Bsave_current_buffer_1: | 763 case Bsave_current_buffer_1: |
| 745 record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ()); | 764 record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ()); |
| 750 TOP = Fsave_window_excursion (TOP); | 769 TOP = Fsave_window_excursion (TOP); |
| 751 AFTER_POTENTIAL_GC (); | 770 AFTER_POTENTIAL_GC (); |
| 752 break; | 771 break; |
| 753 | 772 |
| 754 case Bsave_restriction: | 773 case Bsave_restriction: |
| 755 record_unwind_protect (save_restriction_restore, save_restriction_save ()); | 774 record_unwind_protect (save_restriction_restore, |
| 775 save_restriction_save ()); | |
| 756 break; | 776 break; |
| 757 | 777 |
| 758 case Bcatch: | 778 case Bcatch: |
| 759 { | 779 { |
| 760 Lisp_Object v1; | 780 Lisp_Object v1; |
| 761 | |
| 762 v1 = POP; | 781 v1 = POP; |
| 763 BEFORE_POTENTIAL_GC (); | 782 BEFORE_POTENTIAL_GC (); |
| 764 TOP = internal_catch (TOP, Feval, v1); | 783 TOP = internal_catch (TOP, Feval, v1); |
| 765 AFTER_POTENTIAL_GC (); | 784 AFTER_POTENTIAL_GC (); |
| 766 break; | 785 break; |
| 821 immediate_quit = 1; | 840 immediate_quit = 1; |
| 822 op++; | 841 op++; |
| 823 } | 842 } |
| 824 } | 843 } |
| 825 immediate_quit = 0; | 844 immediate_quit = 0; |
| 826 if (CONSP (v1)) TOP = XCAR (v1); | 845 if (CONSP (v1)) |
| 827 else if (NILP (v1)) TOP = Qnil; | 846 TOP = XCAR (v1); |
| 828 else Fcar (wrong_type_argument (Qlistp, v1)); | 847 else if (NILP (v1)) |
| 848 TOP = Qnil; | |
| 849 else | |
| 850 Fcar (wrong_type_argument (Qlistp, v1)); | |
| 829 break; | 851 break; |
| 830 } | 852 } |
| 831 | 853 |
| 832 case Bsymbolp: | 854 case Bsymbolp: |
| 833 TOP = SYMBOLP (TOP) ? Qt : Qnil; | 855 TOP = SYMBOLP (TOP) ? Qt : Qnil; |
| 939 | 961 |
| 940 case Bsubstring: | 962 case Bsubstring: |
| 941 { | 963 { |
| 942 Lisp_Object v1, v2; | 964 Lisp_Object v1, v2; |
| 943 v2 = POP; v1 = POP; | 965 v2 = POP; v1 = POP; |
| 966 BEFORE_POTENTIAL_GC (); | |
| 944 TOP = Fsubstring (TOP, v1, v2); | 967 TOP = Fsubstring (TOP, v1, v2); |
| 968 AFTER_POTENTIAL_GC (); | |
| 945 break; | 969 break; |
| 946 } | 970 } |
| 947 | 971 |
| 948 case Bconcat2: | 972 case Bconcat2: |
| 949 DISCARD (1); | 973 DISCARD (1); |
| 1119 AFTER_POTENTIAL_GC (); | 1143 AFTER_POTENTIAL_GC (); |
| 1120 break; | 1144 break; |
| 1121 | 1145 |
| 1122 case BinsertN: | 1146 case BinsertN: |
| 1123 op = FETCH; | 1147 op = FETCH; |
| 1148 BEFORE_POTENTIAL_GC (); | |
| 1124 DISCARD (op - 1); | 1149 DISCARD (op - 1); |
| 1125 BEFORE_POTENTIAL_GC (); | |
| 1126 TOP = Finsert (op, &TOP); | 1150 TOP = Finsert (op, &TOP); |
| 1127 AFTER_POTENTIAL_GC (); | 1151 AFTER_POTENTIAL_GC (); |
| 1128 break; | 1152 break; |
| 1129 | 1153 |
| 1130 case Bpoint_max: | 1154 case Bpoint_max: |
| 1371 immediate_quit = 1; | 1395 immediate_quit = 1; |
| 1372 op++; | 1396 op++; |
| 1373 } | 1397 } |
| 1374 } | 1398 } |
| 1375 immediate_quit = 0; | 1399 immediate_quit = 0; |
| 1376 if (CONSP (v1)) TOP = XCAR (v1); | 1400 if (CONSP (v1)) |
| 1377 else if (NILP (v1)) TOP = Qnil; | 1401 TOP = XCAR (v1); |
| 1378 else Fcar (wrong_type_argument (Qlistp, v1)); | 1402 else if (NILP (v1)) |
| 1403 TOP = Qnil; | |
| 1404 else | |
| 1405 Fcar (wrong_type_argument (Qlistp, v1)); | |
| 1379 } | 1406 } |
| 1380 else | 1407 else |
| 1381 { | 1408 { |
| 1382 v1 = POP; | 1409 v1 = POP; |
| 1383 TOP = Felt (TOP, v1); | 1410 TOP = Felt (TOP, v1); |
