summaryrefslogtreecommitdiff
path: root/Build/source/libs/lua53/lua53-src/src/lundump.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/lua53/lua53-src/src/lundump.c')
-rw-r--r--Build/source/libs/lua53/lua53-src/src/lundump.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/Build/source/libs/lua53/lua53-src/src/lundump.c b/Build/source/libs/lua53/lua53-src/src/lundump.c
index 7a67d75aaa0..edf9eb8d008 100644
--- a/Build/source/libs/lua53/lua53-src/src/lundump.c
+++ b/Build/source/libs/lua53/lua53-src/src/lundump.c
@@ -85,8 +85,10 @@ static lua_Integer LoadInteger (LoadState *S) {
}
-static TString *LoadString (LoadState *S) {
+static TString *LoadString (LoadState *S, Proto *p) {
+ lua_State *L = S->L;
size_t size = LoadByte(S);
+ TString *ts;
if (size == 0xFF)
LoadVar(S, size);
if (size == 0)
@@ -94,13 +96,17 @@ static TString *LoadString (LoadState *S) {
else if (--size <= LUAI_MAXSHORTLEN) { /* short string? */
char buff[LUAI_MAXSHORTLEN];
LoadVector(S, buff, size);
- return luaS_newlstr(S->L, buff, size);
+ ts = luaS_newlstr(L, buff, size);
}
else { /* long string */
- TString *ts = luaS_createlngstrobj(S->L, size);
+ ts = luaS_createlngstrobj(L, size);
+ setsvalue2s(L, L->top, ts); /* anchor it ('loadVector' can GC) */
+ luaD_inctop(L);
LoadVector(S, getstr(ts), size); /* load directly in final place */
- return ts;
+ L->top--; /* pop string */
}
+ luaC_objbarrier(L, p, ts);
+ return ts;
}
@@ -140,7 +146,7 @@ static void LoadConstants (LoadState *S, Proto *f) {
break;
case LUA_TSHRSTR:
case LUA_TLNGSTR:
- setsvalue2n(S->L, o, LoadString(S));
+ setsvalue2n(S->L, o, LoadString(S, f));
break;
default:
lua_assert(0);
@@ -158,6 +164,7 @@ static void LoadProtos (LoadState *S, Proto *f) {
f->p[i] = NULL;
for (i = 0; i < n; i++) {
f->p[i] = luaF_newproto(S->L);
+ luaC_objbarrier(S->L, f, f->p[i]);
LoadFunction(S, f->p[i], f->source);
}
}
@@ -189,18 +196,18 @@ static void LoadDebug (LoadState *S, Proto *f) {
for (i = 0; i < n; i++)
f->locvars[i].varname = NULL;
for (i = 0; i < n; i++) {
- f->locvars[i].varname = LoadString(S);
+ f->locvars[i].varname = LoadString(S, f);
f->locvars[i].startpc = LoadInt(S);
f->locvars[i].endpc = LoadInt(S);
}
n = LoadInt(S);
for (i = 0; i < n; i++)
- f->upvalues[i].name = LoadString(S);
+ f->upvalues[i].name = LoadString(S, f);
}
static void LoadFunction (LoadState *S, Proto *f, TString *psource) {
- f->source = LoadString(S);
+ f->source = LoadString(S, f);
if (f->source == NULL) /* no source in dump? */
f->source = psource; /* reuse parent's source */
f->linedefined = LoadInt(S);
@@ -271,6 +278,7 @@ LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) {
setclLvalue(L, L->top, cl);
luaD_inctop(L);
cl->p = luaF_newproto(L);
+ luaC_objbarrier(L, cl, cl->p);
LoadFunction(&S, cl->p, NULL);
lua_assert(cl->nupvalues == cl->p->sizeupvalues);
luai_verifycode(L, buff, cl->p);