From 34ac039fb84e3c12fb8c96c9c99c34224c09872b Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 30 Jul 2014 11:00:14 -0300 Subject: new macro 'cvt2str' to better control whether numbers are convertible to strings --- lvm.c | 37 ++++--------------------------------- 1 file changed, 4 insertions(+), 33 deletions(-) (limited to 'lvm.c') diff --git a/lvm.c b/lvm.c index ec5bf62b..89ef8997 100644 --- a/lvm.c +++ b/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 2.219 2014/07/18 13:36:14 roberto Exp roberto $ +** $Id: lvm.c,v 2.220 2014/07/21 16:02:10 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -33,10 +33,6 @@ #define MAXTAGLOOP 2000 -/* maximum length of the conversion of a number to a string */ -#define MAXNUMBER2STR 50 - - /* ** Similar to 'tonumber', but does not attempt to convert strings and ** ensure correct precision (no extra bits). Used in comparisons. @@ -119,32 +115,6 @@ int luaV_tointeger_ (const TValue *obj, lua_Integer *p) { } -/* -** Convert a number object to a string -*/ -int luaV_tostring (lua_State *L, StkId obj) { - if (!ttisnumber(obj)) - return 0; - else { - char buff[MAXNUMBER2STR]; - size_t len; - if (ttisinteger(obj)) - len = lua_integer2str(buff, ivalue(obj)); - else { - len = lua_number2str(buff, fltvalue(obj)); -#if !defined(LUA_COMPAT_FLOATSTRING) - if (buff[strspn(buff, "-0123456789")] == '\0') { /* looks like an int? */ - buff[len++] = '.'; - buff[len++] = '0'; /* adds '.0' to result */ - } -#endif - } - setsvalue2s(L, obj, luaS_newlstr(L, buff, len)); - return 1; - } -} - - /* ** Try to convert a 'for' limit to an integer, preserving the ** semantics of the loop. @@ -374,7 +344,8 @@ int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) { /* macro used by 'luaV_concat' to ensure that element at 'o' is a string */ -#define tostring(L,o) (ttisstring(o) || (luaV_tostring(L, o))) +#define tostring(L,o) \ + (ttisstring(o) || (cvt2str(o) && (luaO_tostring(L, o), 1))) /* ** Main operation for concatenation: concat 'total' values in the stack, @@ -385,7 +356,7 @@ void luaV_concat (lua_State *L, int total) { do { StkId top = L->top; int n = 2; /* number of elements handled in this pass (at least 2) */ - if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) + if (!(ttisstring(top-2) || cvt2str(top-2)) || !tostring(L, top-1)) luaT_trybinTM(L, top-2, top-1, top-2, TM_CONCAT); else if (tsvalue(top-1)->len == 0) /* second operand is empty? */ cast_void(tostring(L, top - 2)); /* result is first operand */ -- cgit v1.2.3-55-g6feb