From d12262068d689eacc452a459a021df0ad8f6d46c Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 27 Mar 2019 14:56:10 -0300 Subject: Small optimizations in range checks Checks of the form '1 <= x && x <= M' were rewritten in the form '(unsigned)x - 1 < (unsigned)M', which is usually more efficient. (Other similar checks have similar translations.) Although some compilers do these optimizations, that does not happen for all compilers or all cases. --- ltable.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'ltable.c') diff --git a/ltable.c b/ltable.c index e12381b2..628c640c 100644 --- a/ltable.c +++ b/ltable.c @@ -48,8 +48,8 @@ /* ** MAXASIZE is the maximum size of the array part. It is the minimum -** between 2^MAXABITS and the maximum size such that, measured in bytes, -** it fits in a 'size_t'. +** between 2^MAXABITS and the maximum size that, measured in bytes, +** fits in a 'size_t'. */ #define MAXASIZE luaM_limitN(1u << MAXABITS, TValue) @@ -269,7 +269,7 @@ static const TValue *getgeneric (Table *t, const TValue *key) { ** the array part of a table, 0 otherwise. */ static unsigned int arrayindex (lua_Integer k) { - if (0 < k && l_castS2U(k) <= MAXASIZE) + if (l_castS2U(k) - 1u < MAXASIZE) /* 'k' in [1, MAXASIZE]? */ return cast_uint(k); /* 'key' is an appropriate array index */ else return 0; @@ -286,7 +286,7 @@ static unsigned int findindex (lua_State *L, Table *t, TValue *key, unsigned int i; if (ttisnil(key)) return 0; /* first iteration */ i = ttisinteger(key) ? arrayindex(ivalue(key)) : 0; - if (i != 0 && i <= asize) /* is 'key' inside array part? */ + if (i - 1u < asize) /* is 'key' inside array part? */ return i; /* yes; that's the index */ else { const TValue *n = getgeneric(t, key); @@ -678,7 +678,7 @@ TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) { ** changing the real size of the array). */ const TValue *luaH_getint (Table *t, lua_Integer key) { - if (l_castS2U(key) - 1u < t->alimit) /* (1 <= key && key <= t->alimit)? */ + if (l_castS2U(key) - 1u < t->alimit) /* 'key' in [1, t->alimit]? */ return &t->array[key - 1]; else if (!limitequalsasize(t) && /* key still may be in the array part? */ (l_castS2U(key) == t->alimit + 1 || -- cgit v1.2.3-55-g6feb