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