1 /* 2 ** $Id: lvm.c,v 2.63.1.5 2011/08/17 20:43:11 roberto Exp $ 3 ** Lua virtual machine 4 ** See Copyright Notice in lua.h 5 */ 6 7 8 #include <stdio.h> 9 #include <stdlib.h> 10 #include <string.h> 11 12 #define lvm_c 13 #define LUA_CORE 14 15 #include "lua.h" 16 17 #include "ldebug.h" 18 #include "ldo.h" 19 #include "lfunc.h" 20 #include "lgc.h" 21 #include "lobject.h" 22 #include "lopcodes.h" 23 #include "lstate.h" 24 #include "lstring.h" 25 #include "ltable.h" 26 #include "ltm.h" 27 #include "lvm.h" 28 29 30 31 /* limit for table tag-method chains (to avoid loops) */ 32 #define MAXTAGLOOP 100 33 34 35 const TValue *luaV_tonumber (const TValue *obj, TValue *n) { 36 lua_Number num; 37 if (ttisnumber(obj)) return obj; 38 if (ttisstring(obj) && luaO_str2d(svalue(obj), &num)) { 39 setnvalue(n, num); 40 return n; 41 } 42 else 43 return NULL; 44 } 45 46 47 int luaV_tostring (lua_State *L, StkId obj) { 48 if (!ttisnumber(obj)) 49 return 0; 50 else { 51 char s[LUAI_MAXNUMBER2STR]; 52 lua_Number n = nvalue(obj); 53 lua_number2str(s, n); 54 setsvalue2s(L, obj, luaS_new(L, s)); 55 return 1; 56 } 57 } 58 59 60 static void traceexec (lua_State *L, const Instruction *pc) { 61 lu_byte mask = L->hookmask; 62 const Instruction *oldpc = L->savedpc; 63 L->savedpc = pc; 64 if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) { 65 resethookcount(L); 66 luaD_callhook(L, LUA_HOOKCOUNT, -1); 67 } 68 if (mask & LUA_MASKLINE) { 69 Proto *p = ci_func(L->ci)->l.p; 70 int npc = pcRel(pc, p); 71 int newline = getline(p, npc); 72 /* call linehook when enter a new function, when jump back (loop), 73 or when enter a new line */ 74 if (npc == 0 || pc <= oldpc || newline != getline(p, pcRel(oldpc, p))) 75 luaD_callhook(L, LUA_HOOKLINE, newline); 76 } 77 } 78 79 80 static void callTMres (lua_State *L, StkId res, const TValue *f, 81 const TValue *p1, const TValue *p2) { 82 ptrdiff_t result = savestack(L, res); 83 setobj2s(L, L->top, f); /* push function */ 84 setobj2s(L, L->top+1, p1); /* 1st argument */ 85 setobj2s(L, L->top+2, p2); /* 2nd argument */ 86 luaD_checkstack(L, 3); 87 L->top += 3; 88 luaD_call(L, L->top - 3, 1); 89 res = restorestack(L, result); 90 L->top--; 91 setobjs2s(L, res, L->top); 92 } 93 94 95 96 static void callTM (lua_State *L, const TValue *f, const TValue *p1, 97 const TValue *p2, const TValue *p3) { 98 setobj2s(L, L->top, f); /* push function */ 99 setobj2s(L, L->top+1, p1); /* 1st argument */ 100 setobj2s(L, L->top+2, p2); /* 2nd argument */ 101 setobj2s(L, L->top+3, p3); /* 3th argument */ 102 luaD_checkstack(L, 4); 103 L->top += 4; 104 luaD_call(L, L->top - 4, 0); 105 } 106 107 108 void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { 109 int loop; 110 for (loop = 0; loop < MAXTAGLOOP; loop++) { 111 const TValue *tm; 112 if (ttistable(t)) { /* `t' is a table? */ 113 Table *h = hvalue(t); 114 const TValue *res = luaH_get(h, key); /* do a primitive get */ 115 if (!ttisnil(res) || /* result is no nil? */ 116 (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */ 117 setobj2s(L, val, res); 118 return; 119 } 120 /* else will try the tag method */ 121 } 122 else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))) 123 luaG_typeerror(L, t, "index"); 124 if (ttisfunction(tm)) { 125 callTMres(L, val, tm, t, key); 126 return; 127 } 128 t = tm; /* else repeat with `tm' */ 129 } 130 luaG_runerror(L, "loop in gettable"); 131 } 132 133 134 void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) { 135 int loop; 136 TValue temp; 137 for (loop = 0; loop < MAXTAGLOOP; loop++) { 138 const TValue *tm; 139 if (ttistable(t)) { /* `t' is a table? */ 140 Table *h = hvalue(t); 141 TValue *oldval = luaH_set(L, h, key); /* do a primitive set */ 142 if (!ttisnil(oldval) || /* result is no nil? */ 143 (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ 144 setobj2t(L, oldval, val); 145 h->flags = 0; 146 luaC_barriert(L, h, val); 147 return; 148 } 149 /* else will try the tag method */ 150 } 151 else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))) 152 luaG_typeerror(L, t, "index"); 153 if (ttisfunction(tm)) { 154 callTM(L, tm, t, key, val); 155 return; 156 } 157 /* else repeat with `tm' */ 158 setobj(L, &temp, tm); /* avoid pointing inside table (may rehash) */ 159 t = &temp; 160 } 161 luaG_runerror(L, "loop in settable"); 162 } 163 164 165 static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2, 166 StkId res, TMS event) { 167 const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ 168 if (ttisnil(tm)) 169 tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ 170 if (ttisnil(tm)) return 0; 171 callTMres(L, res, tm, p1, p2); 172 return 1; 173 } 174 175 176 static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2, 177 TMS event) { 178 const TValue *tm1 = fasttm(L, mt1, event); 179 const TValue *tm2; 180 if (tm1 == NULL) return NULL; /* no metamethod */ 181 if (mt1 == mt2) return tm1; /* same metatables => same metamethods */ 182 tm2 = fasttm(L, mt2, event); 183 if (tm2 == NULL) return NULL; /* no metamethod */ 184 if (luaO_rawequalObj(tm1, tm2)) /* same metamethods? */ 185 return tm1; 186 return NULL; 187 } 188 189 190 static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2, 191 TMS event) { 192 const TValue *tm1 = luaT_gettmbyobj(L, p1, event); 193 const TValue *tm2; 194 if (ttisnil(tm1)) return -1; /* no metamethod? */ 195 tm2 = luaT_gettmbyobj(L, p2, event); 196 if (!luaO_rawequalObj(tm1, tm2)) /* different metamethods? */ 197 return -1; 198 callTMres(L, L->top, tm1, p1, p2); 199 return !l_isfalse(L->top); 200 } 201 202 203 static int l_strcmp (const TString *ls, const TString *rs) { 204 const char *l = getstr(ls); 205 size_t ll = ls->tsv.len; 206 const char *r = getstr(rs); 207 size_t lr = rs->tsv.len; 208 for (;;) { 209 int temp = strcoll(l, r); 210 if (temp != 0) return temp; 211 else { /* strings are equal up to a `\0' */ 212 size_t len = strlen(l); /* index of first `\0' in both strings */ 213 if (len == lr) /* r is finished? */ 214 return (len == ll) ? 0 : 1; 215 else if (len == ll) /* l is finished? */ 216 return -1; /* l is smaller than r (because r is not finished) */ 217 /* both strings longer than `len'; go on comparing (after the `\0') */ 218 len++; 219 l += len; ll -= len; r += len; lr -= len; 220 } 221 } 222 } 223 224 225 int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { 226 int res; 227 if (ttype(l) != ttype(r)) 228 return luaG_ordererror(L, l, r); 229 else if (ttisnumber(l)) 230 return luai_numlt(nvalue(l), nvalue(r)); 231 else if (ttisstring(l)) 232 return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0; 233 else if ((res = call_orderTM(L, l, r, TM_LT)) != -1) 234 return res; 235 return luaG_ordererror(L, l, r); 236 } 237 238 239 static int lessequal (lua_State *L, const TValue *l, const TValue *r) { 240 int res; 241 if (ttype(l) != ttype(r)) 242 return luaG_ordererror(L, l, r); 243 else if (ttisnumber(l)) 244 return luai_numle(nvalue(l), nvalue(r)); 245 else if (ttisstring(l)) 246 return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0; 247 else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */ 248 return res; 249 else if ((res = call_orderTM(L, r, l, TM_LT)) != -1) /* else try `lt' */ 250 return !res; 251 return luaG_ordererror(L, l, r); 252 } 253 254 255 int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) { 256 const TValue *tm; 257 lua_assert(ttype(t1) == ttype(t2)); 258 switch (ttype(t1)) { 259 case LUA_TNIL: return 1; 260 case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2)); 261 case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */ 262 case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); 263 case LUA_TUSERDATA: { 264 if (uvalue(t1) == uvalue(t2)) return 1; 265 tm = get_compTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable, 266 TM_EQ); 267 break; /* will try TM */ 268 } 269 case LUA_TTABLE: { 270 if (hvalue(t1) == hvalue(t2)) return 1; 271 tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ); 272 break; /* will try TM */ 273 } 274 default: return gcvalue(t1) == gcvalue(t2); 275 } 276 if (tm == NULL) return 0; /* no TM? */ 277 callTMres(L, L->top, tm, t1, t2); /* call TM */ 278 return !l_isfalse(L->top); 279 } 280 281 282 void luaV_concat (lua_State *L, int total, int last) { 283 do { 284 StkId top = L->base + last + 1; 285 int n = 2; /* number of elements handled in this pass (at least 2) */ 286 if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) { 287 if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) 288 luaG_concaterror(L, top-2, top-1); 289 } else if (tsvalue(top-1)->len == 0) /* second op is empty? */ 290 (void)tostring(L, top - 2); /* result is first op (as string) */ 291 else { 292 /* at least two string values; get as many as possible */ 293 size_t tl = tsvalue(top-1)->len; 294 char *buffer; 295 int i; 296 /* collect total length */ 297 for (n = 1; n < total && tostring(L, top-n-1); n++) { 298 size_t l = tsvalue(top-n-1)->len; 299 if (l >= MAX_SIZET - tl) luaG_runerror(L, "string length overflow"); 300 tl += l; 301 } 302 buffer = luaZ_openspace(L, &G(L)->buff, tl); 303 tl = 0; 304 for (i=n; i>0; i--) { /* concat all strings */ 305 size_t l = tsvalue(top-i)->len; 306 memcpy(buffer+tl, svalue(top-i), l); 307 tl += l; 308 } 309 setsvalue2s(L, top-n, luaS_newlstr(L, buffer, tl)); 310 } 311 total -= n-1; /* got `n' strings to create 1 new */ 312 last -= n-1; 313 } while (total > 1); /* repeat until only 1 result left */ 314 } 315 316 317 static void Arith (lua_State *L, StkId ra, const TValue *rb, 318 const TValue *rc, TMS op) { 319 TValue tempb, tempc; 320 const TValue *b, *c; 321 if ((b = luaV_tonumber(rb, &tempb)) != NULL && 322 (c = luaV_tonumber(rc, &tempc)) != NULL) { 323 lua_Number nb = nvalue(b), nc = nvalue(c); 324 switch (op) { 325 case TM_ADD: setnvalue(ra, luai_numadd(nb, nc)); break; 326 case TM_SUB: setnvalue(ra, luai_numsub(nb, nc)); break; 327 case TM_MUL: setnvalue(ra, luai_nummul(nb, nc)); break; 328 case TM_DIV: setnvalue(ra, luai_numdiv(nb, nc)); break; 329 case TM_MOD: setnvalue(ra, luai_nummod(nb, nc)); break; 330 case TM_POW: setnvalue(ra, luai_numpow(nb, nc)); break; 331 case TM_UNM: setnvalue(ra, luai_numunm(nb)); break; 332 default: lua_assert(0); break; 333 } 334 } 335 else if (!call_binTM(L, rb, rc, ra, op)) 336 luaG_aritherror(L, rb, rc); 337 } 338 339 340 341 /* 342 ** some macros for common tasks in `luaV_execute' 343 */ 344 345 #define runtime_check(L, c) { if (!(c)) break; } 346 347 #define RA(i) (base+GETARG_A(i)) 348 /* to be used after possible stack reallocation */ 349 #define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i)) 350 #define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) 351 #define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ 352 ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i)) 353 #define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ 354 ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i)) 355 #define KBx(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i)) 356 357 358 #define dojump(L,pc,i) {(pc) += (i); luai_threadyield(L);} 359 360 361 #define Protect(x) { L->savedpc = pc; {x;}; base = L->base; } 362 363 364 #define arith_op(op,tm) { \ 365 TValue *rb = RKB(i); \ 366 TValue *rc = RKC(i); \ 367 if (ttisnumber(rb) && ttisnumber(rc)) { \ 368 lua_Number nb = nvalue(rb), nc = nvalue(rc); \ 369 setnvalue(ra, op(nb, nc)); \ 370 } \ 371 else \ 372 Protect(Arith(L, ra, rb, rc, tm)); \ 373 } 374 375 376 377 void luaV_execute (lua_State *L, int nexeccalls) { 378 LClosure *cl; 379 StkId base; 380 TValue *k; 381 const Instruction *pc; 382 reentry: /* entry point */ 383 lua_assert(isLua(L->ci)); 384 pc = L->savedpc; 385 cl = &clvalue(L->ci->func)->l; 386 base = L->base; 387 k = cl->p->k; 388 /* main loop of interpreter */ 389 for (;;) { 390 const Instruction i = *pc++; 391 StkId ra; 392 if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) && 393 (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { 394 traceexec(L, pc); 395 if (L->status == LUA_YIELD) { /* did hook yield? */ 396 L->savedpc = pc - 1; 397 return; 398 } 399 base = L->base; 400 } 401 /* warning!! several calls may realloc the stack and invalidate `ra' */ 402 ra = RA(i); 403 lua_assert(base == L->base && L->base == L->ci->base); 404 lua_assert(base <= L->top && L->top <= L->stack + L->stacksize); 405 lua_assert(L->top == L->ci->top || luaG_checkopenop(i)); 406 switch (GET_OPCODE(i)) { 407 case OP_MOVE: { 408 setobjs2s(L, ra, RB(i)); 409 continue; 410 } 411 case OP_LOADK: { 412 setobj2s(L, ra, KBx(i)); 413 continue; 414 } 415 case OP_LOADBOOL: { 416 setbvalue(ra, GETARG_B(i)); 417 if (GETARG_C(i)) pc++; /* skip next instruction (if C) */ 418 continue; 419 } 420 case OP_LOADNIL: { 421 TValue *rb = RB(i); 422 do { 423 setnilvalue(rb--); 424 } while (rb >= ra); 425 continue; 426 } 427 case OP_GETUPVAL: { 428 int b = GETARG_B(i); 429 setobj2s(L, ra, cl->upvals[b]->v); 430 continue; 431 } 432 case OP_GETGLOBAL: { 433 TValue g; 434 TValue *rb = KBx(i); 435 sethvalue(L, &g, cl->env); 436 lua_assert(ttisstring(rb)); 437 Protect(luaV_gettable(L, &g, rb, ra)); 438 continue; 439 } 440 case OP_GETTABLE: { 441 Protect(luaV_gettable(L, RB(i), RKC(i), ra)); 442 continue; 443 } 444 case OP_SETGLOBAL: { 445 TValue g; 446 sethvalue(L, &g, cl->env); 447 lua_assert(ttisstring(KBx(i))); 448 Protect(luaV_settable(L, &g, KBx(i), ra)); 449 continue; 450 } 451 case OP_SETUPVAL: { 452 UpVal *uv = cl->upvals[GETARG_B(i)]; 453 setobj(L, uv->v, ra); 454 luaC_barrier(L, uv, ra); 455 continue; 456 } 457 case OP_SETTABLE: { 458 Protect(luaV_settable(L, ra, RKB(i), RKC(i))); 459 continue; 460 } 461 case OP_NEWTABLE: { 462 int b = GETARG_B(i); 463 int c = GETARG_C(i); 464 sethvalue(L, ra, luaH_new(L, luaO_fb2int(b), luaO_fb2int(c))); 465 Protect(luaC_checkGC(L)); 466 continue; 467 } 468 case OP_SELF: { 469 StkId rb = RB(i); 470 setobjs2s(L, ra+1, rb); 471 Protect(luaV_gettable(L, rb, RKC(i), ra)); 472 continue; 473 } 474 case OP_ADD: { 475 arith_op(luai_numadd, TM_ADD); 476 continue; 477 } 478 case OP_SUB: { 479 arith_op(luai_numsub, TM_SUB); 480 continue; 481 } 482 case OP_MUL: { 483 arith_op(luai_nummul, TM_MUL); 484 continue; 485 } 486 case OP_DIV: { 487 arith_op(luai_numdiv, TM_DIV); 488 continue; 489 } 490 case OP_MOD: { 491 arith_op(luai_nummod, TM_MOD); 492 continue; 493 } 494 case OP_POW: { 495 arith_op(luai_numpow, TM_POW); 496 continue; 497 } 498 case OP_UNM: { 499 TValue *rb = RB(i); 500 if (ttisnumber(rb)) { 501 lua_Number nb = nvalue(rb); 502 setnvalue(ra, luai_numunm(nb)); 503 } 504 else { 505 Protect(Arith(L, ra, rb, rb, TM_UNM)); 506 } 507 continue; 508 } 509 case OP_NOT: { 510 int res = l_isfalse(RB(i)); /* next assignment may change this value */ 511 setbvalue(ra, res); 512 continue; 513 } 514 case OP_LEN: { 515 const TValue *rb = RB(i); 516 switch (ttype(rb)) { 517 case LUA_TTABLE: { 518 setnvalue(ra, cast_num(luaH_getn(hvalue(rb)))); 519 break; 520 } 521 case LUA_TSTRING: { 522 setnvalue(ra, cast_num(tsvalue(rb)->len)); 523 break; 524 } 525 default: { /* try metamethod */ 526 Protect( 527 if (!call_binTM(L, rb, luaO_nilobject, ra, TM_LEN)) 528 luaG_typeerror(L, rb, "get length of"); 529 ) 530 } 531 } 532 continue; 533 } 534 case OP_CONCAT: { 535 int b = GETARG_B(i); 536 int c = GETARG_C(i); 537 Protect(luaV_concat(L, c-b+1, c); luaC_checkGC(L)); 538 setobjs2s(L, RA(i), base+b); 539 continue; 540 } 541 case OP_JMP: { 542 dojump(L, pc, GETARG_sBx(i)); 543 continue; 544 } 545 case OP_EQ: { 546 TValue *rb = RKB(i); 547 TValue *rc = RKC(i); 548 Protect( 549 if (equalobj(L, rb, rc) == GETARG_A(i)) 550 dojump(L, pc, GETARG_sBx(*pc)); 551 ) 552 pc++; 553 continue; 554 } 555 case OP_LT: { 556 Protect( 557 if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i)) 558 dojump(L, pc, GETARG_sBx(*pc)); 559 ) 560 pc++; 561 continue; 562 } 563 case OP_LE: { 564 Protect( 565 if (lessequal(L, RKB(i), RKC(i)) == GETARG_A(i)) 566 dojump(L, pc, GETARG_sBx(*pc)); 567 ) 568 pc++; 569 continue; 570 } 571 case OP_TEST: { 572 if (l_isfalse(ra) != GETARG_C(i)) 573 dojump(L, pc, GETARG_sBx(*pc)); 574 pc++; 575 continue; 576 } 577 case OP_TESTSET: { 578 TValue *rb = RB(i); 579 if (l_isfalse(rb) != GETARG_C(i)) { 580 setobjs2s(L, ra, rb); 581 dojump(L, pc, GETARG_sBx(*pc)); 582 } 583 pc++; 584 continue; 585 } 586 case OP_CALL: { 587 int b = GETARG_B(i); 588 int nresults = GETARG_C(i) - 1; 589 if (b != 0) L->top = ra+b; /* else previous instruction set top */ 590 L->savedpc = pc; 591 switch (luaD_precall(L, ra, nresults)) { 592 case PCRLUA: { 593 nexeccalls++; 594 goto reentry; /* restart luaV_execute over new Lua function */ 595 } 596 case PCRC: { 597 /* it was a C function (`precall' called it); adjust results */ 598 if (nresults >= 0) L->top = L->ci->top; 599 base = L->base; 600 continue; 601 } 602 default: { 603 return; /* yield */ 604 } 605 } 606 } 607 case OP_TAILCALL: { 608 int b = GETARG_B(i); 609 if (b != 0) L->top = ra+b; /* else previous instruction set top */ 610 L->savedpc = pc; 611 lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); 612 switch (luaD_precall(L, ra, LUA_MULTRET)) { 613 case PCRLUA: { 614 /* tail call: put new frame in place of previous one */ 615 CallInfo *ci = L->ci - 1; /* previous frame */ 616 int aux; 617 StkId func = ci->func; 618 StkId pfunc = (ci+1)->func; /* previous function index */ 619 if (L->openupval) luaF_close(L, ci->base); 620 L->base = ci->base = ci->func + ((ci+1)->base - pfunc); 621 for (aux = 0; pfunc+aux < L->top; aux++) /* move frame down */ 622 setobjs2s(L, func+aux, pfunc+aux); 623 ci->top = L->top = func+aux; /* correct top */ 624 lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize); 625 ci->savedpc = L->savedpc; 626 ci->tailcalls++; /* one more call lost */ 627 L->ci--; /* remove new frame */ 628 goto reentry; 629 } 630 case PCRC: { /* it was a C function (`precall' called it) */ 631 base = L->base; 632 continue; 633 } 634 default: { 635 return; /* yield */ 636 } 637 } 638 } 639 case OP_RETURN: { 640 int b = GETARG_B(i); 641 if (b != 0) L->top = ra+b-1; 642 if (L->openupval) luaF_close(L, base); 643 L->savedpc = pc; 644 b = luaD_poscall(L, ra); 645 if (--nexeccalls == 0) /* was previous function running `here'? */ 646 return; /* no: return */ 647 else { /* yes: continue its execution */ 648 if (b) L->top = L->ci->top; 649 lua_assert(isLua(L->ci)); 650 lua_assert(GET_OPCODE(*((L->ci)->savedpc - 1)) == OP_CALL); 651 goto reentry; 652 } 653 } 654 case OP_FORLOOP: { 655 lua_Number step = nvalue(ra+2); 656 lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */ 657 lua_Number limit = nvalue(ra+1); 658 if (luai_numlt(0, step) ? luai_numle(idx, limit) 659 : luai_numle(limit, idx)) { 660 dojump(L, pc, GETARG_sBx(i)); /* jump back */ 661 setnvalue(ra, idx); /* update internal index... */ 662 setnvalue(ra+3, idx); /* ...and external index */ 663 } 664 continue; 665 } 666 case OP_FORPREP: { 667 const TValue *init = ra; 668 const TValue *plimit = ra+1; 669 const TValue *pstep = ra+2; 670 L->savedpc = pc; /* next steps may throw errors */ 671 if (!tonumber(init, ra)) 672 luaG_runerror(L, LUA_QL("for") " initial value must be a number"); 673 else if (!tonumber(plimit, ra+1)) 674 luaG_runerror(L, LUA_QL("for") " limit must be a number"); 675 else if (!tonumber(pstep, ra+2)) 676 luaG_runerror(L, LUA_QL("for") " step must be a number"); 677 setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep))); 678 dojump(L, pc, GETARG_sBx(i)); 679 continue; 680 } 681 case OP_TFORLOOP: { 682 StkId cb = ra + 3; /* call base */ 683 setobjs2s(L, cb+2, ra+2); 684 setobjs2s(L, cb+1, ra+1); 685 setobjs2s(L, cb, ra); 686 L->top = cb+3; /* func. + 2 args (state and index) */ 687 Protect(luaD_call(L, cb, GETARG_C(i))); 688 L->top = L->ci->top; 689 cb = RA(i) + 3; /* previous call may change the stack */ 690 if (!ttisnil(cb)) { /* continue loop? */ 691 setobjs2s(L, cb-1, cb); /* save control variable */ 692 dojump(L, pc, GETARG_sBx(*pc)); /* jump back */ 693 } 694 pc++; 695 continue; 696 } 697 case OP_SETLIST: { 698 int n = GETARG_B(i); 699 int c = GETARG_C(i); 700 int last; 701 Table *h; 702 if (n == 0) { 703 n = cast_int(L->top - ra) - 1; 704 L->top = L->ci->top; 705 } 706 if (c == 0) c = cast_int(*pc++); 707 runtime_check(L, ttistable(ra)); 708 h = hvalue(ra); 709 last = ((c-1)*LFIELDS_PER_FLUSH) + n; 710 if (last > h->sizearray) /* needs more space? */ 711 luaH_resizearray(L, h, last); /* pre-alloc it at once */ 712 for (; n > 0; n--) { 713 TValue *val = ra+n; 714 setobj2t(L, luaH_setnum(L, h, last--), val); 715 luaC_barriert(L, h, val); 716 } 717 continue; 718 } 719 case OP_CLOSE: { 720 luaF_close(L, ra); 721 continue; 722 } 723 case OP_CLOSURE: { 724 Proto *p; 725 Closure *ncl; 726 int nup, j; 727 p = cl->p->p[GETARG_Bx(i)]; 728 nup = p->nups; 729 ncl = luaF_newLclosure(L, nup, cl->env); 730 ncl->l.p = p; 731 for (j=0; j<nup; j++, pc++) { 732 if (GET_OPCODE(*pc) == OP_GETUPVAL) 733 ncl->l.upvals[j] = cl->upvals[GETARG_B(*pc)]; 734 else { 735 lua_assert(GET_OPCODE(*pc) == OP_MOVE); 736 ncl->l.upvals[j] = luaF_findupval(L, base + GETARG_B(*pc)); 737 } 738 } 739 setclvalue(L, ra, ncl); 740 Protect(luaC_checkGC(L)); 741 continue; 742 } 743 case OP_VARARG: { 744 int b = GETARG_B(i) - 1; 745 int j; 746 CallInfo *ci = L->ci; 747 int n = cast_int(ci->base - ci->func) - cl->p->numparams - 1; 748 if (b == LUA_MULTRET) { 749 Protect(luaD_checkstack(L, n)); 750 ra = RA(i); /* previous call may change the stack */ 751 b = n; 752 L->top = ra + n; 753 } 754 for (j = 0; j < b; j++) { 755 if (j < n) { 756 setobjs2s(L, ra + j, ci->base - n + j); 757 } 758 else { 759 setnilvalue(ra + j); 760 } 761 } 762 continue; 763 } 764 } 765 } 766 } 767 768