diff options
-rw-r--r-- | lundump.c | 3 | ||||
-rw-r--r-- | testes/calls.lua | 16 |
2 files changed, 18 insertions, 1 deletions
@@ -120,7 +120,10 @@ static TString *loadStringN (LoadState *S, Proto *p) { | |||
120 | } | 120 | } |
121 | else { /* long string */ | 121 | else { /* long string */ |
122 | ts = luaS_createlngstrobj(L, size); /* create string */ | 122 | ts = luaS_createlngstrobj(L, size); /* create string */ |
123 | setsvalue2s(L, L->top, ts); /* anchor it ('loadVector' can GC) */ | ||
124 | luaD_inctop(L); | ||
123 | loadVector(S, getstr(ts), size); /* load directly in final place */ | 125 | loadVector(S, getstr(ts), size); /* load directly in final place */ |
126 | L->top--; /* pop string */ | ||
124 | } | 127 | } |
125 | luaC_objbarrier(L, p, ts); | 128 | luaC_objbarrier(L, p, ts); |
126 | return ts; | 129 | return ts; |
diff --git a/testes/calls.lua b/testes/calls.lua index decf4176..ff72d8f6 100644 --- a/testes/calls.lua +++ b/testes/calls.lua | |||
@@ -317,6 +317,16 @@ f = load(string.dump(function () return 1 end), nil, "b", {}) | |||
317 | assert(type(f) == "function" and f() == 1) | 317 | assert(type(f) == "function" and f() == 1) |
318 | 318 | ||
319 | 319 | ||
320 | do -- another bug (in 5.4.0) | ||
321 | -- loading a binary long string interrupted by GC cycles | ||
322 | local f = string.dump(function () | ||
323 | return '01234567890123456789012345678901234567890123456789' | ||
324 | end) | ||
325 | f = load(read1(f)) | ||
326 | assert(f() == '01234567890123456789012345678901234567890123456789') | ||
327 | end | ||
328 | |||
329 | |||
320 | x = string.dump(load("x = 1; return x")) | 330 | x = string.dump(load("x = 1; return x")) |
321 | a = assert(load(read1(x), nil, "b")) | 331 | a = assert(load(read1(x), nil, "b")) |
322 | assert(a() == 1 and _G.x == 1) | 332 | assert(a() == 1 and _G.x == 1) |
@@ -358,8 +368,12 @@ x = [[ | |||
358 | end | 368 | end |
359 | end | 369 | end |
360 | ]] | 370 | ]] |
371 | a = assert(load(read1(x), "read", "t")) | ||
372 | assert(a()(2)(3)(10) == 15) | ||
361 | 373 | ||
362 | a = assert(load(read1(x))) | 374 | -- repeat the test loading a binary chunk |
375 | x = string.dump(a) | ||
376 | a = assert(load(read1(x), "read", "b")) | ||
363 | assert(a()(2)(3)(10) == 15) | 377 | assert(a()(2)(3)(10) == 15) |
364 | 378 | ||
365 | 379 | ||