aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-07-07 13:34:32 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-07-07 13:34:32 -0300
commit4dff277255e3785b76b6b52fe2a98592e6cbc834 (patch)
treee3607d2aab29b6e0dbd46ac1acc81e9c6bf08dd7 /lvm.c
parent07db10813cb044252c18973688f63b5eac6a90a6 (diff)
downloadlua-4dff277255e3785b76b6b52fe2a98592e6cbc834.tar.gz
lua-4dff277255e3785b76b6b52fe2a98592e6cbc834.tar.bz2
lua-4dff277255e3785b76b6b52fe2a98592e6cbc834.zip
coercion string->number in arithmetic operations moved to string
library
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/lvm.c b/lvm.c
index 8f8cc49f..18799be7 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.288 2017/06/29 15:06:44 roberto Exp roberto $ 2** $Id: lvm.c,v 2.289 2017/06/29 15:38:41 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*/
@@ -35,7 +35,6 @@
35#define MAXTAGLOOP 2000 35#define MAXTAGLOOP 2000
36 36
37 37
38
39/* 38/*
40** 'l_intfitsf' checks whether a given integer can be converted to a 39** 'l_intfitsf' checks whether a given integer can be converted to a
41** float without rounding. Used in comparisons. Left undefined if 40** float without rounding. Used in comparisons. Left undefined if
@@ -997,7 +996,7 @@ void luaV_execute (lua_State *L) {
997 if (ttisinteger(rb)) { 996 if (ttisinteger(rb)) {
998 setivalue(s2v(ra), intop(+, ivalue(rb), ic)); 997 setivalue(s2v(ra), intop(+, ivalue(rb), ic));
999 } 998 }
1000 else if (tonumber(rb, &nb)) { 999 else if (tonumberns(rb, nb)) {
1001 setfltvalue(s2v(ra), luai_numadd(L, nb, cast_num(ic))); 1000 setfltvalue(s2v(ra), luai_numadd(L, nb, cast_num(ic)));
1002 } 1001 }
1003 else { 1002 else {
@@ -1019,7 +1018,7 @@ void luaV_execute (lua_State *L) {
1019 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 1018 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
1020 setivalue(s2v(ra), intop(+, ib, ic)); 1019 setivalue(s2v(ra), intop(+, ib, ic));
1021 } 1020 }
1022 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 1021 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1023 setfltvalue(s2v(ra), luai_numadd(L, nb, nc)); 1022 setfltvalue(s2v(ra), luai_numadd(L, nb, nc));
1024 } 1023 }
1025 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); } 1024 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); }
@@ -1033,7 +1032,7 @@ void luaV_execute (lua_State *L) {
1033 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 1032 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
1034 setivalue(s2v(ra), intop(-, ib, ic)); 1033 setivalue(s2v(ra), intop(-, ib, ic));
1035 } 1034 }
1036 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 1035 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1037 setfltvalue(s2v(ra), luai_numsub(L, nb, nc)); 1036 setfltvalue(s2v(ra), luai_numsub(L, nb, nc));
1038 } 1037 }
1039 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SUB)); } 1038 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SUB)); }
@@ -1047,7 +1046,7 @@ void luaV_execute (lua_State *L) {
1047 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 1046 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
1048 setivalue(s2v(ra), intop(*, ib, ic)); 1047 setivalue(s2v(ra), intop(*, ib, ic));
1049 } 1048 }
1050 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 1049 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1051 setfltvalue(s2v(ra), luai_nummul(L, nb, nc)); 1050 setfltvalue(s2v(ra), luai_nummul(L, nb, nc));
1052 } 1051 }
1053 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MUL)); } 1052 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MUL)); }
@@ -1057,7 +1056,7 @@ void luaV_execute (lua_State *L) {
1057 TValue *rb = RKB(i); 1056 TValue *rb = RKB(i);
1058 TValue *rc = RKC(i); 1057 TValue *rc = RKC(i);
1059 lua_Number nb; lua_Number nc; 1058 lua_Number nb; lua_Number nc;
1060 if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 1059 if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1061 setfltvalue(s2v(ra), luai_numdiv(L, nb, nc)); 1060 setfltvalue(s2v(ra), luai_numdiv(L, nb, nc));
1062 } 1061 }
1063 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV)); } 1062 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV)); }
@@ -1121,7 +1120,7 @@ void luaV_execute (lua_State *L) {
1121 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 1120 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
1122 setivalue(s2v(ra), luaV_mod(L, ib, ic)); 1121 setivalue(s2v(ra), luaV_mod(L, ib, ic));
1123 } 1122 }
1124 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 1123 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1125 lua_Number m; 1124 lua_Number m;
1126 luai_nummod(L, nb, nc, m); 1125 luai_nummod(L, nb, nc, m);
1127 setfltvalue(s2v(ra), m); 1126 setfltvalue(s2v(ra), m);
@@ -1137,7 +1136,7 @@ void luaV_execute (lua_State *L) {
1137 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 1136 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
1138 setivalue(s2v(ra), luaV_div(L, ib, ic)); 1137 setivalue(s2v(ra), luaV_div(L, ib, ic));
1139 } 1138 }
1140 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 1139 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1141 setfltvalue(s2v(ra), luai_numidiv(L, nb, nc)); 1140 setfltvalue(s2v(ra), luai_numidiv(L, nb, nc));
1142 } 1141 }
1143 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_IDIV)); } 1142 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_IDIV)); }
@@ -1147,7 +1146,7 @@ void luaV_execute (lua_State *L) {
1147 TValue *rb = RKB(i); 1146 TValue *rb = RKB(i);
1148 TValue *rc = RKC(i); 1147 TValue *rc = RKC(i);
1149 lua_Number nb; lua_Number nc; 1148 lua_Number nb; lua_Number nc;
1150 if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 1149 if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1151 setfltvalue(s2v(ra), luai_numpow(L, nb, nc)); 1150 setfltvalue(s2v(ra), luai_numpow(L, nb, nc));
1152 } 1151 }
1153 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); } 1152 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); }
@@ -1160,7 +1159,7 @@ void luaV_execute (lua_State *L) {
1160 lua_Integer ib = ivalue(rb); 1159 lua_Integer ib = ivalue(rb);
1161 setivalue(s2v(ra), intop(-, 0, ib)); 1160 setivalue(s2v(ra), intop(-, 0, ib));
1162 } 1161 }
1163 else if (tonumber(rb, &nb)) { 1162 else if (tonumberns(rb, nb)) {
1164 setfltvalue(s2v(ra), luai_numunm(L, nb)); 1163 setfltvalue(s2v(ra), luai_numunm(L, nb));
1165 } 1164 }
1166 else { 1165 else {