| 784 | |
| 785 | |
| 786 | void luaV_execute (lua_State *L) { |
| 787 | CallInfo *ci = L->ci; |
| 788 | LClosure *cl; |
| 789 | TValue *k; |
| 790 | StkId base; |
| 791 | ci->callstatus |= CIST_FRESH; /* fresh invocation of 'luaV_execute" */ |
| 792 | newframe: /* reentry point when frame changes (call/return) */ |
| 793 | lua_assert(ci == L->ci); |
| 794 | cl = clLvalue(ci->func); /* local reference to function's closure */ |
| 795 | k = cl->p->k; /* local reference to function's constant table */ |
| 796 | base = ci->u.l.base; /* local copy of function's base */ |
| 797 | /* main loop of interpreter */ |
| 798 | for (;;) { |
| 799 | Instruction i; |
| 800 | StkId ra; |
| 801 | vmfetch(); |
| 802 | vmdispatch (GET_OPCODE(i)) { |
| 803 | vmcase(OP_MOVE) { |
| 804 | setobjs2s(L, ra, RB(i)); |
| 805 | vmbreak; |
| 806 | } |
| 807 | vmcase(OP_LOADK) { |
| 808 | TValue *rb = k + GETARG_Bx(i); |
| 809 | setobj2s(L, ra, rb); |
| 810 | vmbreak; |
| 811 | } |
| 812 | vmcase(OP_LOADKX) { |
| 813 | TValue *rb; |
| 814 | lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG); |
| 815 | rb = k + GETARG_Ax(*ci->u.l.savedpc++); |
| 816 | setobj2s(L, ra, rb); |
| 817 | vmbreak; |
| 818 | } |
| 819 | vmcase(OP_LOADBOOL) { |
| 820 | setbvalue(ra, GETARG_B(i)); |
| 821 | if (GETARG_C(i)) ci->u.l.savedpc++; /* skip next instruction (if C) */ |
| 822 | vmbreak; |
| 823 | } |
| 824 | vmcase(OP_LOADNIL) { |
| 825 | int b = GETARG_B(i); |
| 826 | do { |
| 827 | setnilvalue(ra++); |
| 828 | } while (b--); |
| 829 | vmbreak; |
| 830 | } |
| 831 | vmcase(OP_GETUPVAL) { |
| 832 | int b = GETARG_B(i); |
| 833 | setobj2s(L, ra, cl->upvals[b]->v); |
| 834 | vmbreak; |
| 835 | } |
| 836 | vmcase(OP_GETTABUP) { |
| 837 | TValue *upval = cl->upvals[GETARG_B(i)]->v; |
| 838 | TValue *rc = RKC(i); |
| 839 | gettableProtected(L, upval, rc, ra); |
| 840 | vmbreak; |
| 841 | } |
| 842 | vmcase(OP_GETTABLE) { |
| 843 | StkId rb = RB(i); |
no test coverage detected