diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-08-30 12:49:41 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-08-30 12:49:41 -0300 |
commit | c23f7053495934bc7fbce7328af1e7f03f248de1 (patch) | |
tree | 468daa5084acc92a1453d67048568a56ce875d81 | |
parent | 42cf5f8214edf45400c7e4abd6faef27cf424801 (diff) | |
download | lua-github-c23f7053495934bc7fbce7328af1e7f03f248de1.tar.gz |
BUG: GC can collect a long string still in use during parser
-rw-r--r-- | llex.c | 5 | ||||
-rw-r--r-- | ltable.h | 6 |
2 files changed, 9 insertions, 2 deletions
@@ -1,5 +1,5 @@ /* -** $Id: llex.c,v 2.63 2013/03/16 21:10:18 roberto Exp $ +** $Id: llex.c,v 2.63.1.1 2013/04/12 18:48:47 roberto Exp roberto $ ** Lexical Analyzer ** See Copyright Notice in lua.h */ @@ -133,6 +133,9 @@ TString *luaX_newstring (LexState *ls, const char *str, size_t l) { setbvalue(o, 1); /* t[string] = true */ luaC_checkGC(L); } + else { /* string already present */ + ts = rawtsvalue(keyfromval(o)); /* re-use value previously stored */ + } L->top--; /* remove string from stack */ return ts; } @@ -1,5 +1,5 @@ /* -** $Id: ltable.h,v 2.16 2011/08/17 20:26:47 roberto Exp $ +** $Id: ltable.h,v 2.16.1.1 2013/04/12 18:48:47 roberto Exp roberto $ ** Lua tables (hash) ** See Copyright Notice in lua.h */ @@ -17,6 +17,10 @@ #define invalidateTMcache(t) ((t)->flags = 0) +/* returns the key, given the value of a table entry */ +#define keyfromval(v) \ + (gkey(cast(Node *, cast(char *, (v)) - offsetof(Node, i_val)))) + LUAI_FUNC const TValue *luaH_getint (Table *t, int key); LUAI_FUNC void luaH_setint (lua_State *L, Table *t, int key, TValue *value); |