diff --git a/3rd/lua/lfunc.c b/3rd/lua/lfunc.c index 20dfc151..0141f98a 100644 --- a/3rd/lua/lfunc.c +++ b/3rd/lua/lfunc.c @@ -155,6 +155,7 @@ void luaF_shareproto (Proto *f) { int i; if (f == NULL) return; + makeshared(f); MAKESHARED(f->source); for (i = 0; i < f->sizek; i++) { if (ttnov(&f->k[i]) == LUA_TSTRING) diff --git a/3rd/lua/lgc.c b/3rd/lua/lgc.c index dfe12044..a3cd6654 100644 --- a/3rd/lua/lgc.c +++ b/3rd/lua/lgc.c @@ -266,8 +266,10 @@ static void reallymarkobject (global_State *g, GCObject *o) { break; } case LUA_TLCL: { - white2gray(o); - linkgclist(gco2lcl(o), g->gray); + if (!isshared(o)) { + white2gray(o); + linkgclist(gco2lcl(o), g->gray); + } break; } case LUA_TCCL: { diff --git a/3rd/lua/lstring.c b/3rd/lua/lstring.c index 20bc9f5d..4bec4a7c 100644 --- a/3rd/lua/lstring.c +++ b/3rd/lua/lstring.c @@ -935,6 +935,7 @@ new_string(unsigned int h, const char *str, lu_byte l) { memset(ts, 0, sz); setbits(ts->marked, WHITEBITS); gray2black(ts); + makeshared(ts); ts->tt = LUA_TSHRSTR; ts->hash = h; ts->shrlen = l; diff --git a/lualib-src/lua-sharetable.c b/lualib-src/lua-sharetable.c index 0dbb5256..18ec781b 100644 --- a/lualib-src/lua-sharetable.c +++ b/lualib-src/lua-sharetable.c @@ -39,8 +39,12 @@ mark_shared(lua_State *L) { case LUA_TLIGHTUSERDATA: break; case LUA_TFUNCTION: - if (!lua_iscfunction(L, idx) || lua_getupvalue(L, idx, 1) != NULL) - luaL_error(L, "Invalid function"); + if (lua_getupvalue(L, idx, 1) != NULL) { + luaL_error(L, "Invalid function with upvalue"); + } else if (!lua_iscfunction(L, idx)) { + LClosure *f = (LClosure *)lua_topointer(L, idx); + makeshared(f); + } break; case LUA_TSTRING: lua_sharestring(L, idx);