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-4e7e9e8de5b9e50694e161653ef03b5c15a53054.tar.gz lua-4e7e9e8de5b9e50694e161653ef03b5c15a53054.tar.bz2 lua-4e7e9e8de5b9e50694e161653ef03b5c15a53054.zip |
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 @@ | |||
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; |