| 1149 | |
| 1150 | |
| 1151 | void luaV_execute (lua_State *L, CallInfo *ci) { |
| 1152 | LClosure *cl; |
| 1153 | TValue *k; |
| 1154 | StkId base; |
| 1155 | const Instruction *pc; |
| 1156 | int trap; |
| 1157 | #if LUA_USE_JUMPTABLE |
| 1158 | #include "ljumptab.h" |
| 1159 | #endif |
| 1160 | startfunc: |
| 1161 | trap = L->hookmask; |
| 1162 | returning: /* trap already set */ |
| 1163 | cl = ci_func(ci); |
| 1164 | k = cl->p->k; |
| 1165 | pc = ci->u.l.savedpc; |
| 1166 | if (l_unlikely(trap)) |
| 1167 | trap = luaG_tracecall(L); |
| 1168 | base = ci->func.p + 1; |
| 1169 | /* main loop of interpreter */ |
| 1170 | for (;;) { |
| 1171 | Instruction i; /* instruction being executed */ |
| 1172 | vmfetch(); |
| 1173 | #if 0 |
| 1174 | /* low-level line tracing for debugging Lua */ |
| 1175 | printf("line: %d\n", luaG_getfuncline(cl->p, pcRel(pc, cl->p))); |
| 1176 | #endif |
| 1177 | lua_assert(base == ci->func.p + 1); |
| 1178 | lua_assert(base <= L->top.p && L->top.p <= L->stack_last.p); |
| 1179 | /* invalidate top for instructions not expecting it */ |
| 1180 | lua_assert(isIT(i) || (cast_void(L->top.p = base), 1)); |
| 1181 | vmdispatch (GET_OPCODE(i)) { |
| 1182 | vmcase(OP_MOVE) { |
| 1183 | StkId ra = RA(i); |
| 1184 | setobjs2s(L, ra, RB(i)); |
| 1185 | vmbreak; |
| 1186 | } |
| 1187 | vmcase(OP_LOADI) { |
| 1188 | StkId ra = RA(i); |
| 1189 | lua_Integer b = GETARG_sBx(i); |
| 1190 | setivalue(s2v(ra), b); |
| 1191 | vmbreak; |
| 1192 | } |
| 1193 | vmcase(OP_LOADF) { |
| 1194 | StkId ra = RA(i); |
| 1195 | int b = GETARG_sBx(i); |
| 1196 | setfltvalue(s2v(ra), cast_num(b)); |
| 1197 | vmbreak; |
| 1198 | } |
| 1199 | vmcase(OP_LOADK) { |
| 1200 | StkId ra = RA(i); |
| 1201 | TValue *rb = k + GETARG_Bx(i); |
| 1202 | setobj2s(L, ra, rb); |
| 1203 | vmbreak; |
| 1204 | } |
| 1205 | vmcase(OP_LOADKX) { |
| 1206 | StkId ra = RA(i); |
| 1207 | TValue *rb; |
| 1208 | rb = k + GETARG_Ax(*pc); pc++; |
no test coverage detected