diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-04-04 17:48:44 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-04-04 17:48:44 -0300 |
commit | 4e7e9e8de5b9e50694e161653ef03b5c15a53054 (patch) | |
tree | a908866ce0a34b591c92b67143ac581861aeb216 /lvm.c | |
parent | 3e45496295bef65692f690d1633a9ce6ad9408b0 (diff) | |
download | lua-github-4e7e9e8de5b9e50694e161653ef03b5c15a53054.tar.gz |
new opcode INCLOCAL.
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 41 |
1 files changed, 28 insertions, 13 deletions
@@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 1.97 2000/03/27 20:10:21 roberto Exp roberto $ +** $Id: lvm.c,v 1.98 2000/03/29 20:19:20 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -365,9 +365,9 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { case OP_PUSHNIL: { int n = GETARG_U(i); LUA_ASSERT(L, n>0, "invalid argument"); - do { + do { ttype(top++) = TAG_NIL; - } while (--n > 0); + } while (--n > 0); break; } @@ -491,6 +491,21 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { top--; break; + case OP_INCLOCAL: { + TObject *var = base+GETARG_B(i); + int n = GETARG_sA(i); + if (tonumber(var)) { + *top = *var; /* PUSHLOCAL */ + ttype(top+1) = TAG_NUMBER; + nvalue(top+1) = (Number)n; /* PUSHINT */ + call_arith(L, top+2, IM_ADD); + *var = *top; /* SETLOCAL */ + } + else + nvalue(var) += (Number)n; + break; + } + case OP_ADDI: if (tonumber(top-1)) { ttype(top) = TAG_NUMBER; @@ -554,50 +569,50 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { nvalue(top-1) = 1; break; - case OP_IFNEQJMP: + case OP_JMPNEQ: top -= 2; if (!luaO_equalObj(top, top+1)) pc += GETARG_S(i); break; - case OP_IFEQJMP: + case OP_JMPEQ: top -= 2; if (luaO_equalObj(top, top+1)) pc += GETARG_S(i); break; - case OP_IFLTJMP: + case OP_JMPLT: top -= 2; if (luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); break; - case OP_IFLEJMP: /* a <= b === !(b<a) */ + case OP_JMPLE: /* a <= b === !(b<a) */ top -= 2; if (!luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); break; - case OP_IFGTJMP: /* a > b === (b<a) */ + case OP_JMPGT: /* a > b === (b<a) */ top -= 2; if (luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); break; - case OP_IFGEJMP: /* a >= b === !(a<b) */ + case OP_JMPGE: /* a >= b === !(a<b) */ top -= 2; if (!luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); break; - case OP_IFTJMP: + case OP_JMPT: if (ttype(--top) != TAG_NIL) pc += GETARG_S(i); break; - case OP_IFFJMP: + case OP_JMPF: if (ttype(--top) == TAG_NIL) pc += GETARG_S(i); break; - case OP_ONTJMP: + case OP_JMPONT: if (ttype(top-1) != TAG_NIL) pc += GETARG_S(i); else top--; break; - case OP_ONFJMP: + case OP_JMPONF: if (ttype(top-1) == TAG_NIL) pc += GETARG_S(i); else top--; break; |