mirror of https://github.com/rusefi/lua.git
function 'luaV_numtointeger' changed to a global macro
'lua_numtointeger' (tricky, small, and useful in several places)
This commit is contained in:
parent
4d696c45b9
commit
c98f195eb9
21
ltable.c
21
ltable.c
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
** $Id: ltable.c,v 2.87 2014/04/15 14:28:20 roberto Exp roberto $
|
||||
** $Id: ltable.c,v 2.88 2014/04/15 16:32:49 roberto Exp roberto $
|
||||
** Lua tables (hash)
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
@ -67,12 +67,6 @@
|
|||
#define hashpointer(t,p) hashmod(t, IntPoint(p))
|
||||
|
||||
|
||||
/* checks whether a float has a value representable as a lua_Integer
|
||||
(and does the conversion if so) */
|
||||
#define numisinteger(x,i) \
|
||||
(((x) == l_floor(x)) && luaV_numtointeger(x, i))
|
||||
|
||||
|
||||
#define dummynode (&dummynode_)
|
||||
|
||||
#define isdummy(n) ((n) == dummynode)
|
||||
|
@ -83,6 +77,17 @@ static const Node dummynode_ = {
|
|||
};
|
||||
|
||||
|
||||
/*
|
||||
** Checks whether a float has a value representable as a lua_Integer
|
||||
** (and does the conversion if so)
|
||||
*/
|
||||
static int numisinteger (lua_Number x, lua_Integer *p) {
|
||||
if ((x) == l_floor(x)) /* integral value? */
|
||||
return lua_numtointeger(x, p); /* try as an integer */
|
||||
else return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** hash for floating-point numbers
|
||||
*/
|
||||
|
@ -424,7 +429,7 @@ TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) {
|
|||
if (luai_numisnan(n))
|
||||
luaG_runerror(L, "table index is NaN");
|
||||
if (numisinteger(n, &k)) { /* index is int? */
|
||||
setivalue(&aux, k);
|
||||
setivalue(&aux, k);
|
||||
key = &aux; /* insert it as an integer */
|
||||
}
|
||||
}
|
||||
|
|
20
luaconf.h
20
luaconf.h
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
** $Id: luaconf.h,v 1.202 2014/05/15 15:24:32 roberto Exp roberto $
|
||||
** $Id: luaconf.h,v 1.203 2014/05/21 15:24:21 roberto Exp roberto $
|
||||
** Configuration file for Lua
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
@ -505,6 +505,24 @@
|
|||
#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n))
|
||||
|
||||
|
||||
/*
|
||||
@@ lua_numtointeger converts a float number to an integer, or
|
||||
** return 0 if float is not within the range of a lua_Integer.
|
||||
** (The comparisons are tricky because of rounding, which can or
|
||||
** not occur depending on the relative sizes of floats and integers.
|
||||
** The tests here assume a two-complement representation, where
|
||||
** MININTEGER always has an exact representation as a float,
|
||||
** while if LUA_MAXINTEGER has an exact representation, so does
|
||||
** (LUA_MAXINTEGER + 1); otherwise, LUA_MAXINTEGER is equal to
|
||||
** (LUA_MAXINTEGER + 1) when converted to a float.)
|
||||
** This macro should be used only when 'n' has an integral value.
|
||||
*/
|
||||
#define lua_numtointeger(n,p) \
|
||||
(((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \
|
||||
(n) < (LUA_NUMBER)(LUA_MAXINTEGER) + 1) && \
|
||||
(*p = (LUA_INTEGER)(n), 1))
|
||||
|
||||
|
||||
/*
|
||||
@@ The luai_num* macros define the primitive operations over numbers.
|
||||
** They should work for any size of floating numbers.
|
||||
|
|
20
lvm.c
20
lvm.c
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
** $Id: lvm.c,v 2.212 2014/05/20 14:12:59 roberto Exp roberto $
|
||||
** $Id: lvm.c,v 2.213 2014/05/23 18:32:21 roberto Exp roberto $
|
||||
** Lua virtual machine
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
@ -79,22 +79,6 @@ int luaV_tonumber_ (const TValue *obj, lua_Number *n) {
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
** Check whether a float number is within the range of a lua_Integer.
|
||||
** (The comparisons are tricky because of rounding, which can or
|
||||
** not occur depending on the relative sizes of floats and integers.)
|
||||
** This function should be called only when 'n' has an integral value.
|
||||
*/
|
||||
int luaV_numtointeger (lua_Number n, lua_Integer *p) {
|
||||
if (cast_num(LUA_MININTEGER) <= n && n < (LUA_MAXINTEGER + cast_num(1))) {
|
||||
*p = cast(lua_Integer, n);
|
||||
lua_assert(cast_num(*p) == n);
|
||||
return 1;
|
||||
}
|
||||
return 0; /* number is outside integer limits */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** try to convert a value to an integer, rounding up if 'up' is true
|
||||
*/
|
||||
|
@ -104,7 +88,7 @@ static int tointeger_aux (const TValue *obj, lua_Integer *p, int up) {
|
|||
if (ttisfloat(obj)) {
|
||||
lua_Number n = fltvalue(obj);
|
||||
n = (up ? -l_floor(-n) : l_floor(n));
|
||||
return luaV_numtointeger(n, p);
|
||||
return lua_numtointeger(n, p);
|
||||
}
|
||||
else if (ttisinteger(obj)) {
|
||||
*p = ivalue(obj);
|
||||
|
|
3
lvm.h
3
lvm.h
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
** $Id: lvm.h,v 2.29 2014/04/27 14:41:11 roberto Exp roberto $
|
||||
** $Id: lvm.h,v 2.30 2014/05/12 21:22:05 roberto Exp roberto $
|
||||
** Lua virtual machine
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
@ -29,7 +29,6 @@ LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r);
|
|||
LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r);
|
||||
LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n);
|
||||
LUAI_FUNC int luaV_tointeger_ (const TValue *obj, lua_Integer *p);
|
||||
LUAI_FUNC int luaV_numtointeger (lua_Number n, lua_Integer *p);
|
||||
LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj);
|
||||
LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key,
|
||||
StkId val);
|
||||
|
|
Loading…
Reference in New Issue