aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c42
1 files changed, 19 insertions, 23 deletions
diff --git a/lvm.c b/lvm.c
index d772590d..afe1a8fd 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.162 2013/04/25 19:50:02 roberto Exp roberto $ 2** $Id: lvm.c,v 2.163 2013/04/26 13:07:53 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*/
@@ -32,19 +32,14 @@
32#define MAXTAGLOOP 100 32#define MAXTAGLOOP 100
33 33
34 34
35const TValue *luaV_tonumber (const TValue *obj, TValue *n) { 35int luaV_tonumber_ (const TValue *obj, lua_Number *n) {
36 lua_Number num; 36 lua_assert(!ttisfloat(obj));
37 if (ttisfloat(obj)) return obj;
38 if (ttisinteger(obj)) { 37 if (ttisinteger(obj)) {
39 setnvalue(n, cast_num(ivalue(obj))); 38 *n = cast_num(ivalue(obj));
40 return n; 39 return 1;
41 }
42 if (ttisstring(obj) && luaO_str2d(svalue(obj), tsvalue(obj)->len, &num)) {
43 setnvalue(n, num);
44 return n;
45 } 40 }
46 else 41 else
47 return NULL; 42 return (ttisstring(obj) && luaO_str2d(svalue(obj), tsvalue(obj)->len, n));
48} 43}
49 44
50 45
@@ -337,11 +332,9 @@ lua_Integer luaV_pow (lua_Integer x, lua_Integer y) {
337 332
338void luaV_arith (lua_State *L, StkId ra, const TValue *rb, 333void luaV_arith (lua_State *L, StkId ra, const TValue *rb,
339 const TValue *rc, TMS op) { 334 const TValue *rc, TMS op) {
340 TValue tempb, tempc; 335 lua_Number b, c;
341 const TValue *b, *c; 336 if (tonumber(rb, &b) && tonumber(rc, &c)) {
342 if ((b = luaV_tonumber(rb, &tempb)) != NULL && 337 lua_Number res = luaO_arith(op - TM_ADD + LUA_OPADD, b, c);
343 (c = luaV_tonumber(rc, &tempc)) != NULL) {
344 lua_Number res = luaO_arith(op - TM_ADD + LUA_OPADD, nvalue(b), nvalue(c));
345 setnvalue(ra, res); 338 setnvalue(ra, res);
346 } 339 }
347 else if (!luaT_callbinTM(L, rb, rc, ra, op)) 340 else if (!luaT_callbinTM(L, rb, rc, ra, op))
@@ -841,20 +834,23 @@ void luaV_execute (lua_State *L) {
841 } 834 }
842 ) 835 )
843 vmcase(OP_FORPREP, 836 vmcase(OP_FORPREP,
844 const TValue *init = ra; 837 TValue *init = ra;
845 const TValue *plimit = ra+1; 838 TValue *plimit = ra + 1;
846 const TValue *pstep = ra+2; 839 TValue *pstep = ra + 2;
847 if (ttisinteger(ra) && ttisinteger(ra + 1) && ttisinteger(ra + 2)) { 840 if (ttisinteger(ra) && ttisinteger(ra + 1) && ttisinteger(ra + 2)) {
848 setivalue(ra, ivalue(ra) - ivalue(pstep)); 841 setivalue(ra, ivalue(ra) - ivalue(pstep));
849 } 842 }
850 else { /* try with floats */ 843 else { /* try with floats */
851 if (!tonumber(init, ra)) 844 lua_Number ninit; lua_Number nlimit; lua_Number nstep;
845 if (!tonumber(init, &ninit))
852 luaG_runerror(L, LUA_QL("for") " initial value must be a number"); 846 luaG_runerror(L, LUA_QL("for") " initial value must be a number");
853 else if (!tonumber(plimit, ra+1)) 847 if (!tonumber(plimit, &nlimit))
854 luaG_runerror(L, LUA_QL("for") " limit must be a number"); 848 luaG_runerror(L, LUA_QL("for") " limit must be a number");
855 else if (!tonumber(pstep, ra+2)) 849 setnvalue(plimit, nlimit);
850 if (!tonumber(pstep, &nstep))
856 luaG_runerror(L, LUA_QL("for") " step must be a number"); 851 luaG_runerror(L, LUA_QL("for") " step must be a number");
857 setnvalue(ra, luai_numsub(L, fltvalue(ra), fltvalue(pstep))); 852 setnvalue(pstep, nstep);
853 setnvalue(ra, luai_numsub(L, ninit, nstep));
858 } 854 }
859 ci->u.l.savedpc += GETARG_sBx(i); 855 ci->u.l.savedpc += GETARG_sBx(i);
860 ) 856 )