summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-08-30 12:49:41 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-08-30 12:49:41 -0300
commitc23f7053495934bc7fbce7328af1e7f03f248de1 (patch)
tree468daa5084acc92a1453d67048568a56ce875d81
parent42cf5f8214edf45400c7e4abd6faef27cf424801 (diff)
downloadlua-github-c23f7053495934bc7fbce7328af1e7f03f248de1.tar.gz
BUG: GC can collect a long string still in use during parser
-rw-r--r--llex.c5
-rw-r--r--ltable.h6
2 files changed, 9 insertions, 2 deletions
diff --git a/llex.c b/llex.c
index 1a32e348..b1a714fa 100644
--- a/llex.c
+++ b/llex.c
@@ -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;
}
diff --git a/ltable.h b/ltable.h
index 2f6f5c2d..b28b6e62 100644
--- a/ltable.h
+++ b/ltable.h
@@ -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);