summaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-04-04 17:48:44 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-04-04 17:48:44 -0300
commit4e7e9e8de5b9e50694e161653ef03b5c15a53054 (patch)
treea908866ce0a34b591c92b67143ac581861aeb216 /lvm.c
parent3e45496295bef65692f690d1633a9ce6ad9408b0 (diff)
downloadlua-4e7e9e8de5b9e50694e161653ef03b5c15a53054.tar.gz
lua-4e7e9e8de5b9e50694e161653ef03b5c15a53054.tar.bz2
lua-4e7e9e8de5b9e50694e161653ef03b5c15a53054.zip
new opcode INCLOCAL.
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c41
1 files changed, 28 insertions, 13 deletions
diff --git a/lvm.c b/lvm.c
index 96159c0c..2a8e2484 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.97 2000/03/27 20:10:21 roberto Exp roberto $ 2** $Id: lvm.c,v 1.98 2000/03/29 20:19:20 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -365,9 +365,9 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) {
365 case OP_PUSHNIL: { 365 case OP_PUSHNIL: {
366 int n = GETARG_U(i); 366 int n = GETARG_U(i);
367 LUA_ASSERT(L, n>0, "invalid argument"); 367 LUA_ASSERT(L, n>0, "invalid argument");
368 do { 368 do {
369 ttype(top++) = TAG_NIL; 369 ttype(top++) = TAG_NIL;
370 } while (--n > 0); 370 } while (--n > 0);
371 break; 371 break;
372 } 372 }
373 373
@@ -491,6 +491,21 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) {
491 top--; 491 top--;
492 break; 492 break;
493 493
494 case OP_INCLOCAL: {
495 TObject *var = base+GETARG_B(i);
496 int n = GETARG_sA(i);
497 if (tonumber(var)) {
498 *top = *var; /* PUSHLOCAL */
499 ttype(top+1) = TAG_NUMBER;
500 nvalue(top+1) = (Number)n; /* PUSHINT */
501 call_arith(L, top+2, IM_ADD);
502 *var = *top; /* SETLOCAL */
503 }
504 else
505 nvalue(var) += (Number)n;
506 break;
507 }
508
494 case OP_ADDI: 509 case OP_ADDI:
495 if (tonumber(top-1)) { 510 if (tonumber(top-1)) {
496 ttype(top) = TAG_NUMBER; 511 ttype(top) = TAG_NUMBER;
@@ -554,50 +569,50 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) {
554 nvalue(top-1) = 1; 569 nvalue(top-1) = 1;
555 break; 570 break;
556 571
557 case OP_IFNEQJMP: 572 case OP_JMPNEQ:
558 top -= 2; 573 top -= 2;
559 if (!luaO_equalObj(top, top+1)) pc += GETARG_S(i); 574 if (!luaO_equalObj(top, top+1)) pc += GETARG_S(i);
560 break; 575 break;
561 576
562 case OP_IFEQJMP: 577 case OP_JMPEQ:
563 top -= 2; 578 top -= 2;
564 if (luaO_equalObj(top, top+1)) pc += GETARG_S(i); 579 if (luaO_equalObj(top, top+1)) pc += GETARG_S(i);
565 break; 580 break;
566 581
567 case OP_IFLTJMP: 582 case OP_JMPLT:
568 top -= 2; 583 top -= 2;
569 if (luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); 584 if (luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i);
570 break; 585 break;
571 586
572 case OP_IFLEJMP: /* a <= b === !(b<a) */ 587 case OP_JMPLE: /* a <= b === !(b<a) */
573 top -= 2; 588 top -= 2;
574 if (!luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); 589 if (!luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i);
575 break; 590 break;
576 591
577 case OP_IFGTJMP: /* a > b === (b<a) */ 592 case OP_JMPGT: /* a > b === (b<a) */
578 top -= 2; 593 top -= 2;
579 if (luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); 594 if (luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i);
580 break; 595 break;
581 596
582 case OP_IFGEJMP: /* a >= b === !(a<b) */ 597 case OP_JMPGE: /* a >= b === !(a<b) */
583 top -= 2; 598 top -= 2;
584 if (!luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); 599 if (!luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i);
585 break; 600 break;
586 601
587 case OP_IFTJMP: 602 case OP_JMPT:
588 if (ttype(--top) != TAG_NIL) pc += GETARG_S(i); 603 if (ttype(--top) != TAG_NIL) pc += GETARG_S(i);
589 break; 604 break;
590 605
591 case OP_IFFJMP: 606 case OP_JMPF:
592 if (ttype(--top) == TAG_NIL) pc += GETARG_S(i); 607 if (ttype(--top) == TAG_NIL) pc += GETARG_S(i);
593 break; 608 break;
594 609
595 case OP_ONTJMP: 610 case OP_JMPONT:
596 if (ttype(top-1) != TAG_NIL) pc += GETARG_S(i); 611 if (ttype(top-1) != TAG_NIL) pc += GETARG_S(i);
597 else top--; 612 else top--;
598 break; 613 break;
599 614
600 case OP_ONFJMP: 615 case OP_JMPONF:
601 if (ttype(top-1) == TAG_NIL) pc += GETARG_S(i); 616 if (ttype(top-1) == TAG_NIL) pc += GETARG_S(i);
602 else top--; 617 else top--;
603 break; 618 break;