diff options
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 27 |
1 files changed, 24 insertions, 3 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 2.271 2017/04/20 19:53:55 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.272 2017/04/24 20:26:39 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 | */ |
@@ -725,10 +725,10 @@ void luaV_finishOp (lua_State *L) { | |||
725 | 725 | ||
726 | 726 | ||
727 | #define RA(i) (base+GETARG_A(i)) | 727 | #define RA(i) (base+GETARG_A(i)) |
728 | #define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i)) | 728 | #define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_Br(i)) |
729 | #define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) | 729 | #define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) |
730 | #define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ | 730 | #define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ |
731 | ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i)) | 731 | (GETARG_Bk(i)) ? k+GETARG_Br(i) : base+GETARG_Br(i)) |
732 | #define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ | 732 | #define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ |
733 | ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i)) | 733 | ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i)) |
734 | 734 | ||
@@ -898,6 +898,27 @@ void luaV_execute (lua_State *L) { | |||
898 | else Protect(luaV_finishget(L, rb, rc, ra, slot)); | 898 | else Protect(luaV_finishget(L, rb, rc, ra, slot)); |
899 | vmbreak; | 899 | vmbreak; |
900 | } | 900 | } |
901 | vmcase(OP_ADDI) { | ||
902 | TValue *rb = RB(i); | ||
903 | int ic = GETARG_C(i); | ||
904 | lua_Number nb; | ||
905 | if (ttisinteger(rb)) { | ||
906 | setivalue(ra, intop(+, ivalue(rb), ic)); | ||
907 | } | ||
908 | else if (tonumber(rb, &nb)) { | ||
909 | setfltvalue(ra, luai_numadd(L, nb, cast_num(ic))); | ||
910 | } | ||
911 | else { | ||
912 | TValue aux; TValue *rc; | ||
913 | setivalue(&aux, ic); | ||
914 | if (GETARG_Bk(i)) { /* arguments were exchanged? */ | ||
915 | rc = rb; rb = &aux; /* correct them */ | ||
916 | } | ||
917 | else rc = &aux; | ||
918 | Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); | ||
919 | } | ||
920 | vmbreak; | ||
921 | } | ||
901 | vmcase(OP_ADD) { | 922 | vmcase(OP_ADD) { |
902 | TValue *rb = RKB(i); | 923 | TValue *rb = RKB(i); |
903 | TValue *rc = RKC(i); | 924 | TValue *rc = RKC(i); |