28#define MAXSTRTB cast_int(luaM_limitN(MAX_INT, TString*))
35 size_t len = a->u.lnglen;
36 lua_assert(a->tt == LUA_VLNGSTR && b->tt == LUA_VLNGSTR);
38 ((len == b->u.lnglen) &&
39 (memcmp(getstr(a), getstr(b), len) == 0));
43unsigned int luaS_hash (
const char *str,
size_t l,
unsigned int seed) {
44 unsigned int h = seed ^ cast_uint(l);
46 h ^= ((h<<5) + (h>>2) + cast_byte(str[l - 1]));
51unsigned int luaS_hashlongstr (
TString *ts) {
52 lua_assert(ts->tt == LUA_VLNGSTR);
54 size_t len = ts->u.lnglen;
55 ts->hash = luaS_hash(getstr(ts), len, ts->hash);
62static void tablerehash (
TString **vect,
int osize,
int nsize) {
64 for (i = osize; i < nsize; i++)
66 for (i = 0; i < osize; i++) {
71 unsigned int h = lmod(p->hash, nsize);
85void luaS_resize (
lua_State *L,
int nsize) {
90 tablerehash(tb->hash, osize, nsize);
91 newvect = luaM_reallocvector(L, tb->hash, osize, nsize,
TString*);
92 if (l_unlikely(newvect == NULL)) {
94 tablerehash(tb->hash, nsize, osize);
101 tablerehash(newvect, osize, nsize);
112 for (i = 0; i < STRCACHE_N; i++)
113 for (j = 0; j < STRCACHE_M; j++) {
114 if (iswhite(g->strcache[i][j]))
115 g->strcache[i][j] = g->memerrmsg;
127 tb->hash = luaM_newvector(L, MINSTRTABSIZE,
TString*);
128 tablerehash(tb->hash, 0, MINSTRTABSIZE);
129 tb->size = MINSTRTABSIZE;
131 g->memerrmsg = luaS_newliteral(L, MEMERRMSG);
132 luaC_fix(L, obj2gco(g->memerrmsg));
133 for (i = 0; i < STRCACHE_N; i++)
134 for (j = 0; j < STRCACHE_M; j++)
135 g->strcache[i][j] = g->memerrmsg;
143static TString *createstrobj (
lua_State *L,
size_t l,
int tag,
unsigned int h) {
147 totalsize = sizelstring(l);
148 o = luaC_newobj(L, tag, totalsize);
152 getstr(ts)[l] =
'\0';
158 TString *ts = createstrobj(L, l, LUA_VLNGSTR, G(L)->seed);
166 TString **p = &tb->hash[lmod(ts->hash, tb->size)];
175 if (l_unlikely(tb->nuse == MAX_INT)) {
177 if (tb->nuse == MAX_INT)
180 if (tb->size <= MAXSTRTB / 2)
181 luaS_resize(L, tb->size * 2);
192 unsigned int h = luaS_hash(str, l, g->seed);
193 TString **list = &tb->hash[lmod(h, tb->size)];
194 lua_assert(str != NULL);
195 for (ts = *list; ts != NULL; ts = ts->u.hnext) {
196 if (l == ts->shrlen && (memcmp(str, getstr(ts), l *
sizeof(
char)) == 0)) {
204 if (tb->nuse >= tb->size) {
206 list = &tb->hash[lmod(h, tb->size)];
208 ts = createstrobj(L, l, LUA_VSHRSTR, h);
209 memcpy(getstr(ts), str, l *
sizeof(
char));
210 ts->shrlen = cast_byte(l);
222 if (l <= LUAI_MAXSHORTLEN)
223 return internshrstr(L, str, l);
226 if (l_unlikely(l >= (MAX_SIZE -
sizeof(
TString))/
sizeof(
char)))
228 ts = luaS_createlngstrobj(L, l);
229 memcpy(getstr(ts), str, l *
sizeof(
char));
242 unsigned int i = point2uint(str) % STRCACHE_N;
244 TString **p = G(L)->strcache[i];
245 for (j = 0; j < STRCACHE_M; j++) {
246 if (strcmp(str, getstr(p[j])) == 0)
250 for (j = STRCACHE_M - 1; j > 0; j--)
253 p[0] = luaS_newlstr(L, str, strlen(str));
262 if (l_unlikely(s > MAX_SIZE - udatamemoffset(nuvalue)))
264 o = luaC_newobj(L, LUA_VUSERDATA, sizeudata(nuvalue, s));
267 u->nuvalue = nuvalue;
269 for (i = 0; i < nuvalue; i++)
270 setnilvalue(&u->uv[i].uv);