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 /lvm.c | |
parent | 44358e0206c3ec034a6a06e7ad4dc5e254874201 (diff) | |
download | lua-d4f0c4435d026e5621b4b777c872815cee6f57bb.tar.gz lua-d4f0c4435d026e5621b4b777c872815cee6f57bb.tar.bz2 lua-d4f0c4435d026e5621b4b777c872815cee6f57bb.zip |
a few more operations supporting integers (minus, umin, mult)
Diffstat (limited to 'lvm.c')
-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 { |