diff options
| -rw-r--r-- | lgc.c | 26 | ||||
| -rw-r--r-- | llimits.h | 11 | ||||
| -rw-r--r-- | lobject.h | 15 | ||||
| -rw-r--r-- | lstate.h | 5 | ||||
| -rw-r--r-- | lstring.c | 96 | ||||
| -rw-r--r-- | lstring.h | 9 | ||||
| -rw-r--r-- | ltable.c | 21 | ||||
| -rw-r--r-- | ltests.c | 5 | ||||
| -rw-r--r-- | lvm.c | 3 |
9 files changed, 144 insertions, 47 deletions
| @@ -65,7 +65,11 @@ | |||
| 65 | #define white2gray(x) resetbits(gch(x)->marked, WHITEBITS) | 65 | #define white2gray(x) resetbits(gch(x)->marked, WHITEBITS) |
| 66 | #define black2gray(x) resetbit(gch(x)->marked, BLACKBIT) | 66 | #define black2gray(x) resetbit(gch(x)->marked, BLACKBIT) |
| 67 | 67 | ||
| 68 | #define stringmark(s) ((void)((s) && resetbits((s)->tsv.marked, WHITEBITS))) | 68 | /* |
| 69 | ** dirty trick: we know that 'reallymarkobject' does not use 'g' when | ||
| 70 | ** object is a string | ||
| 71 | */ | ||
| 72 | #define stringmark(s) markobject(NULL, s) | ||
| 69 | 73 | ||
| 70 | 74 | ||
| 71 | #define isfinalized(x) testbit(gch(x)->marked, FINALIZEDBIT) | 75 | #define isfinalized(x) testbit(gch(x)->marked, FINALIZEDBIT) |
| @@ -240,18 +244,18 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz, GCObject **list, | |||
| 240 | 244 | ||
| 241 | 245 | ||
| 242 | /* | 246 | /* |
| 243 | ** mark an object. Userdata and closed upvalues are visited and turned | 247 | ** mark an object. Userdata, strings, and closed upvalues are visited |
| 244 | ** black here. Strings remain gray (it is the same as making them | 248 | ** and turned black here. Other objects are marked gray and added |
| 245 | ** black). Other objects are marked gray and added to appropriate list | 249 | ** to appropriate list to be visited (and turned black) later. (Open |
| 246 | ** to be visited (and turned black) later. (Open upvalues are already | 250 | ** upvalues are already linked in 'headuv' list.) |
| 247 | ** linked in 'headuv' list.) | ||
| 248 | */ | 251 | */ |
| 249 | static void reallymarkobject (global_State *g, GCObject *o) { | 252 | static void reallymarkobject (global_State *g, GCObject *o) { |
| 250 | lua_assert(iswhite(o) && !isdead(g, o)); | ||
| 251 | white2gray(o); | 253 | white2gray(o); |
| 252 | switch (gch(o)->tt) { | 254 | switch (gch(o)->tt) { |
| 253 | case LUA_TSTRING: { | 255 | case LUA_TSHRSTR: |
| 254 | return; /* for strings, gray is as good as black */ | 256 | case LUA_TLNGSTR: { |
| 257 | gray2black(o); | ||
| 258 | return; /* nothing else to mark */ | ||
| 255 | } | 259 | } |
| 256 | case LUA_TUSERDATA: { | 260 | case LUA_TUSERDATA: { |
| 257 | Table *mt = gco2u(o)->metatable; | 261 | Table *mt = gco2u(o)->metatable; |
| @@ -663,8 +667,10 @@ static void freeobj (lua_State *L, GCObject *o) { | |||
| 663 | case LUA_TTABLE: luaH_free(L, gco2t(o)); break; | 667 | case LUA_TTABLE: luaH_free(L, gco2t(o)); break; |
| 664 | case LUA_TTHREAD: luaE_freethread(L, gco2th(o)); break; | 668 | case LUA_TTHREAD: luaE_freethread(L, gco2th(o)); break; |
| 665 | case LUA_TUSERDATA: luaM_freemem(L, o, sizeudata(gco2u(o))); break; | 669 | case LUA_TUSERDATA: luaM_freemem(L, o, sizeudata(gco2u(o))); break; |
| 666 | case LUA_TSTRING: { | 670 | case LUA_TSHRSTR: |
| 667 | G(L)->strt.nuse--; | 671 | G(L)->strt.nuse--; |
| 672 | /* go through */ | ||
| 673 | case LUA_TLNGSTR: { | ||
| 668 | luaM_freemem(L, o, sizestring(gco2ts(o))); | 674 | luaM_freemem(L, o, sizestring(gco2ts(o))); |
| 669 | break; | 675 | break; |
| 670 | } | 676 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: llimits.h,v 1.94 2011/11/29 15:39:48 roberto Exp roberto $ | 2 | ** $Id: llimits.h,v 1.95 2011/12/06 16:58:36 roberto Exp roberto $ |
| 3 | ** Limits, basic types, and some other `installation-dependent' definitions | 3 | ** Limits, basic types, and some other `installation-dependent' definitions |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -125,6 +125,15 @@ typedef LUAI_UACNUMBER l_uacNumber; | |||
| 125 | 125 | ||
| 126 | 126 | ||
| 127 | /* | 127 | /* |
| 128 | ** maximum length for short strings, that is, strings that are | ||
| 129 | ** internalized. (Cannot be smaller than reserved words or tags | ||
| 130 | ** for metamethods; #"function" = 8, #"__newindex" = 10; should | ||
| 131 | ** not be larger than 255, to allow future changes) | ||
| 132 | */ | ||
| 133 | #define LUA_MAXSHORTLEN (8 * sizeof(void*)) | ||
| 134 | |||
| 135 | |||
| 136 | /* | ||
| 128 | ** type for virtual-machine instructions | 137 | ** type for virtual-machine instructions |
| 129 | ** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) | 138 | ** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) |
| 130 | */ | 139 | */ |
| @@ -52,6 +52,12 @@ | |||
| 52 | #define LUA_TCCL (LUA_TFUNCTION | (2 << 4)) /* C closure */ | 52 | #define LUA_TCCL (LUA_TFUNCTION | (2 << 4)) /* C closure */ |
| 53 | 53 | ||
| 54 | 54 | ||
| 55 | /* | ||
| 56 | ** LUA_TSTRING variants */ | ||
| 57 | #define LUA_TSHRSTR (LUA_TSTRING | (0 << 4)) /* short strings */ | ||
| 58 | #define LUA_TLNGSTR (LUA_TSTRING | (1 << 4)) /* long strings */ | ||
| 59 | |||
| 60 | |||
| 55 | /* Bit mark for collectable types */ | 61 | /* Bit mark for collectable types */ |
| 56 | #define BIT_ISCOLLECTABLE (1 << 6) | 62 | #define BIT_ISCOLLECTABLE (1 << 6) |
| 57 | 63 | ||
| @@ -129,7 +135,9 @@ typedef struct lua_TValue TValue; | |||
| 129 | #define ttisnil(o) checktag((o), LUA_TNIL) | 135 | #define ttisnil(o) checktag((o), LUA_TNIL) |
| 130 | #define ttisboolean(o) checktag((o), LUA_TBOOLEAN) | 136 | #define ttisboolean(o) checktag((o), LUA_TBOOLEAN) |
| 131 | #define ttislightuserdata(o) checktag((o), LUA_TLIGHTUSERDATA) | 137 | #define ttislightuserdata(o) checktag((o), LUA_TLIGHTUSERDATA) |
| 132 | #define ttisstring(o) checktag((o), ctb(LUA_TSTRING)) | 138 | #define ttisstring(o) checktype((o), LUA_TSTRING) |
| 139 | #define ttisshrstring(o) checktag((o), ctb(LUA_TSHRSTR)) | ||
| 140 | #define ttislngstring(o) checktag((o), ctb(LUA_TLNGSTR)) | ||
| 133 | #define ttistable(o) checktag((o), ctb(LUA_TTABLE)) | 141 | #define ttistable(o) checktag((o), ctb(LUA_TTABLE)) |
| 134 | #define ttisfunction(o) checktype(o, LUA_TFUNCTION) | 142 | #define ttisfunction(o) checktype(o, LUA_TFUNCTION) |
| 135 | #define ttisclosure(o) ((rttype(o) & 0x1F) == LUA_TFUNCTION) | 143 | #define ttisclosure(o) ((rttype(o) & 0x1F) == LUA_TFUNCTION) |
| @@ -199,7 +207,8 @@ typedef struct lua_TValue TValue; | |||
| 199 | 207 | ||
| 200 | #define setsvalue(L,obj,x) \ | 208 | #define setsvalue(L,obj,x) \ |
| 201 | { TValue *io=(obj); \ | 209 | { TValue *io=(obj); \ |
| 202 | val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TSTRING)); \ | 210 | TString *x_ = (x); \ |
| 211 | val_(io).gc=cast(GCObject *, x_); settt_(io, ctb(x_->tsv.tt)); \ | ||
| 203 | checkliveness(G(L),io); } | 212 | checkliveness(G(L),io); } |
| 204 | 213 | ||
| 205 | #define setuvalue(L,obj,x) \ | 214 | #define setuvalue(L,obj,x) \ |
| @@ -409,7 +418,7 @@ typedef union TString { | |||
| 409 | L_Umaxalign dummy; /* ensures maximum alignment for strings */ | 418 | L_Umaxalign dummy; /* ensures maximum alignment for strings */ |
| 410 | struct { | 419 | struct { |
| 411 | CommonHeader; | 420 | CommonHeader; |
| 412 | lu_byte extra; /* reserved words for strings */ | 421 | lu_byte extra; /* reserved words for short strings; "has hash" for longs */ |
| 413 | unsigned int hash; | 422 | unsigned int hash; |
| 414 | size_t len; /* number of characters in string */ | 423 | size_t len; /* number of characters in string */ |
| 415 | } tsv; | 424 | } tsv; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.h,v 2.74 2011/09/30 12:45:07 roberto Exp roberto $ | 2 | ** $Id: lstate.h,v 2.75 2012/01/20 22:05:50 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -193,7 +193,8 @@ union GCObject { | |||
| 193 | #define gch(o) (&(o)->gch) | 193 | #define gch(o) (&(o)->gch) |
| 194 | 194 | ||
| 195 | /* macros to convert a GCObject into a specific value */ | 195 | /* macros to convert a GCObject into a specific value */ |
| 196 | #define rawgco2ts(o) check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts)) | 196 | #define rawgco2ts(o) \ |
| 197 | check_exp(novariant((o)->gch.tt) == LUA_TSTRING, &((o)->ts)) | ||
| 197 | #define gco2ts(o) (&rawgco2ts(o)->tsv) | 198 | #define gco2ts(o) (&rawgco2ts(o)->tsv) |
| 198 | #define rawgco2u(o) check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u)) | 199 | #define rawgco2u(o) check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u)) |
| 199 | #define gco2u(o) (&rawgco2u(o)->uv) | 200 | #define gco2u(o) (&rawgco2u(o)->uv) |
| @@ -18,7 +18,37 @@ | |||
| 18 | #include "lstring.h" | 18 | #include "lstring.h" |
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | /* | ||
| 22 | ** equality for long strings | ||
| 23 | */ | ||
| 24 | int luaS_eqlngstr (TString *a, TString *b) { | ||
| 25 | size_t len = a->tsv.len; | ||
| 26 | lua_assert(a->tsv.tt == LUA_TLNGSTR && b->tsv.tt == LUA_TLNGSTR); | ||
| 27 | return (len == b->tsv.len) && (memcmp(getstr(a), getstr(b), len) == 0); | ||
| 28 | } | ||
| 29 | |||
| 30 | |||
| 31 | /* | ||
| 32 | ** equality for strings | ||
| 33 | */ | ||
| 34 | int luaS_eqstr (TString *a, TString *b) { | ||
| 35 | return (a->tsv.tt == b->tsv.tt) && | ||
| 36 | (a->tsv.tt == LUA_TSHRSTR ? eqshrstr(a, b) : luaS_eqlngstr(a, b)); | ||
| 37 | } | ||
| 38 | |||
| 39 | |||
| 40 | unsigned int luaS_hash (const char *str, size_t l) { | ||
| 41 | unsigned int h = cast(unsigned int, l); /* seed */ | ||
| 42 | size_t l1; | ||
| 43 | for (l1 = 0; l1 < l; l1++) | ||
| 44 | h = h ^ ((h<<5) + (h>>2) + cast_byte(str[l1])); | ||
| 45 | return h; | ||
| 46 | } | ||
| 47 | |||
| 21 | 48 | ||
| 49 | /* | ||
| 50 | ** resizes the string table | ||
| 51 | */ | ||
| 22 | void luaS_resize (lua_State *L, int newsize) { | 52 | void luaS_resize (lua_State *L, int newsize) { |
| 23 | int i; | 53 | int i; |
| 24 | stringtable *tb = &G(L)->strt; | 54 | stringtable *tb = &G(L)->strt; |
| @@ -50,36 +80,47 @@ void luaS_resize (lua_State *L, int newsize) { | |||
| 50 | } | 80 | } |
| 51 | 81 | ||
| 52 | 82 | ||
| 53 | static TString *newlstr (lua_State *L, const char *str, size_t l, | 83 | /* |
| 54 | unsigned int h) { | 84 | ** creates a new string object |
| 55 | size_t totalsize; /* total size of TString object */ | 85 | */ |
| 56 | GCObject **list; /* (pointer to) list where it will be inserted */ | 86 | static TString *createstrobj (lua_State *L, const char *str, size_t l, |
| 87 | int tag, unsigned int h, GCObject **list) { | ||
| 57 | TString *ts; | 88 | TString *ts; |
| 58 | stringtable *tb = &G(L)->strt; | 89 | size_t totalsize; /* total size of TString object */ |
| 59 | if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char)) | ||
| 60 | luaM_toobig(L); | ||
| 61 | if (tb->nuse >= cast(lu_int32, tb->size) && tb->size <= MAX_INT/2) | ||
| 62 | luaS_resize(L, tb->size*2); /* too crowded */ | ||
| 63 | totalsize = sizeof(TString) + ((l + 1) * sizeof(char)); | 90 | totalsize = sizeof(TString) + ((l + 1) * sizeof(char)); |
| 64 | list = &tb->hash[lmod(h, tb->size)]; | 91 | ts = &luaC_newobj(L, tag, totalsize, list, 0)->ts; |
| 65 | ts = &luaC_newobj(L, LUA_TSTRING, totalsize, list, 0)->ts; | ||
| 66 | ts->tsv.len = l; | 92 | ts->tsv.len = l; |
| 67 | ts->tsv.hash = h; | 93 | ts->tsv.hash = h; |
| 68 | ts->tsv.extra = 0; | 94 | ts->tsv.extra = 0; |
| 69 | memcpy(ts+1, str, l*sizeof(char)); | 95 | memcpy(ts+1, str, l*sizeof(char)); |
| 70 | ((char *)(ts+1))[l] = '\0'; /* ending 0 */ | 96 | ((char *)(ts+1))[l] = '\0'; /* ending 0 */ |
| 71 | tb->nuse++; | ||
| 72 | return ts; | 97 | return ts; |
| 73 | } | 98 | } |
| 74 | 99 | ||
| 75 | 100 | ||
| 76 | TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { | 101 | /* |
| 102 | ** creates a new short string, inserting it into string table | ||
| 103 | */ | ||
| 104 | static TString *newshrstr (lua_State *L, const char *str, size_t l, | ||
| 105 | unsigned int h) { | ||
| 106 | GCObject **list; /* (pointer to) list where it will be inserted */ | ||
| 107 | stringtable *tb = &G(L)->strt; | ||
| 108 | TString *s; | ||
| 109 | if (tb->nuse >= cast(lu_int32, tb->size) && tb->size <= MAX_INT/2) | ||
| 110 | luaS_resize(L, tb->size*2); /* too crowded */ | ||
| 111 | list = &tb->hash[lmod(h, tb->size)]; | ||
| 112 | s = createstrobj(L, str, l, LUA_TSHRSTR, h, list); | ||
| 113 | tb->nuse++; | ||
| 114 | return s; | ||
| 115 | } | ||
| 116 | |||
| 117 | |||
| 118 | /* | ||
| 119 | ** checks whether short string exists and reuses it or creates a new one | ||
| 120 | */ | ||
| 121 | static TString *internshrstr (lua_State *L, const char *str, size_t l) { | ||
| 77 | GCObject *o; | 122 | GCObject *o; |
| 78 | unsigned int h = cast(unsigned int, l); /* seed */ | 123 | unsigned int h = luaS_hash(str, l); |
| 79 | size_t step = (l>>5)+1; /* if string is too long, don't hash all its chars */ | ||
| 80 | size_t l1; | ||
| 81 | for (l1=l; l1>=step; l1-=step) /* compute hash */ | ||
| 82 | h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1])); | ||
| 83 | for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)]; | 124 | for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)]; |
| 84 | o != NULL; | 125 | o != NULL; |
| 85 | o = gch(o)->next) { | 126 | o = gch(o)->next) { |
| @@ -92,10 +133,27 @@ TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { | |||
| 92 | return ts; | 133 | return ts; |
| 93 | } | 134 | } |
| 94 | } | 135 | } |
| 95 | return newlstr(L, str, l, h); /* not found; create a new string */ | 136 | return newshrstr(L, str, l, h); /* not found; create a new string */ |
| 96 | } | 137 | } |
| 97 | 138 | ||
| 98 | 139 | ||
| 140 | /* | ||
| 141 | ** new string (with explicit length) | ||
| 142 | */ | ||
| 143 | TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { | ||
| 144 | if (l <= LUA_MAXSHORTLEN) /* short string? */ | ||
| 145 | return internshrstr(L, str, l); | ||
| 146 | else { | ||
| 147 | if (l + 1 > (MAX_SIZET - sizeof(TString))/sizeof(char)) | ||
| 148 | luaM_toobig(L); | ||
| 149 | return createstrobj(L, str, l, LUA_TLNGSTR, 0, NULL); | ||
| 150 | } | ||
| 151 | } | ||
| 152 | |||
| 153 | |||
| 154 | /* | ||
| 155 | ** new zero-terminated string | ||
| 156 | */ | ||
| 99 | TString *luaS_new (lua_State *L, const char *str) { | 157 | TString *luaS_new (lua_State *L, const char *str) { |
| 100 | return luaS_newlstr(L, str, strlen(str)); | 158 | return luaS_newlstr(L, str, strlen(str)); |
| 101 | } | 159 | } |
| @@ -25,15 +25,18 @@ | |||
| 25 | /* | 25 | /* |
| 26 | ** test whether a string is a reserved word | 26 | ** test whether a string is a reserved word |
| 27 | */ | 27 | */ |
| 28 | #define isreserved(s) ((s)->tsv.extra > 0) | 28 | #define isreserved(s) ((s)->tsv.tt == LUA_TSHRSTR && (s)->tsv.extra > 0) |
| 29 | 29 | ||
| 30 | 30 | ||
| 31 | /* | 31 | /* |
| 32 | ** equality for strings, which are always internalized | 32 | ** equality for short strings, which are always internalized |
| 33 | */ | 33 | */ |
| 34 | #define luaS_eqstr(a,b) ((a) == (b)) | 34 | #define eqshrstr(a,b) check_exp((a)->tsv.tt == LUA_TSHRSTR, (a) == (b)) |
| 35 | 35 | ||
| 36 | 36 | ||
| 37 | LUAI_FUNC unsigned int luaS_hash (const char *str, size_t l); | ||
| 38 | LUAI_FUNC int luaS_eqlngstr (TString *a, TString *b); | ||
| 39 | LUAI_FUNC int luaS_eqstr (TString *a, TString *b); | ||
| 37 | LUAI_FUNC void luaS_resize (lua_State *L, int newsize); | 40 | LUAI_FUNC void luaS_resize (lua_State *L, int newsize); |
| 38 | LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e); | 41 | LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e); |
| 39 | LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); | 42 | LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); |
| @@ -50,7 +50,7 @@ | |||
| 50 | 50 | ||
| 51 | #define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) | 51 | #define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) |
| 52 | 52 | ||
| 53 | #define hashstr(t,str) hashpow2(t, (str)->tsv.hash) | 53 | #define hashstr(t,str) hashpow2(t, (str)->tsv.hash) |
| 54 | #define hashboolean(t,p) hashpow2(t, p) | 54 | #define hashboolean(t,p) hashpow2(t, p) |
| 55 | 55 | ||
| 56 | 56 | ||
| @@ -98,7 +98,15 @@ static Node *mainposition (const Table *t, const TValue *key) { | |||
| 98 | switch (ttype(key)) { | 98 | switch (ttype(key)) { |
| 99 | case LUA_TNUMBER: | 99 | case LUA_TNUMBER: |
| 100 | return hashnum(t, nvalue(key)); | 100 | return hashnum(t, nvalue(key)); |
| 101 | case LUA_TSTRING: | 101 | case LUA_TLNGSTR: { |
| 102 | TString *s = rawtsvalue(key); | ||
| 103 | if (s->tsv.extra == 0) { /* no hash? */ | ||
| 104 | s->tsv.hash = luaS_hash(getstr(s), s->tsv.len); | ||
| 105 | s->tsv.extra = 1; /* now it has its hash */ | ||
| 106 | } | ||
| 107 | return hashstr(t, rawtsvalue(key)); | ||
| 108 | } | ||
| 109 | case LUA_TSHRSTR: | ||
| 102 | return hashstr(t, rawtsvalue(key)); | 110 | return hashstr(t, rawtsvalue(key)); |
| 103 | case LUA_TBOOLEAN: | 111 | case LUA_TBOOLEAN: |
| 104 | return hashboolean(t, bvalue(key)); | 112 | return hashboolean(t, bvalue(key)); |
| @@ -453,12 +461,13 @@ const TValue *luaH_getint (Table *t, int key) { | |||
| 453 | 461 | ||
| 454 | 462 | ||
| 455 | /* | 463 | /* |
| 456 | ** search function for strings | 464 | ** search function for short strings |
| 457 | */ | 465 | */ |
| 458 | const TValue *luaH_getstr (Table *t, TString *key) { | 466 | const TValue *luaH_getstr (Table *t, TString *key) { |
| 459 | Node *n = hashstr(t, key); | 467 | Node *n = hashstr(t, key); |
| 468 | lua_assert(key->tsv.tt == LUA_TSHRSTR); | ||
| 460 | do { /* check whether `key' is somewhere in the chain */ | 469 | do { /* check whether `key' is somewhere in the chain */ |
| 461 | if (ttisstring(gkey(n)) && luaS_eqstr(rawtsvalue(gkey(n)), key)) | 470 | if (ttisshrstring(gkey(n)) && eqshrstr(rawtsvalue(gkey(n)), key)) |
| 462 | return gval(n); /* that's it */ | 471 | return gval(n); /* that's it */ |
| 463 | else n = gnext(n); | 472 | else n = gnext(n); |
| 464 | } while (n); | 473 | } while (n); |
| @@ -470,9 +479,9 @@ const TValue *luaH_getstr (Table *t, TString *key) { | |||
| 470 | ** main search function | 479 | ** main search function |
| 471 | */ | 480 | */ |
| 472 | const TValue *luaH_get (Table *t, const TValue *key) { | 481 | const TValue *luaH_get (Table *t, const TValue *key) { |
| 473 | switch (ttypenv(key)) { | 482 | switch (ttype(key)) { |
| 474 | case LUA_TNIL: return luaO_nilobject; | 483 | case LUA_TNIL: return luaO_nilobject; |
| 475 | case LUA_TSTRING: return luaH_getstr(t, rawtsvalue(key)); | 484 | case LUA_TSHRSTR: return luaH_getstr(t, rawtsvalue(key)); |
| 476 | case LUA_TNUMBER: { | 485 | case LUA_TNUMBER: { |
| 477 | int k; | 486 | int k; |
| 478 | lua_Number n = nvalue(key); | 487 | lua_Number n = nvalue(key); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltests.c,v 2.124 2011/11/09 19:08:07 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 2.125 2012/01/20 22:05:50 roberto Exp roberto $ |
| 3 | ** Internal Module for Debugging of the Lua Implementation | 3 | ** Internal Module for Debugging of the Lua Implementation |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -360,7 +360,8 @@ static void checkobject (global_State *g, GCObject *o) { | |||
| 360 | checkproto(g, gco2p(o)); | 360 | checkproto(g, gco2p(o)); |
| 361 | break; | 361 | break; |
| 362 | } | 362 | } |
| 363 | case LUA_TSTRING: break; | 363 | case LUA_TSHRSTR: |
| 364 | case LUA_TLNGSTR: break; | ||
| 364 | default: lua_assert(0); | 365 | default: lua_assert(0); |
| 365 | } | 366 | } |
| 366 | } | 367 | } |
| @@ -258,7 +258,8 @@ int luaV_equalobj_ (lua_State *L, const TValue *t1, const TValue *t2) { | |||
| 258 | case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */ | 258 | case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */ |
| 259 | case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); | 259 | case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); |
| 260 | case LUA_TLCF: return fvalue(t1) == fvalue(t2); | 260 | case LUA_TLCF: return fvalue(t1) == fvalue(t2); |
| 261 | case LUA_TSTRING: return luaS_eqstr(rawtsvalue(t1), rawtsvalue(t2)); | 261 | case LUA_TSHRSTR: return eqshrstr(rawtsvalue(t1), rawtsvalue(t2)); |
| 262 | case LUA_TLNGSTR: return luaS_eqlngstr(rawtsvalue(t1), rawtsvalue(t2)); | ||
| 262 | case LUA_TUSERDATA: { | 263 | case LUA_TUSERDATA: { |
| 263 | if (uvalue(t1) == uvalue(t2)) return 1; | 264 | if (uvalue(t1) == uvalue(t2)) return 1; |
| 264 | else if (L == NULL) return 0; | 265 | else if (L == NULL) return 0; |
