diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-04-16 15:43:05 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-04-16 15:43:05 -0300 |
| commit | d4f0c4435d026e5621b4b777c872815cee6f57bb (patch) | |
| tree | ca239d7d16e2ae5e9ee5dcef172ea8aded431df9 | |
| parent | 44358e0206c3ec034a6a06e7ad4dc5e254874201 (diff) | |
| download | lua-d4f0c4435d026e5621b4b777c872815cee6f57bb.tar.gz lua-d4f0c4435d026e5621b4b777c872815cee6f57bb.tar.bz2 lua-d4f0c4435d026e5621b4b777c872815cee6f57bb.zip | |
a few more operations supporting integers (minus, umin, mult)
| -rw-r--r-- | lvm.c | 60 |
1 files changed, 47 insertions, 13 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 2.154 2012/08/16 17:34:28 roberto Exp $ | 2 | ** $Id: lvm.c,v 2.157 2013/04/15 15:44:46 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 | */ |
| @@ -624,23 +624,53 @@ void luaV_execute (lua_State *L) { | |||
| 624 | setobjs2s(L, ra+1, rb); | 624 | setobjs2s(L, ra+1, rb); |
| 625 | Protect(luaV_gettable(L, rb, RKC(i), ra)); | 625 | Protect(luaV_gettable(L, rb, RKC(i), ra)); |
| 626 | ) | 626 | ) |
| 627 | vmcase(OP_ADD, | 627 | vmcase(OP_ADD, |
| 628 | TValue *rb1 = RKB(i); | 628 | TValue *rb = RKB(i); |
| 629 | TValue *rc1 = RKC(i); | 629 | TValue *rc = RKC(i); |
| 630 | if (ttisinteger(rb1) && ttisinteger(rc1)) { | 630 | if (ttisinteger(rb) && ttisinteger(rc)) { |
| 631 | lua_Integer ib = ivalue(rb1); lua_Integer ic = ivalue(rc1); | 631 | lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); |
| 632 | setivalue(ra, ib + ic); | 632 | setivalue(ra, ib + ic); |
| 633 | } | 633 | } |
| 634 | else arith_op(luai_numadd, TM_ADD); | 634 | else if (ttisnumber(rb) && ttisnumber(rc)) { |
| 635 | lua_Number nb = nvalue(rb); lua_Number nc = nvalue(rc); | ||
| 636 | setnvalue(ra, luai_numadd(L, nb, nc)); | ||
| 637 | } | ||
| 638 | else { Protect(luaV_arith(L, ra, rb, rc, TM_ADD)); } | ||
| 635 | ) | 639 | ) |
| 636 | vmcase(OP_SUB, | 640 | vmcase(OP_SUB, |
| 637 | arith_op(luai_numsub, TM_SUB); | 641 | TValue *rb = RKB(i); |
| 642 | TValue *rc = RKC(i); | ||
| 643 | if (ttisinteger(rb) && ttisinteger(rc)) { | ||
| 644 | lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); | ||
| 645 | setivalue(ra, ib - ic); | ||
| 646 | } | ||
| 647 | else if (ttisnumber(rb) && ttisnumber(rc)) { | ||
| 648 | lua_Number nb = nvalue(rb); lua_Number nc = nvalue(rc); | ||
| 649 | setnvalue(ra, luai_numsub(L, nb, nc)); | ||
| 650 | } | ||
| 651 | else { Protect(luaV_arith(L, ra, rb, rc, TM_SUB)); } | ||
| 638 | ) | 652 | ) |
| 639 | vmcase(OP_MUL, | 653 | vmcase(OP_MUL, |
| 640 | arith_op(luai_nummul, TM_MUL); | 654 | TValue *rb = RKB(i); |
| 655 | TValue *rc = RKC(i); | ||
| 656 | if (ttisinteger(rb) && ttisinteger(rc)) { | ||
| 657 | lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); | ||
| 658 | setivalue(ra, ib * ic); | ||
| 659 | } | ||
| 660 | else if (ttisnumber(rb) && ttisnumber(rc)) { | ||
| 661 | lua_Number nb = nvalue(rb); lua_Number nc = nvalue(rc); | ||
| 662 | setnvalue(ra, luai_nummul(L, nb, nc)); | ||
| 663 | } | ||
| 664 | else { Protect(luaV_arith(L, ra, rb, rc, TM_MUL)); } | ||
| 641 | ) | 665 | ) |
| 642 | vmcase(OP_DIV, | 666 | vmcase(OP_DIV, /* float division (always with floats) */ |
| 643 | arith_op(luai_numdiv, TM_DIV); | 667 | TValue *rb = RKB(i); |
| 668 | TValue *rc = RKC(i); | ||
| 669 | if (ttisnumber(rb) && ttisnumber(rc)) { | ||
| 670 | lua_Number nb = nvalue(rb); lua_Number nc = nvalue(rc); | ||
| 671 | setnvalue(ra, luai_numdiv(L, nb, nc)); | ||
| 672 | } | ||
| 673 | else { Protect(luaV_arith(L, ra, rb, rc, TM_DIV)); } | ||
| 644 | ) | 674 | ) |
| 645 | vmcase(OP_MOD, | 675 | vmcase(OP_MOD, |
| 646 | arith_op(luai_nummod, TM_MOD); | 676 | arith_op(luai_nummod, TM_MOD); |
| @@ -650,8 +680,12 @@ void luaV_execute (lua_State *L) { | |||
| 650 | ) | 680 | ) |
| 651 | vmcase(OP_UNM, | 681 | vmcase(OP_UNM, |
| 652 | TValue *rb = RB(i); | 682 | TValue *rb = RB(i); |
| 653 | if (ttisnumber(rb)) { | 683 | if (ttisinteger(rb)) { |
| 654 | lua_Number nb = nvalue(rb); | 684 | lua_Integer ib = ivalue(rb); |
| 685 | setivalue(ra, -ib); | ||
| 686 | } | ||
| 687 | else if (ttisfloat(rb)) { | ||
| 688 | lua_Number nb = fltvalue(rb); | ||
| 655 | setnvalue(ra, luai_numunm(L, nb)); | 689 | setnvalue(ra, luai_numunm(L, nb)); |
| 656 | } | 690 | } |
| 657 | else { | 691 | else { |
