diff options
Diffstat (limited to 'ltable.c')
-rw-r--r-- | ltable.c | 67 |
1 files changed, 34 insertions, 33 deletions
@@ -109,7 +109,7 @@ typedef union { | |||
109 | ** for other types, it is better to avoid modulo by power of 2, as | 109 | ** for other types, it is better to avoid modulo by power of 2, as |
110 | ** they can have many 2 factors. | 110 | ** they can have many 2 factors. |
111 | */ | 111 | */ |
112 | #define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1)))) | 112 | #define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1u)|1u)))) |
113 | 113 | ||
114 | 114 | ||
115 | #define hashstr(t,str) hashpow2(t, (str)->hash) | 115 | #define hashstr(t,str) hashpow2(t, (str)->hash) |
@@ -139,7 +139,7 @@ static const TValue absentkey = {ABSTKEYCONSTANT}; | |||
139 | static Node *hashint (const Table *t, lua_Integer i) { | 139 | static Node *hashint (const Table *t, lua_Integer i) { |
140 | lua_Unsigned ui = l_castS2U(i); | 140 | lua_Unsigned ui = l_castS2U(i); |
141 | if (ui <= cast_uint(INT_MAX)) | 141 | if (ui <= cast_uint(INT_MAX)) |
142 | return hashmod(t, cast_int(ui)); | 142 | return gnode(t, cast_int(ui) % cast_int((sizenode(t)-1) | 1)); |
143 | else | 143 | else |
144 | return hashmod(t, ui); | 144 | return hashmod(t, ui); |
145 | } | 145 | } |
@@ -159,7 +159,7 @@ static Node *hashint (const Table *t, lua_Integer i) { | |||
159 | ** INT_MIN. | 159 | ** INT_MIN. |
160 | */ | 160 | */ |
161 | #if !defined(l_hashfloat) | 161 | #if !defined(l_hashfloat) |
162 | static int l_hashfloat (lua_Number n) { | 162 | static unsigned l_hashfloat (lua_Number n) { |
163 | int i; | 163 | int i; |
164 | lua_Integer ni; | 164 | lua_Integer ni; |
165 | n = l_mathop(frexp)(n, &i) * -cast_num(INT_MIN); | 165 | n = l_mathop(frexp)(n, &i) * -cast_num(INT_MIN); |
@@ -169,7 +169,7 @@ static int l_hashfloat (lua_Number n) { | |||
169 | } | 169 | } |
170 | else { /* normal case */ | 170 | else { /* normal case */ |
171 | unsigned int u = cast_uint(i) + cast_uint(ni); | 171 | unsigned int u = cast_uint(i) + cast_uint(ni); |
172 | return cast_int(u <= cast_uint(INT_MAX) ? u : ~u); | 172 | return (u <= cast_uint(INT_MAX) ? u : ~u); |
173 | } | 173 | } |
174 | } | 174 | } |
175 | #endif | 175 | #endif |
@@ -370,7 +370,7 @@ static unsigned findindex (lua_State *L, Table *t, TValue *key, | |||
370 | const TValue *n = getgeneric(t, key, 1); | 370 | const TValue *n = getgeneric(t, key, 1); |
371 | if (l_unlikely(isabstkey(n))) | 371 | if (l_unlikely(isabstkey(n))) |
372 | luaG_runerror(L, "invalid key to 'next'"); /* key not found */ | 372 | luaG_runerror(L, "invalid key to 'next'"); /* key not found */ |
373 | i = cast_int(nodefromval(n) - gnode(t, 0)); /* key index in hash table */ | 373 | i = cast_uint(nodefromval(n) - gnode(t, 0)); /* key index in hash table */ |
374 | /* hash elements are numbered after array ones */ | 374 | /* hash elements are numbered after array ones */ |
375 | return (i + 1) + asize; | 375 | return (i + 1) + asize; |
376 | } | 376 | } |
@@ -381,14 +381,14 @@ int luaH_next (lua_State *L, Table *t, StkId key) { | |||
381 | unsigned int asize = luaH_realasize(t); | 381 | unsigned int asize = luaH_realasize(t); |
382 | unsigned int i = findindex(L, t, s2v(key), asize); /* find original key */ | 382 | unsigned int i = findindex(L, t, s2v(key), asize); /* find original key */ |
383 | for (; i < asize; i++) { /* try first array part */ | 383 | for (; i < asize; i++) { /* try first array part */ |
384 | int tag = *getArrTag(t, i); | 384 | lu_byte tag = *getArrTag(t, i); |
385 | if (!tagisempty(tag)) { /* a non-empty entry? */ | 385 | if (!tagisempty(tag)) { /* a non-empty entry? */ |
386 | setivalue(s2v(key), i + 1); | 386 | setivalue(s2v(key), cast_int(i) + 1); |
387 | farr2val(t, i, tag, s2v(key + 1)); | 387 | farr2val(t, i, tag, s2v(key + 1)); |
388 | return 1; | 388 | return 1; |
389 | } | 389 | } |
390 | } | 390 | } |
391 | for (i -= asize; cast_int(i) < sizenode(t); i++) { /* hash part */ | 391 | for (i -= asize; i < sizenode(t); i++) { /* hash part */ |
392 | if (!isempty(gval(gnode(t, i)))) { /* a non-empty entry? */ | 392 | if (!isempty(gval(gnode(t, i)))) { /* a non-empty entry? */ |
393 | Node *n = gnode(t, i); | 393 | Node *n = gnode(t, i); |
394 | getnodekey(L, s2v(key), n); | 394 | getnodekey(L, s2v(key), n); |
@@ -485,7 +485,7 @@ static unsigned computesizes (unsigned nums[], unsigned *pna) { | |||
485 | } | 485 | } |
486 | 486 | ||
487 | 487 | ||
488 | static int countint (lua_Integer key, unsigned int *nums) { | 488 | static unsigned countint (lua_Integer key, unsigned int *nums) { |
489 | unsigned int k = arrayindex(key); | 489 | unsigned int k = arrayindex(key); |
490 | if (k != 0) { /* is 'key' an appropriate array index? */ | 490 | if (k != 0) { /* is 'key' an appropriate array index? */ |
491 | nums[luaO_ceillog2(k)]++; /* count as such */ | 491 | nums[luaO_ceillog2(k)]++; /* count as such */ |
@@ -496,7 +496,7 @@ static int countint (lua_Integer key, unsigned int *nums) { | |||
496 | } | 496 | } |
497 | 497 | ||
498 | 498 | ||
499 | l_sinline int arraykeyisempty (const Table *t, lua_Integer key) { | 499 | l_sinline int arraykeyisempty (const Table *t, lua_Unsigned key) { |
500 | int tag = *getArrTag(t, key - 1); | 500 | int tag = *getArrTag(t, key - 1); |
501 | return tagisempty(tag); | 501 | return tagisempty(tag); |
502 | } | 502 | } |
@@ -534,10 +534,10 @@ static unsigned numusearray (const Table *t, unsigned *nums) { | |||
534 | } | 534 | } |
535 | 535 | ||
536 | 536 | ||
537 | static int numusehash (const Table *t, unsigned *nums, unsigned *pna) { | 537 | static unsigned numusehash (const Table *t, unsigned *nums, unsigned *pna) { |
538 | int totaluse = 0; /* total number of elements */ | 538 | unsigned totaluse = 0; /* total number of elements */ |
539 | int ause = 0; /* elements added to 'nums' (can go to array part) */ | 539 | unsigned ause = 0; /* elements added to 'nums' (can go to array part) */ |
540 | int i = sizenode(t); | 540 | unsigned i = sizenode(t); |
541 | while (i--) { | 541 | while (i--) { |
542 | Node *n = &t->node[i]; | 542 | Node *n = &t->node[i]; |
543 | if (!isempty(gval(n))) { | 543 | if (!isempty(gval(n))) { |
@@ -646,8 +646,8 @@ static void setnodevector (lua_State *L, Table *t, unsigned size) { | |||
646 | ** (Re)insert all elements from the hash part of 'ot' into table 't'. | 646 | ** (Re)insert all elements from the hash part of 'ot' into table 't'. |
647 | */ | 647 | */ |
648 | static void reinsert (lua_State *L, Table *ot, Table *t) { | 648 | static void reinsert (lua_State *L, Table *ot, Table *t) { |
649 | int j; | 649 | unsigned j; |
650 | int size = sizenode(ot); | 650 | unsigned size = sizenode(ot); |
651 | for (j = 0; j < size; j++) { | 651 | for (j = 0; j < size; j++) { |
652 | Node *old = gnode(ot, j); | 652 | Node *old = gnode(ot, j); |
653 | if (!isempty(gval(old))) { | 653 | if (!isempty(gval(old))) { |
@@ -673,10 +673,10 @@ static void exchangehashpart (Table *t1, Table *t2) { | |||
673 | int bitdummy1 = t1->flags & BITDUMMY; | 673 | int bitdummy1 = t1->flags & BITDUMMY; |
674 | t1->lsizenode = t2->lsizenode; | 674 | t1->lsizenode = t2->lsizenode; |
675 | t1->node = t2->node; | 675 | t1->node = t2->node; |
676 | t1->flags = (t1->flags & NOTBITDUMMY) | (t2->flags & BITDUMMY); | 676 | t1->flags = cast_byte((t1->flags & NOTBITDUMMY) | (t2->flags & BITDUMMY)); |
677 | t2->lsizenode = lsizenode; | 677 | t2->lsizenode = lsizenode; |
678 | t2->node = node; | 678 | t2->node = node; |
679 | t2->flags = (t2->flags & NOTBITDUMMY) | bitdummy1; | 679 | t2->flags = cast_byte((t2->flags & NOTBITDUMMY) | bitdummy1); |
680 | } | 680 | } |
681 | 681 | ||
682 | 682 | ||
@@ -689,11 +689,12 @@ static void reinsertOldSlice (lua_State *L, Table *t, unsigned oldasize, | |||
689 | unsigned i; | 689 | unsigned i; |
690 | t->alimit = newasize; /* pretend array has new size... */ | 690 | t->alimit = newasize; /* pretend array has new size... */ |
691 | for (i = newasize; i < oldasize; i++) { /* traverse vanishing slice */ | 691 | for (i = newasize; i < oldasize; i++) { /* traverse vanishing slice */ |
692 | int tag = *getArrTag(t, i); | 692 | lu_byte tag = *getArrTag(t, i); |
693 | if (!tagisempty(tag)) { /* a non-empty entry? */ | 693 | if (!tagisempty(tag)) { /* a non-empty entry? */ |
694 | TValue aux; | 694 | TValue aux; |
695 | farr2val(t, i, tag, &aux); /* copy entry into 'aux' */ | 695 | farr2val(t, i, tag, &aux); /* copy entry into 'aux' */ |
696 | luaH_setint(L, t, i + 1, &aux); /* re-insert it into the table */ | 696 | /* re-insert it into the table */ |
697 | luaH_setint(L, t, cast_int(i) + 1, &aux); | ||
697 | } | 698 | } |
698 | } | 699 | } |
699 | t->alimit = oldasize; /* restore current size... */ | 700 | t->alimit = oldasize; /* restore current size... */ |
@@ -756,7 +757,7 @@ void luaH_resize (lua_State *L, Table *t, unsigned newasize, | |||
756 | 757 | ||
757 | 758 | ||
758 | void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) { | 759 | void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) { |
759 | int nsize = allocsizenode(t); | 760 | unsigned nsize = allocsizenode(t); |
760 | luaH_resize(L, t, nasize, nsize); | 761 | luaH_resize(L, t, nasize, nsize); |
761 | } | 762 | } |
762 | 763 | ||
@@ -768,7 +769,7 @@ static void rehash (lua_State *L, Table *t, const TValue *ek) { | |||
768 | unsigned int na; /* number of keys in the array part */ | 769 | unsigned int na; /* number of keys in the array part */ |
769 | unsigned int nums[MAXABITS + 1]; | 770 | unsigned int nums[MAXABITS + 1]; |
770 | int i; | 771 | int i; |
771 | int totaluse; | 772 | unsigned totaluse; |
772 | for (i = 0; i <= MAXABITS; i++) nums[i] = 0; /* reset counts */ | 773 | for (i = 0; i <= MAXABITS; i++) nums[i] = 0; /* reset counts */ |
773 | setlimittosize(t); | 774 | setlimittosize(t); |
774 | na = numusearray(t, nums); /* count keys in array part */ | 775 | na = numusearray(t, nums); /* count keys in array part */ |
@@ -795,7 +796,7 @@ Table *luaH_new (lua_State *L) { | |||
795 | GCObject *o = luaC_newobj(L, LUA_VTABLE, sizeof(Table)); | 796 | GCObject *o = luaC_newobj(L, LUA_VTABLE, sizeof(Table)); |
796 | Table *t = gco2t(o); | 797 | Table *t = gco2t(o); |
797 | t->metatable = NULL; | 798 | t->metatable = NULL; |
798 | t->flags = cast_byte(maskflags); /* table has no metamethod fields */ | 799 | t->flags = maskflags; /* table has no metamethod fields */ |
799 | t->array = NULL; | 800 | t->array = NULL; |
800 | t->alimit = 0; | 801 | t->alimit = 0; |
801 | setnodevector(L, t, 0); | 802 | setnodevector(L, t, 0); |
@@ -825,7 +826,7 @@ static Node *getfreepos (Table *t) { | |||
825 | } | 826 | } |
826 | else { /* no 'lastfree' information */ | 827 | else { /* no 'lastfree' information */ |
827 | if (!isdummy(t)) { | 828 | if (!isdummy(t)) { |
828 | int i = sizenode(t); | 829 | unsigned i = sizenode(t); |
829 | while (i--) { /* do a linear search */ | 830 | while (i--) { /* do a linear search */ |
830 | Node *free = gnode(t, i); | 831 | Node *free = gnode(t, i); |
831 | if (keyisnil(free)) | 832 | if (keyisnil(free)) |
@@ -919,13 +920,13 @@ static const TValue *getintfromhash (Table *t, lua_Integer key) { | |||
919 | } | 920 | } |
920 | 921 | ||
921 | 922 | ||
922 | static int hashkeyisempty (Table *t, lua_Integer key) { | 923 | static int hashkeyisempty (Table *t, lua_Unsigned key) { |
923 | const TValue *val = getintfromhash(t, key); | 924 | const TValue *val = getintfromhash(t, l_castU2S(key)); |
924 | return isempty(val); | 925 | return isempty(val); |
925 | } | 926 | } |
926 | 927 | ||
927 | 928 | ||
928 | static int finishnodeget (const TValue *val, TValue *res) { | 929 | static lu_byte finishnodeget (const TValue *val, TValue *res) { |
929 | if (!ttisnil(val)) { | 930 | if (!ttisnil(val)) { |
930 | setobj(((lua_State*)NULL), res, val); | 931 | setobj(((lua_State*)NULL), res, val); |
931 | } | 932 | } |
@@ -933,9 +934,9 @@ static int finishnodeget (const TValue *val, TValue *res) { | |||
933 | } | 934 | } |
934 | 935 | ||
935 | 936 | ||
936 | int luaH_getint (Table *t, lua_Integer key, TValue *res) { | 937 | lu_byte luaH_getint (Table *t, lua_Integer key, TValue *res) { |
937 | if (keyinarray(t, key)) { | 938 | if (keyinarray(t, key)) { |
938 | int tag = *getArrTag(t, key - 1); | 939 | lu_byte tag = *getArrTag(t, key - 1); |
939 | if (!tagisempty(tag)) | 940 | if (!tagisempty(tag)) |
940 | farr2val(t, key - 1, tag, res); | 941 | farr2val(t, key - 1, tag, res); |
941 | return tag; | 942 | return tag; |
@@ -964,7 +965,7 @@ const TValue *luaH_Hgetshortstr (Table *t, TString *key) { | |||
964 | } | 965 | } |
965 | 966 | ||
966 | 967 | ||
967 | int luaH_getshortstr (Table *t, TString *key, TValue *res) { | 968 | lu_byte luaH_getshortstr (Table *t, TString *key, TValue *res) { |
968 | return finishnodeget(luaH_Hgetshortstr(t, key), res); | 969 | return finishnodeget(luaH_Hgetshortstr(t, key), res); |
969 | } | 970 | } |
970 | 971 | ||
@@ -980,7 +981,7 @@ static const TValue *Hgetstr (Table *t, TString *key) { | |||
980 | } | 981 | } |
981 | 982 | ||
982 | 983 | ||
983 | int luaH_getstr (Table *t, TString *key, TValue *res) { | 984 | lu_byte luaH_getstr (Table *t, TString *key, TValue *res) { |
984 | return finishnodeget(Hgetstr(t, key), res); | 985 | return finishnodeget(Hgetstr(t, key), res); |
985 | } | 986 | } |
986 | 987 | ||
@@ -997,7 +998,7 @@ TString *luaH_getstrkey (Table *t, TString *key) { | |||
997 | /* | 998 | /* |
998 | ** main search function | 999 | ** main search function |
999 | */ | 1000 | */ |
1000 | int luaH_get (Table *t, const TValue *key, TValue *res) { | 1001 | lu_byte luaH_get (Table *t, const TValue *key, TValue *res) { |
1001 | const TValue *slot; | 1002 | const TValue *slot; |
1002 | switch (ttypetag(key)) { | 1003 | switch (ttypetag(key)) { |
1003 | case LUA_VSHRSTR: | 1004 | case LUA_VSHRSTR: |
@@ -1259,7 +1260,7 @@ lua_Unsigned luaH_getn (Table *t) { | |||
1259 | /* (3) 'limit' is the last element and either is zero or present in table */ | 1260 | /* (3) 'limit' is the last element and either is zero or present in table */ |
1260 | lua_assert(limit == luaH_realasize(t) && | 1261 | lua_assert(limit == luaH_realasize(t) && |
1261 | (limit == 0 || !arraykeyisempty(t, limit))); | 1262 | (limit == 0 || !arraykeyisempty(t, limit))); |
1262 | if (isdummy(t) || hashkeyisempty(t, cast(lua_Integer, limit + 1))) | 1263 | if (isdummy(t) || hashkeyisempty(t, limit + 1)) |
1263 | return limit; /* 'limit + 1' is absent */ | 1264 | return limit; /* 'limit + 1' is absent */ |
1264 | else /* 'limit + 1' is also present */ | 1265 | else /* 'limit + 1' is also present */ |
1265 | return hash_search(t, limit); | 1266 | return hash_search(t, limit); |