diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-12-27 18:30:38 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-12-27 18:30:38 -0200 |
| commit | 50e2eb89541bf006525e1b060454203a644368d8 (patch) | |
| tree | c6b447818def3105bb0fdf5b301cf05b07c54e22 | |
| parent | 94eb37dc736a470ae976c5a0afab7425581aabf5 (diff) | |
| download | lua-50e2eb89541bf006525e1b060454203a644368d8.tar.gz lua-50e2eb89541bf006525e1b060454203a644368d8.tar.bz2 lua-50e2eb89541bf006525e1b060454203a644368d8.zip | |
change in macro 'vmcase', avoding code inside it. (Code inside the
macro harms tools such as debuggers.)
| -rw-r--r-- | lvm.c | 239 |
1 files changed, 142 insertions, 97 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 2.230 2014/11/21 12:15:00 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.231 2014/12/19 13:36:32 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -644,8 +644,8 @@ void luaV_finishOp (lua_State *L) { | |||
| 644 | 644 | ||
| 645 | 645 | ||
| 646 | #define vmdispatch(o) switch(o) | 646 | #define vmdispatch(o) switch(o) |
| 647 | #define vmcase(l,b) case l: {b} break; | 647 | #define vmcase(l) case l: |
| 648 | #define vmcasenb(l,b) case l: {b} /* nb = no break */ | 648 | #define vmbreak break |
| 649 | 649 | ||
| 650 | void luaV_execute (lua_State *L) { | 650 | void luaV_execute (lua_State *L) { |
| 651 | CallInfo *ci = L->ci; | 651 | CallInfo *ci = L->ci; |
| @@ -670,53 +670,64 @@ void luaV_execute (lua_State *L) { | |||
| 670 | lua_assert(base == ci->u.l.base); | 670 | lua_assert(base == ci->u.l.base); |
| 671 | lua_assert(base <= L->top && L->top < L->stack + L->stacksize); | 671 | lua_assert(base <= L->top && L->top < L->stack + L->stacksize); |
| 672 | vmdispatch (GET_OPCODE(i)) { | 672 | vmdispatch (GET_OPCODE(i)) { |
| 673 | vmcase(OP_MOVE, | 673 | vmcase(OP_MOVE) { |
| 674 | setobjs2s(L, ra, RB(i)); | 674 | setobjs2s(L, ra, RB(i)); |
| 675 | ) | 675 | vmbreak; |
| 676 | vmcase(OP_LOADK, | 676 | } |
| 677 | vmcase(OP_LOADK) { | ||
| 677 | TValue *rb = k + GETARG_Bx(i); | 678 | TValue *rb = k + GETARG_Bx(i); |
| 678 | setobj2s(L, ra, rb); | 679 | setobj2s(L, ra, rb); |
| 679 | ) | 680 | vmbreak; |
| 680 | vmcase(OP_LOADKX, | 681 | } |
| 682 | vmcase(OP_LOADKX) { | ||
| 681 | TValue *rb; | 683 | TValue *rb; |
| 682 | lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG); | 684 | lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG); |
| 683 | rb = k + GETARG_Ax(*ci->u.l.savedpc++); | 685 | rb = k + GETARG_Ax(*ci->u.l.savedpc++); |
| 684 | setobj2s(L, ra, rb); | 686 | setobj2s(L, ra, rb); |
| 685 | ) | 687 | vmbreak; |
| 686 | vmcase(OP_LOADBOOL, | 688 | } |
| 689 | vmcase(OP_LOADBOOL) { | ||
| 687 | setbvalue(ra, GETARG_B(i)); | 690 | setbvalue(ra, GETARG_B(i)); |
| 688 | if (GETARG_C(i)) ci->u.l.savedpc++; /* skip next instruction (if C) */ | 691 | if (GETARG_C(i)) ci->u.l.savedpc++; /* skip next instruction (if C) */ |
| 689 | ) | 692 | vmbreak; |
| 690 | vmcase(OP_LOADNIL, | 693 | } |
| 694 | vmcase(OP_LOADNIL) { | ||
| 691 | int b = GETARG_B(i); | 695 | int b = GETARG_B(i); |
| 692 | do { | 696 | do { |
| 693 | setnilvalue(ra++); | 697 | setnilvalue(ra++); |
| 694 | } while (b--); | 698 | } while (b--); |
| 695 | ) | 699 | vmbreak; |
| 696 | vmcase(OP_GETUPVAL, | 700 | } |
| 701 | vmcase(OP_GETUPVAL) { | ||
| 697 | int b = GETARG_B(i); | 702 | int b = GETARG_B(i); |
| 698 | setobj2s(L, ra, cl->upvals[b]->v); | 703 | setobj2s(L, ra, cl->upvals[b]->v); |
| 699 | ) | 704 | vmbreak; |
| 700 | vmcase(OP_GETTABUP, | 705 | } |
| 706 | vmcase(OP_GETTABUP) { | ||
| 701 | int b = GETARG_B(i); | 707 | int b = GETARG_B(i); |
| 702 | Protect(luaV_gettable(L, cl->upvals[b]->v, RKC(i), ra)); | 708 | Protect(luaV_gettable(L, cl->upvals[b]->v, RKC(i), ra)); |
| 703 | ) | 709 | vmbreak; |
| 704 | vmcase(OP_GETTABLE, | 710 | } |
| 711 | vmcase(OP_GETTABLE) { | ||
| 705 | Protect(luaV_gettable(L, RB(i), RKC(i), ra)); | 712 | Protect(luaV_gettable(L, RB(i), RKC(i), ra)); |
| 706 | ) | 713 | vmbreak; |
| 707 | vmcase(OP_SETTABUP, | 714 | } |
| 715 | vmcase(OP_SETTABUP) { | ||
| 708 | int a = GETARG_A(i); | 716 | int a = GETARG_A(i); |
| 709 | Protect(luaV_settable(L, cl->upvals[a]->v, RKB(i), RKC(i))); | 717 | Protect(luaV_settable(L, cl->upvals[a]->v, RKB(i), RKC(i))); |
| 710 | ) | 718 | vmbreak; |
| 711 | vmcase(OP_SETUPVAL, | 719 | } |
| 720 | vmcase(OP_SETUPVAL) { | ||
| 712 | UpVal *uv = cl->upvals[GETARG_B(i)]; | 721 | UpVal *uv = cl->upvals[GETARG_B(i)]; |
| 713 | setobj(L, uv->v, ra); | 722 | setobj(L, uv->v, ra); |
| 714 | luaC_upvalbarrier(L, uv); | 723 | luaC_upvalbarrier(L, uv); |
| 715 | ) | 724 | vmbreak; |
| 716 | vmcase(OP_SETTABLE, | 725 | } |
| 726 | vmcase(OP_SETTABLE) { | ||
| 717 | Protect(luaV_settable(L, ra, RKB(i), RKC(i))); | 727 | Protect(luaV_settable(L, ra, RKB(i), RKC(i))); |
| 718 | ) | 728 | vmbreak; |
| 719 | vmcase(OP_NEWTABLE, | 729 | } |
| 730 | vmcase(OP_NEWTABLE) { | ||
| 720 | int b = GETARG_B(i); | 731 | int b = GETARG_B(i); |
| 721 | int c = GETARG_C(i); | 732 | int c = GETARG_C(i); |
| 722 | Table *t = luaH_new(L); | 733 | Table *t = luaH_new(L); |
| @@ -724,13 +735,15 @@ void luaV_execute (lua_State *L) { | |||
| 724 | if (b != 0 || c != 0) | 735 | if (b != 0 || c != 0) |
| 725 | luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c)); | 736 | luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c)); |
| 726 | checkGC(L, ra + 1); | 737 | checkGC(L, ra + 1); |
| 727 | ) | 738 | vmbreak; |
| 728 | vmcase(OP_SELF, | 739 | } |
| 740 | vmcase(OP_SELF) { | ||
| 729 | StkId rb = RB(i); | 741 | StkId rb = RB(i); |
| 730 | setobjs2s(L, ra+1, rb); | 742 | setobjs2s(L, ra+1, rb); |
| 731 | Protect(luaV_gettable(L, rb, RKC(i), ra)); | 743 | Protect(luaV_gettable(L, rb, RKC(i), ra)); |
| 732 | ) | 744 | vmbreak; |
| 733 | vmcase(OP_ADD, | 745 | } |
| 746 | vmcase(OP_ADD) { | ||
| 734 | TValue *rb = RKB(i); | 747 | TValue *rb = RKB(i); |
| 735 | TValue *rc = RKC(i); | 748 | TValue *rc = RKC(i); |
| 736 | lua_Number nb; lua_Number nc; | 749 | lua_Number nb; lua_Number nc; |
| @@ -742,8 +755,9 @@ void luaV_execute (lua_State *L) { | |||
| 742 | setfltvalue(ra, luai_numadd(L, nb, nc)); | 755 | setfltvalue(ra, luai_numadd(L, nb, nc)); |
| 743 | } | 756 | } |
| 744 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); } | 757 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); } |
| 745 | ) | 758 | vmbreak; |
| 746 | vmcase(OP_SUB, | 759 | } |
| 760 | vmcase(OP_SUB) { | ||
| 747 | TValue *rb = RKB(i); | 761 | TValue *rb = RKB(i); |
| 748 | TValue *rc = RKC(i); | 762 | TValue *rc = RKC(i); |
| 749 | lua_Number nb; lua_Number nc; | 763 | lua_Number nb; lua_Number nc; |
| @@ -755,8 +769,9 @@ void luaV_execute (lua_State *L) { | |||
| 755 | setfltvalue(ra, luai_numsub(L, nb, nc)); | 769 | setfltvalue(ra, luai_numsub(L, nb, nc)); |
| 756 | } | 770 | } |
| 757 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SUB)); } | 771 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SUB)); } |
| 758 | ) | 772 | vmbreak; |
| 759 | vmcase(OP_MUL, | 773 | } |
| 774 | vmcase(OP_MUL) { | ||
| 760 | TValue *rb = RKB(i); | 775 | TValue *rb = RKB(i); |
| 761 | TValue *rc = RKC(i); | 776 | TValue *rc = RKC(i); |
| 762 | lua_Number nb; lua_Number nc; | 777 | lua_Number nb; lua_Number nc; |
| @@ -768,8 +783,9 @@ void luaV_execute (lua_State *L) { | |||
| 768 | setfltvalue(ra, luai_nummul(L, nb, nc)); | 783 | setfltvalue(ra, luai_nummul(L, nb, nc)); |
| 769 | } | 784 | } |
| 770 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MUL)); } | 785 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MUL)); } |
| 771 | ) | 786 | vmbreak; |
| 772 | vmcase(OP_DIV, /* float division (always with floats) */ | 787 | } |
| 788 | vmcase(OP_DIV) { /* float division (always with floats) */ | ||
| 773 | TValue *rb = RKB(i); | 789 | TValue *rb = RKB(i); |
| 774 | TValue *rc = RKC(i); | 790 | TValue *rc = RKC(i); |
| 775 | lua_Number nb; lua_Number nc; | 791 | lua_Number nb; lua_Number nc; |
| @@ -777,8 +793,9 @@ void luaV_execute (lua_State *L) { | |||
| 777 | setfltvalue(ra, luai_numdiv(L, nb, nc)); | 793 | setfltvalue(ra, luai_numdiv(L, nb, nc)); |
| 778 | } | 794 | } |
| 779 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV)); } | 795 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV)); } |
| 780 | ) | 796 | vmbreak; |
| 781 | vmcase(OP_BAND, | 797 | } |
| 798 | vmcase(OP_BAND) { | ||
| 782 | TValue *rb = RKB(i); | 799 | TValue *rb = RKB(i); |
| 783 | TValue *rc = RKC(i); | 800 | TValue *rc = RKC(i); |
| 784 | lua_Integer ib; lua_Integer ic; | 801 | lua_Integer ib; lua_Integer ic; |
| @@ -786,8 +803,9 @@ void luaV_execute (lua_State *L) { | |||
| 786 | setivalue(ra, intop(&, ib, ic)); | 803 | setivalue(ra, intop(&, ib, ic)); |
| 787 | } | 804 | } |
| 788 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BAND)); } | 805 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BAND)); } |
| 789 | ) | 806 | vmbreak; |
| 790 | vmcase(OP_BOR, | 807 | } |
| 808 | vmcase(OP_BOR) { | ||
| 791 | TValue *rb = RKB(i); | 809 | TValue *rb = RKB(i); |
| 792 | TValue *rc = RKC(i); | 810 | TValue *rc = RKC(i); |
| 793 | lua_Integer ib; lua_Integer ic; | 811 | lua_Integer ib; lua_Integer ic; |
| @@ -795,8 +813,9 @@ void luaV_execute (lua_State *L) { | |||
| 795 | setivalue(ra, intop(|, ib, ic)); | 813 | setivalue(ra, intop(|, ib, ic)); |
| 796 | } | 814 | } |
| 797 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BOR)); } | 815 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BOR)); } |
| 798 | ) | 816 | vmbreak; |
| 799 | vmcase(OP_BXOR, | 817 | } |
| 818 | vmcase(OP_BXOR) { | ||
| 800 | TValue *rb = RKB(i); | 819 | TValue *rb = RKB(i); |
| 801 | TValue *rc = RKC(i); | 820 | TValue *rc = RKC(i); |
| 802 | lua_Integer ib; lua_Integer ic; | 821 | lua_Integer ib; lua_Integer ic; |
| @@ -804,8 +823,9 @@ void luaV_execute (lua_State *L) { | |||
| 804 | setivalue(ra, intop(^, ib, ic)); | 823 | setivalue(ra, intop(^, ib, ic)); |
| 805 | } | 824 | } |
| 806 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BXOR)); } | 825 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BXOR)); } |
| 807 | ) | 826 | vmbreak; |
| 808 | vmcase(OP_SHL, | 827 | } |
| 828 | vmcase(OP_SHL) { | ||
| 809 | TValue *rb = RKB(i); | 829 | TValue *rb = RKB(i); |
| 810 | TValue *rc = RKC(i); | 830 | TValue *rc = RKC(i); |
| 811 | lua_Integer ib; lua_Integer ic; | 831 | lua_Integer ib; lua_Integer ic; |
| @@ -813,8 +833,9 @@ void luaV_execute (lua_State *L) { | |||
| 813 | setivalue(ra, luaV_shiftl(ib, ic)); | 833 | setivalue(ra, luaV_shiftl(ib, ic)); |
| 814 | } | 834 | } |
| 815 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHL)); } | 835 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHL)); } |
| 816 | ) | 836 | vmbreak; |
| 817 | vmcase(OP_SHR, | 837 | } |
| 838 | vmcase(OP_SHR) { | ||
| 818 | TValue *rb = RKB(i); | 839 | TValue *rb = RKB(i); |
| 819 | TValue *rc = RKC(i); | 840 | TValue *rc = RKC(i); |
| 820 | lua_Integer ib; lua_Integer ic; | 841 | lua_Integer ib; lua_Integer ic; |
| @@ -822,8 +843,9 @@ void luaV_execute (lua_State *L) { | |||
| 822 | setivalue(ra, luaV_shiftl(ib, -ic)); | 843 | setivalue(ra, luaV_shiftl(ib, -ic)); |
| 823 | } | 844 | } |
| 824 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHR)); } | 845 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHR)); } |
| 825 | ) | 846 | vmbreak; |
| 826 | vmcase(OP_MOD, | 847 | } |
| 848 | vmcase(OP_MOD) { | ||
| 827 | TValue *rb = RKB(i); | 849 | TValue *rb = RKB(i); |
| 828 | TValue *rc = RKC(i); | 850 | TValue *rc = RKC(i); |
| 829 | lua_Number nb; lua_Number nc; | 851 | lua_Number nb; lua_Number nc; |
| @@ -837,8 +859,9 @@ void luaV_execute (lua_State *L) { | |||
| 837 | setfltvalue(ra, m); | 859 | setfltvalue(ra, m); |
| 838 | } | 860 | } |
| 839 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MOD)); } | 861 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MOD)); } |
| 840 | ) | 862 | vmbreak; |
| 841 | vmcase(OP_IDIV, /* floor division */ | 863 | } |
| 864 | vmcase(OP_IDIV) { /* floor division */ | ||
| 842 | TValue *rb = RKB(i); | 865 | TValue *rb = RKB(i); |
| 843 | TValue *rc = RKC(i); | 866 | TValue *rc = RKC(i); |
| 844 | lua_Number nb; lua_Number nc; | 867 | lua_Number nb; lua_Number nc; |
| @@ -850,8 +873,9 @@ void luaV_execute (lua_State *L) { | |||
| 850 | setfltvalue(ra, luai_numidiv(L, nb, nc)); | 873 | setfltvalue(ra, luai_numidiv(L, nb, nc)); |
| 851 | } | 874 | } |
| 852 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_IDIV)); } | 875 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_IDIV)); } |
| 853 | ) | 876 | vmbreak; |
| 854 | vmcase(OP_POW, | 877 | } |
| 878 | vmcase(OP_POW) { | ||
| 855 | TValue *rb = RKB(i); | 879 | TValue *rb = RKB(i); |
| 856 | TValue *rc = RKC(i); | 880 | TValue *rc = RKC(i); |
| 857 | lua_Number nb; lua_Number nc; | 881 | lua_Number nb; lua_Number nc; |
| @@ -859,8 +883,9 @@ void luaV_execute (lua_State *L) { | |||
| 859 | setfltvalue(ra, luai_numpow(L, nb, nc)); | 883 | setfltvalue(ra, luai_numpow(L, nb, nc)); |
| 860 | } | 884 | } |
| 861 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); } | 885 | else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); } |
| 862 | ) | 886 | vmbreak; |
| 863 | vmcase(OP_UNM, | 887 | } |
| 888 | vmcase(OP_UNM) { | ||
| 864 | TValue *rb = RB(i); | 889 | TValue *rb = RB(i); |
| 865 | lua_Number nb; | 890 | lua_Number nb; |
| 866 | if (ttisinteger(rb)) { | 891 | if (ttisinteger(rb)) { |
| @@ -873,8 +898,9 @@ void luaV_execute (lua_State *L) { | |||
| 873 | else { | 898 | else { |
| 874 | Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM)); | 899 | Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM)); |
| 875 | } | 900 | } |
| 876 | ) | 901 | vmbreak; |
| 877 | vmcase(OP_BNOT, | 902 | } |
| 903 | vmcase(OP_BNOT) { | ||
| 878 | TValue *rb = RB(i); | 904 | TValue *rb = RB(i); |
| 879 | lua_Integer ib; | 905 | lua_Integer ib; |
| 880 | if (tointeger(rb, &ib)) { | 906 | if (tointeger(rb, &ib)) { |
| @@ -883,16 +909,19 @@ void luaV_execute (lua_State *L) { | |||
| 883 | else { | 909 | else { |
| 884 | Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT)); | 910 | Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT)); |
| 885 | } | 911 | } |
| 886 | ) | 912 | vmbreak; |
| 887 | vmcase(OP_NOT, | 913 | } |
| 914 | vmcase(OP_NOT) { | ||
| 888 | TValue *rb = RB(i); | 915 | TValue *rb = RB(i); |
| 889 | int res = l_isfalse(rb); /* next assignment may change this value */ | 916 | int res = l_isfalse(rb); /* next assignment may change this value */ |
| 890 | setbvalue(ra, res); | 917 | setbvalue(ra, res); |
| 891 | ) | 918 | vmbreak; |
| 892 | vmcase(OP_LEN, | 919 | } |
| 920 | vmcase(OP_LEN) { | ||
| 893 | Protect(luaV_objlen(L, ra, RB(i))); | 921 | Protect(luaV_objlen(L, ra, RB(i))); |
| 894 | ) | 922 | vmbreak; |
| 895 | vmcase(OP_CONCAT, | 923 | } |
| 924 | vmcase(OP_CONCAT) { | ||
| 896 | int b = GETARG_B(i); | 925 | int b = GETARG_B(i); |
| 897 | int c = GETARG_C(i); | 926 | int c = GETARG_C(i); |
| 898 | StkId rb; | 927 | StkId rb; |
| @@ -903,11 +932,13 @@ void luaV_execute (lua_State *L) { | |||
| 903 | setobjs2s(L, ra, rb); | 932 | setobjs2s(L, ra, rb); |
| 904 | checkGC(L, (ra >= rb ? ra + 1 : rb)); | 933 | checkGC(L, (ra >= rb ? ra + 1 : rb)); |
| 905 | L->top = ci->top; /* restore top */ | 934 | L->top = ci->top; /* restore top */ |
| 906 | ) | 935 | vmbreak; |
| 907 | vmcase(OP_JMP, | 936 | } |
| 937 | vmcase(OP_JMP) { | ||
| 908 | dojump(ci, i, 0); | 938 | dojump(ci, i, 0); |
| 909 | ) | 939 | vmbreak; |
| 910 | vmcase(OP_EQ, | 940 | } |
| 941 | vmcase(OP_EQ) { | ||
| 911 | TValue *rb = RKB(i); | 942 | TValue *rb = RKB(i); |
| 912 | TValue *rc = RKC(i); | 943 | TValue *rc = RKC(i); |
| 913 | Protect( | 944 | Protect( |
| @@ -916,30 +947,34 @@ void luaV_execute (lua_State *L) { | |||
| 916 | else | 947 | else |
| 917 | donextjump(ci); | 948 | donextjump(ci); |
| 918 | ) | 949 | ) |
| 919 | ) | 950 | vmbreak; |
| 920 | vmcase(OP_LT, | 951 | } |
| 952 | vmcase(OP_LT) { | ||
| 921 | Protect( | 953 | Protect( |
| 922 | if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i)) | 954 | if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i)) |
| 923 | ci->u.l.savedpc++; | 955 | ci->u.l.savedpc++; |
| 924 | else | 956 | else |
| 925 | donextjump(ci); | 957 | donextjump(ci); |
| 926 | ) | 958 | ) |
| 927 | ) | 959 | vmbreak; |
| 928 | vmcase(OP_LE, | 960 | } |
| 961 | vmcase(OP_LE) { | ||
| 929 | Protect( | 962 | Protect( |
| 930 | if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) | 963 | if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) |
| 931 | ci->u.l.savedpc++; | 964 | ci->u.l.savedpc++; |
| 932 | else | 965 | else |
| 933 | donextjump(ci); | 966 | donextjump(ci); |
| 934 | ) | 967 | ) |
| 935 | ) | 968 | vmbreak; |
| 936 | vmcase(OP_TEST, | 969 | } |
| 970 | vmcase(OP_TEST) { | ||
| 937 | if (GETARG_C(i) ? l_isfalse(ra) : !l_isfalse(ra)) | 971 | if (GETARG_C(i) ? l_isfalse(ra) : !l_isfalse(ra)) |
| 938 | ci->u.l.savedpc++; | 972 | ci->u.l.savedpc++; |
| 939 | else | 973 | else |
| 940 | donextjump(ci); | 974 | donextjump(ci); |
| 941 | ) | 975 | vmbreak; |
| 942 | vmcase(OP_TESTSET, | 976 | } |
| 977 | vmcase(OP_TESTSET) { | ||
| 943 | TValue *rb = RB(i); | 978 | TValue *rb = RB(i); |
| 944 | if (GETARG_C(i) ? l_isfalse(rb) : !l_isfalse(rb)) | 979 | if (GETARG_C(i) ? l_isfalse(rb) : !l_isfalse(rb)) |
| 945 | ci->u.l.savedpc++; | 980 | ci->u.l.savedpc++; |
| @@ -947,8 +982,9 @@ void luaV_execute (lua_State *L) { | |||
| 947 | setobjs2s(L, ra, rb); | 982 | setobjs2s(L, ra, rb); |
| 948 | donextjump(ci); | 983 | donextjump(ci); |
| 949 | } | 984 | } |
| 950 | ) | 985 | vmbreak; |
| 951 | vmcase(OP_CALL, | 986 | } |
| 987 | vmcase(OP_CALL) { | ||
| 952 | int b = GETARG_B(i); | 988 | int b = GETARG_B(i); |
| 953 | int nresults = GETARG_C(i) - 1; | 989 | int nresults = GETARG_C(i) - 1; |
| 954 | if (b != 0) L->top = ra+b; /* else previous instruction set top */ | 990 | if (b != 0) L->top = ra+b; /* else previous instruction set top */ |
| @@ -961,8 +997,9 @@ void luaV_execute (lua_State *L) { | |||
| 961 | ci->callstatus |= CIST_REENTRY; | 997 | ci->callstatus |= CIST_REENTRY; |
| 962 | goto newframe; /* restart luaV_execute over new Lua function */ | 998 | goto newframe; /* restart luaV_execute over new Lua function */ |
| 963 | } | 999 | } |
| 964 | ) | 1000 | vmbreak; |
| 965 | vmcase(OP_TAILCALL, | 1001 | } |
| 1002 | vmcase(OP_TAILCALL) { | ||
| 966 | int b = GETARG_B(i); | 1003 | int b = GETARG_B(i); |
| 967 | if (b != 0) L->top = ra+b; /* else previous instruction set top */ | 1004 | if (b != 0) L->top = ra+b; /* else previous instruction set top */ |
| 968 | lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); | 1005 | lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); |
| @@ -990,8 +1027,9 @@ void luaV_execute (lua_State *L) { | |||
| 990 | lua_assert(L->top == oci->u.l.base + getproto(ofunc)->maxstacksize); | 1027 | lua_assert(L->top == oci->u.l.base + getproto(ofunc)->maxstacksize); |
| 991 | goto newframe; /* restart luaV_execute over new Lua function */ | 1028 | goto newframe; /* restart luaV_execute over new Lua function */ |
| 992 | } | 1029 | } |
| 993 | ) | 1030 | vmbreak; |
| 994 | vmcasenb(OP_RETURN, | 1031 | } |
| 1032 | vmcase(OP_RETURN) { | ||
| 995 | int b = GETARG_B(i); | 1033 | int b = GETARG_B(i); |
| 996 | if (b != 0) L->top = ra+b-1; | 1034 | if (b != 0) L->top = ra+b-1; |
| 997 | if (cl->p->sizep > 0) luaF_close(L, base); | 1035 | if (cl->p->sizep > 0) luaF_close(L, base); |
| @@ -1005,8 +1043,8 @@ void luaV_execute (lua_State *L) { | |||
| 1005 | lua_assert(GET_OPCODE(*((ci)->u.l.savedpc - 1)) == OP_CALL); | 1043 | lua_assert(GET_OPCODE(*((ci)->u.l.savedpc - 1)) == OP_CALL); |
| 1006 | goto newframe; /* restart luaV_execute over new Lua function */ | 1044 | goto newframe; /* restart luaV_execute over new Lua function */ |
| 1007 | } | 1045 | } |
| 1008 | ) | 1046 | } |
| 1009 | vmcase(OP_FORLOOP, | 1047 | vmcase(OP_FORLOOP) { |
| 1010 | if (ttisinteger(ra)) { /* integer loop? */ | 1048 | if (ttisinteger(ra)) { /* integer loop? */ |
| 1011 | lua_Integer step = ivalue(ra + 2); | 1049 | lua_Integer step = ivalue(ra + 2); |
| 1012 | lua_Integer idx = ivalue(ra) + step; /* increment index */ | 1050 | lua_Integer idx = ivalue(ra) + step; /* increment index */ |
| @@ -1028,8 +1066,9 @@ void luaV_execute (lua_State *L) { | |||
| 1028 | setfltvalue(ra + 3, idx); /* ...and external index */ | 1066 | setfltvalue(ra + 3, idx); /* ...and external index */ |
| 1029 | } | 1067 | } |
| 1030 | } | 1068 | } |
| 1031 | ) | 1069 | vmbreak; |
| 1032 | vmcase(OP_FORPREP, | 1070 | } |
| 1071 | vmcase(OP_FORPREP) { | ||
| 1033 | TValue *init = ra; | 1072 | TValue *init = ra; |
| 1034 | TValue *plimit = ra + 1; | 1073 | TValue *plimit = ra + 1; |
| 1035 | TValue *pstep = ra + 2; | 1074 | TValue *pstep = ra + 2; |
| @@ -1055,8 +1094,9 @@ void luaV_execute (lua_State *L) { | |||
| 1055 | setfltvalue(init, luai_numsub(L, ninit, nstep)); | 1094 | setfltvalue(init, luai_numsub(L, ninit, nstep)); |
| 1056 | } | 1095 | } |
| 1057 | ci->u.l.savedpc += GETARG_sBx(i); | 1096 | ci->u.l.savedpc += GETARG_sBx(i); |
| 1058 | ) | 1097 | vmbreak; |
| 1059 | vmcasenb(OP_TFORCALL, | 1098 | } |
| 1099 | vmcase(OP_TFORCALL) { | ||
| 1060 | StkId cb = ra + 3; /* call base */ | 1100 | StkId cb = ra + 3; /* call base */ |
| 1061 | setobjs2s(L, cb+2, ra+2); | 1101 | setobjs2s(L, cb+2, ra+2); |
| 1062 | setobjs2s(L, cb+1, ra+1); | 1102 | setobjs2s(L, cb+1, ra+1); |
| @@ -1068,15 +1108,16 @@ void luaV_execute (lua_State *L) { | |||
| 1068 | ra = RA(i); | 1108 | ra = RA(i); |
| 1069 | lua_assert(GET_OPCODE(i) == OP_TFORLOOP); | 1109 | lua_assert(GET_OPCODE(i) == OP_TFORLOOP); |
| 1070 | goto l_tforloop; | 1110 | goto l_tforloop; |
| 1071 | ) | 1111 | } |
| 1072 | vmcase(OP_TFORLOOP, | 1112 | vmcase(OP_TFORLOOP) { |
| 1073 | l_tforloop: | 1113 | l_tforloop: |
| 1074 | if (!ttisnil(ra + 1)) { /* continue loop? */ | 1114 | if (!ttisnil(ra + 1)) { /* continue loop? */ |
| 1075 | setobjs2s(L, ra, ra + 1); /* save control variable */ | 1115 | setobjs2s(L, ra, ra + 1); /* save control variable */ |
| 1076 | ci->u.l.savedpc += GETARG_sBx(i); /* jump back */ | 1116 | ci->u.l.savedpc += GETARG_sBx(i); /* jump back */ |
| 1077 | } | 1117 | } |
| 1078 | ) | 1118 | vmbreak; |
| 1079 | vmcase(OP_SETLIST, | 1119 | } |
| 1120 | vmcase(OP_SETLIST) { | ||
| 1080 | int n = GETARG_B(i); | 1121 | int n = GETARG_B(i); |
| 1081 | int c = GETARG_C(i); | 1122 | int c = GETARG_C(i); |
| 1082 | unsigned int last; | 1123 | unsigned int last; |
| @@ -1097,8 +1138,9 @@ void luaV_execute (lua_State *L) { | |||
| 1097 | luaC_barrierback(L, h, val); | 1138 | luaC_barrierback(L, h, val); |
| 1098 | } | 1139 | } |
| 1099 | L->top = ci->top; /* correct top (in case of previous open call) */ | 1140 | L->top = ci->top; /* correct top (in case of previous open call) */ |
| 1100 | ) | 1141 | vmbreak; |
| 1101 | vmcase(OP_CLOSURE, | 1142 | } |
| 1143 | vmcase(OP_CLOSURE) { | ||
| 1102 | Proto *p = cl->p->p[GETARG_Bx(i)]; | 1144 | Proto *p = cl->p->p[GETARG_Bx(i)]; |
| 1103 | LClosure *ncl = getcached(p, cl->upvals, base); /* cached closure */ | 1145 | LClosure *ncl = getcached(p, cl->upvals, base); /* cached closure */ |
| 1104 | if (ncl == NULL) /* no match? */ | 1146 | if (ncl == NULL) /* no match? */ |
| @@ -1106,8 +1148,9 @@ void luaV_execute (lua_State *L) { | |||
| 1106 | else | 1148 | else |
| 1107 | setclLvalue(L, ra, ncl); /* push cashed closure */ | 1149 | setclLvalue(L, ra, ncl); /* push cashed closure */ |
| 1108 | checkGC(L, ra + 1); | 1150 | checkGC(L, ra + 1); |
| 1109 | ) | 1151 | vmbreak; |
| 1110 | vmcase(OP_VARARG, | 1152 | } |
| 1153 | vmcase(OP_VARARG) { | ||
| 1111 | int b = GETARG_B(i) - 1; | 1154 | int b = GETARG_B(i) - 1; |
| 1112 | int j; | 1155 | int j; |
| 1113 | int n = cast_int(base - ci->func) - cl->p->numparams - 1; | 1156 | int n = cast_int(base - ci->func) - cl->p->numparams - 1; |
| @@ -1125,10 +1168,12 @@ void luaV_execute (lua_State *L) { | |||
| 1125 | setnilvalue(ra + j); | 1168 | setnilvalue(ra + j); |
| 1126 | } | 1169 | } |
| 1127 | } | 1170 | } |
| 1128 | ) | 1171 | vmbreak; |
| 1129 | vmcase(OP_EXTRAARG, | 1172 | } |
| 1173 | vmcase(OP_EXTRAARG) { | ||
| 1130 | lua_assert(0); | 1174 | lua_assert(0); |
| 1131 | ) | 1175 | vmbreak; |
| 1176 | } | ||
| 1132 | } | 1177 | } |
| 1133 | } | 1178 | } |
| 1134 | } | 1179 | } |
