lvm.c
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:23k
源码类别:

其他游戏

开发平台:

Visual C++

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