|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
-** $Id: ltable.c,v 2.122 2017/05/19 12:57:10 roberto Exp roberto $
|
|
|
+** $Id: ltable.c,v 2.123 2017/06/09 16:48:44 roberto Exp roberto $
|
|
|
** Lua tables (hash)
|
|
|
** See Copyright Notice in lua.h
|
|
|
*/
|
|
@@ -175,6 +175,25 @@ static int equalkey (const TValue *k1, const Node *n2) {
|
|
|
}
|
|
|
|
|
|
|
|
|
+/*
|
|
|
+** "Generic" get version. (Not that generic: not valid for integers,
|
|
|
+** which may be in array part, nor for floats with integral values.)
|
|
|
+*/
|
|
|
+static const TValue *getgeneric (Table *t, const TValue *key) {
|
|
|
+ Node *n = mainpositionTV(t, key);
|
|
|
+ for (;;) { /* check whether 'key' is somewhere in the chain */
|
|
|
+ if (equalkey(key, n))
|
|
|
+ return gval(n); /* that's it */
|
|
|
+ else {
|
|
|
+ int nx = gnext(n);
|
|
|
+ if (nx == 0)
|
|
|
+ return luaO_nilobject; /* not found */
|
|
|
+ n += nx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
** returns the index for 'k' if 'k' is an appropriate key to live in
|
|
|
** the array part of a table, 0 otherwise.
|
|
@@ -199,22 +218,12 @@ static unsigned int findindex (lua_State *L, Table *t, StkId key) {
|
|
|
if (i != 0 && i <= t->sizearray) /* is 'key' inside array part? */
|
|
|
return i; /* yes; that's the index */
|
|
|
else {
|
|
|
- int nx;
|
|
|
- Node *n = mainpositionTV(t, key);
|
|
|
- for (;;) { /* check whether 'key' is somewhere in the chain */
|
|
|
- /* key may be dead already, but it is ok to use it in 'next' */
|
|
|
- if (equalkey(key, n) ||
|
|
|
- (keyisdead(n) && iscollectable(key) &&
|
|
|
- deadkey(n) == gcvalue(key))) {
|
|
|
- i = cast_int(n - gnode(t, 0)); /* key index in hash table */
|
|
|
- /* hash elements are numbered after array ones */
|
|
|
- return (i + 1) + t->sizearray;
|
|
|
- }
|
|
|
- nx = gnext(n);
|
|
|
- if (nx == 0)
|
|
|
- luaG_runerror(L, "invalid key to 'next'"); /* key not found */
|
|
|
- else n += nx;
|
|
|
- }
|
|
|
+ const TValue *n = getgeneric(t, key);
|
|
|
+ if (n == luaO_nilobject)
|
|
|
+ luaG_runerror(L, "invalid key to 'next'"); /* key not found */
|
|
|
+ i = cast_int(nodefromval(n) - gnode(t, 0)); /* key index in hash table */
|
|
|
+ /* hash elements are numbered after array ones */
|
|
|
+ return (i + 1) + t->sizearray;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -574,25 +583,6 @@ const TValue *luaH_getshortstr (Table *t, TString *key) {
|
|
|
}
|
|
|
|
|
|
|
|
|
-/*
|
|
|
-** "Generic" get version. (Not that generic: not valid for integers,
|
|
|
-** which may be in array part, nor for floats with integral values.)
|
|
|
-*/
|
|
|
-static const TValue *getgeneric (Table *t, const TValue *key) {
|
|
|
- Node *n = mainpositionTV(t, key);
|
|
|
- for (;;) { /* check whether 'key' is somewhere in the chain */
|
|
|
- if (equalkey(key, n))
|
|
|
- return gval(n); /* that's it */
|
|
|
- else {
|
|
|
- int nx = gnext(n);
|
|
|
- if (nx == 0)
|
|
|
- return luaO_nilobject; /* not found */
|
|
|
- n += nx;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
const TValue *luaH_getstr (Table *t, TString *key) {
|
|
|
if (key->tt == LUA_TSHRSTR)
|
|
|
return luaH_getshortstr(t, key);
|
|
@@ -662,7 +652,7 @@ void luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) {
|
|
|
** absent while 'i' is present; so 'j > i'.) Otherwise, 'j' is a
|
|
|
** boundary. ('j + 1' cannot be a present integer key because it is
|
|
|
** not a valid integer in Lua.)
|
|
|
-*/
|
|
|
+*/
|
|
|
static lua_Unsigned hash_search (Table *t, lua_Unsigned j) {
|
|
|
lua_Unsigned i;
|
|
|
if (j == 0) j++; /* the caller ensures 'j + 1' is present */
|