|  | @@ -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);
 |