diff options
Diffstat (limited to '')
-rw-r--r-- | ldump.c | 12 | ||||
-rw-r--r-- | lundump.c | 10 | ||||
-rw-r--r-- | testes/calls.lua | 25 |
3 files changed, 35 insertions, 12 deletions
@@ -126,7 +126,7 @@ static void dumpCode (DumpState *D, const Proto *f) { | |||
126 | } | 126 | } |
127 | 127 | ||
128 | 128 | ||
129 | static void dumpFunction(DumpState *D, const Proto *f, TString *psource); | 129 | static void dumpFunction(DumpState *D, const Proto *f); |
130 | 130 | ||
131 | static void dumpConstants (DumpState *D, const Proto *f) { | 131 | static void dumpConstants (DumpState *D, const Proto *f) { |
132 | int i; | 132 | int i; |
@@ -159,7 +159,7 @@ static void dumpProtos (DumpState *D, const Proto *f) { | |||
159 | int n = f->sizep; | 159 | int n = f->sizep; |
160 | dumpInt(D, n); | 160 | dumpInt(D, n); |
161 | for (i = 0; i < n; i++) | 161 | for (i = 0; i < n; i++) |
162 | dumpFunction(D, f->p[i], f->source); | 162 | dumpFunction(D, f->p[i]); |
163 | } | 163 | } |
164 | 164 | ||
165 | 165 | ||
@@ -199,9 +199,9 @@ static void dumpDebug (DumpState *D, const Proto *f) { | |||
199 | } | 199 | } |
200 | 200 | ||
201 | 201 | ||
202 | static void dumpFunction (DumpState *D, const Proto *f, TString *psource) { | 202 | static void dumpFunction (DumpState *D, const Proto *f) { |
203 | if (D->strip || f->source == psource) | 203 | if (D->strip) |
204 | dumpString(D, NULL); /* no debug info or same source as its parent */ | 204 | dumpString(D, NULL); /* no debug info */ |
205 | else | 205 | else |
206 | dumpString(D, f->source); | 206 | dumpString(D, f->source); |
207 | dumpInt(D, f->linedefined); | 207 | dumpInt(D, f->linedefined); |
@@ -245,7 +245,7 @@ int luaU_dump(lua_State *L, const Proto *f, lua_Writer w, void *data, | |||
245 | D.nstr = 0; | 245 | D.nstr = 0; |
246 | dumpHeader(&D); | 246 | dumpHeader(&D); |
247 | dumpByte(&D, f->sizeupvalues); | 247 | dumpByte(&D, f->sizeupvalues); |
248 | dumpFunction(&D, f, NULL); | 248 | dumpFunction(&D, f); |
249 | return D.status; | 249 | return D.status; |
250 | } | 250 | } |
251 | 251 | ||
@@ -162,7 +162,7 @@ static void loadCode (LoadState *S, Proto *f) { | |||
162 | } | 162 | } |
163 | 163 | ||
164 | 164 | ||
165 | static void loadFunction(LoadState *S, Proto *f, TString *psource); | 165 | static void loadFunction(LoadState *S, Proto *f); |
166 | 166 | ||
167 | 167 | ||
168 | static void loadConstants (LoadState *S, Proto *f) { | 168 | static void loadConstants (LoadState *S, Proto *f) { |
@@ -211,7 +211,7 @@ static void loadProtos (LoadState *S, Proto *f) { | |||
211 | for (i = 0; i < n; i++) { | 211 | for (i = 0; i < n; i++) { |
212 | f->p[i] = luaF_newproto(S->L); | 212 | f->p[i] = luaF_newproto(S->L); |
213 | luaC_objbarrier(S->L, f, f->p[i]); | 213 | luaC_objbarrier(S->L, f, f->p[i]); |
214 | loadFunction(S, f->p[i], f->source); | 214 | loadFunction(S, f->p[i]); |
215 | } | 215 | } |
216 | } | 216 | } |
217 | 217 | ||
@@ -266,10 +266,8 @@ static void loadDebug (LoadState *S, Proto *f) { | |||
266 | } | 266 | } |
267 | 267 | ||
268 | 268 | ||
269 | static void loadFunction (LoadState *S, Proto *f, TString *psource) { | 269 | static void loadFunction (LoadState *S, Proto *f) { |
270 | f->source = loadStringN(S, f); | 270 | f->source = loadStringN(S, f); |
271 | if (f->source == NULL) /* no source in dump? */ | ||
272 | f->source = psource; /* reuse parent's source */ | ||
273 | f->linedefined = loadInt(S); | 271 | f->linedefined = loadInt(S); |
274 | f->lastlinedefined = loadInt(S); | 272 | f->lastlinedefined = loadInt(S); |
275 | f->numparams = loadByte(S); | 273 | f->numparams = loadByte(S); |
@@ -342,7 +340,7 @@ LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) { | |||
342 | luaD_inctop(L); | 340 | luaD_inctop(L); |
343 | cl->p = luaF_newproto(L); | 341 | cl->p = luaF_newproto(L); |
344 | luaC_objbarrier(L, cl, cl->p); | 342 | luaC_objbarrier(L, cl, cl->p); |
345 | loadFunction(&S, cl->p, NULL); | 343 | loadFunction(&S, cl->p); |
346 | lua_assert(cl->nupvalues == cl->p->sizeupvalues); | 344 | lua_assert(cl->nupvalues == cl->p->sizeupvalues); |
347 | luai_verifycode(L, cl->p); | 345 | luai_verifycode(L, cl->p); |
348 | L->top.p--; /* pop table */ | 346 | L->top.p--; /* pop table */ |
diff --git a/testes/calls.lua b/testes/calls.lua index ee8cce73..cd2696e8 100644 --- a/testes/calls.lua +++ b/testes/calls.lua | |||
@@ -487,5 +487,30 @@ do | |||
487 | end | 487 | end |
488 | end | 488 | end |
489 | 489 | ||
490 | |||
491 | do -- check reuse of strings in dumps | ||
492 | local str = "|" .. string.rep("X", 50) .. "|" | ||
493 | local foo = load(string.format([[ | ||
494 | local str <const> = "%s" | ||
495 | return { | ||
496 | function () return str end, | ||
497 | function () return str end, | ||
498 | function () return str end | ||
499 | } | ||
500 | ]], str)) | ||
501 | -- count occurrences of 'str' inside the dump | ||
502 | local dump = string.dump(foo) | ||
503 | local _, count = string.gsub(dump, str, {}) | ||
504 | -- there should be only two occurrences: | ||
505 | -- one inside the source, other the string itself. | ||
506 | assert(count == 2) | ||
507 | |||
508 | if T then -- check reuse of strings in undump | ||
509 | local funcs = load(dump)() | ||
510 | assert(string.format("%p", T.listk(funcs[1])[1]) == | ||
511 | string.format("%p", T.listk(funcs[3])[1])) | ||
512 | end | ||
513 | end | ||
514 | |||
490 | print('OK') | 515 | print('OK') |
491 | return deep | 516 | return deep |