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)
|
** Lua tables (hash)
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -67,12 +67,6 @@
|
||||||
#define hashpointer(t,p) hashmod(t, IntPoint(p))
|
#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 dummynode (&dummynode_)
|
||||||
|
|
||||||
#define isdummy(n) ((n) == 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
|
** hash for floating-point numbers
|
||||||
*/
|
*/
|
||||||
|
@ -424,7 +429,7 @@ TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) {
|
||||||
if (luai_numisnan(n))
|
if (luai_numisnan(n))
|
||||||
luaG_runerror(L, "table index is NaN");
|
luaG_runerror(L, "table index is NaN");
|
||||||
if (numisinteger(n, &k)) { /* index is int? */
|
if (numisinteger(n, &k)) { /* index is int? */
|
||||||
setivalue(&aux, k);
|
setivalue(&aux, k);
|
||||||
key = &aux; /* insert it as an integer */
|
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
|
** Configuration file for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -505,6 +505,24 @@
|
||||||
#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n))
|
#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.
|
@@ The luai_num* macros define the primitive operations over numbers.
|
||||||
** They should work for any size of floating 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
|
** Lua virtual machine
|
||||||
** See Copyright Notice in lua.h
|
** 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
|
** 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)) {
|
if (ttisfloat(obj)) {
|
||||||
lua_Number n = fltvalue(obj);
|
lua_Number n = fltvalue(obj);
|
||||||
n = (up ? -l_floor(-n) : l_floor(n));
|
n = (up ? -l_floor(-n) : l_floor(n));
|
||||||
return luaV_numtointeger(n, p);
|
return lua_numtointeger(n, p);
|
||||||
}
|
}
|
||||||
else if (ttisinteger(obj)) {
|
else if (ttisinteger(obj)) {
|
||||||
*p = ivalue(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
|
** Lua virtual machine
|
||||||
** See Copyright Notice in lua.h
|
** 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_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_tonumber_ (const TValue *obj, lua_Number *n);
|
||||||
LUAI_FUNC int luaV_tointeger_ (const TValue *obj, lua_Integer *p);
|
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 int luaV_tostring (lua_State *L, StkId obj);
|
||||||
LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key,
|
LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key,
|
||||||
StkId val);
|
StkId val);
|
||||||
|
|
Loading…
Reference in New Issue