aboutsummaryrefslogtreecommitdiff
path: root/lstring.c
diff options
context:
space:
mode:
Diffstat (limited to 'lstring.c')
-rw-r--r--lstring.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/lstring.c b/lstring.c
index 02dd54c1..7990248c 100644
--- a/lstring.c
+++ b/lstring.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstring.c,v 1.42 2000/08/09 19:16:57 roberto Exp roberto $ 2** $Id: lstring.c,v 1.43 2000/09/29 12:42:13 roberto Exp roberto $
3** String table (keeps all strings handled by Lua) 3** String table (keeps all strings handled by Lua)
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -81,17 +81,17 @@ static void newentry (lua_State *L, stringtable *tb, TString *ts, int h) {
81 81
82TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { 82TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
83 unsigned long h = hash_s(str, l); 83 unsigned long h = hash_s(str, l);
84 int h1 = h&(L->strt.size-1); 84 int h1 = h & (L->strt.size-1);
85 TString *ts; 85 TString *ts;
86 for (ts = L->strt.hash[h1]; ts; ts = ts->nexthash) { 86 for (ts = L->strt.hash[h1]; ts; ts = ts->nexthash) {
87 if (ts->u.s.len == l && (memcmp(str, ts->str, l) == 0)) 87 if (ts->len == l && (memcmp(str, ts->str, l) == 0))
88 return ts; 88 return ts;
89 } 89 }
90 /* not found */ 90 /* not found */
91 ts = (TString *)luaM_malloc(L, sizestring(l)); 91 ts = (TString *)luaM_malloc(L, sizestring(l));
92 ts->marked = 0; 92 ts->marked = 0;
93 ts->nexthash = NULL; 93 ts->nexthash = NULL;
94 ts->u.s.len = l; 94 ts->len = l;
95 ts->u.s.hash = h; 95 ts->u.s.hash = h;
96 ts->u.s.constindex = 0; 96 ts->u.s.constindex = 0;
97 memcpy(ts->str, str, l); 97 memcpy(ts->str, str, l);
@@ -102,22 +102,31 @@ TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
102} 102}
103 103
104 104
105TString *luaS_newudata (lua_State *L, size_t s, void *udata) {
106 TString *ts = (TString *)luaM_malloc(L, (lint32)sizeof(TString)+s);
107 ts->marked = 0;
108 ts->nexthash = NULL;
109 ts->len = s;
110 ts->u.d.tag = 0;
111 ts->u.d.value = (udata == NULL) ? ts+1 : udata;
112 L->nblocks += sizestring(s);
113 /* insert it on table */
114 newentry(L, &L->udt, ts, IntPoint(ts->u.d.value) & (L->udt.size-1));
115 return ts;
116}
117
118
105TString *luaS_createudata (lua_State *L, void *udata, int tag) { 119TString *luaS_createudata (lua_State *L, void *udata, int tag) {
106 unsigned long h = IntPoint(udata); 120 int h1 = IntPoint(udata) & (L->udt.size-1);
107 int h1 = h&(L->udt.size-1);
108 TString *ts; 121 TString *ts;
109 for (ts = L->udt.hash[h1]; ts; ts = ts->nexthash) { 122 for (ts = L->udt.hash[h1]; ts; ts = ts->nexthash) {
110 if (udata == ts->u.d.value && (tag == ts->u.d.tag || tag == LUA_ANYTAG)) 123 if (udata == ts->u.d.value && (tag == ts->u.d.tag || tag == LUA_ANYTAG))
111 return ts; 124 return ts;
112 } 125 }
113 /* not found */ 126 /* not found */
114 ts = luaM_new(L, TString); 127 ts = luaS_newudata(L, 0, udata);
115 ts->marked = 0; 128 if (tag != LUA_ANYTAG)
116 ts->nexthash = NULL; 129 ts->u.d.tag = tag;
117 ts->u.d.value = udata;
118 ts->u.d.tag = (tag == LUA_ANYTAG) ? 0 : tag;
119 L->nblocks += gcsizeudata;
120 newentry(L, &L->udt, ts, h1); /* insert it on table */
121 return ts; 130 return ts;
122} 131}
123 132