diff options
Diffstat (limited to 'testes/locals.lua')
| -rw-r--r-- | testes/locals.lua | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/testes/locals.lua b/testes/locals.lua index a25b2b9f..446ec13a 100644 --- a/testes/locals.lua +++ b/testes/locals.lua | |||
| @@ -529,6 +529,40 @@ local function checktable (t1, t2) | |||
| 529 | end | 529 | end |
| 530 | 530 | ||
| 531 | 531 | ||
| 532 | do -- test for tbc variable high in the stack | ||
| 533 | |||
| 534 | -- function to force a stack overflow | ||
| 535 | local function overflow (n) | ||
| 536 | overflow(n + 1) | ||
| 537 | end | ||
| 538 | |||
| 539 | -- error handler will create tbc variable handling a stack overflow, | ||
| 540 | -- high in the stack | ||
| 541 | local function errorh (m) | ||
| 542 | assert(string.find(m, "stack overflow")) | ||
| 543 | local x <close> = func2close(function (o) o[1] = 10 end) | ||
| 544 | return x | ||
| 545 | end | ||
| 546 | |||
| 547 | local flag | ||
| 548 | local st, obj | ||
| 549 | -- run test in a coroutine so as not to swell the main stack | ||
| 550 | local co = coroutine.wrap(function () | ||
| 551 | -- tbc variable down the stack | ||
| 552 | local y <close> = func2close(function (obj, msg) | ||
| 553 | assert(msg == nil) | ||
| 554 | obj[1] = 100 | ||
| 555 | flag = obj | ||
| 556 | end) | ||
| 557 | collectgarbage("stop") | ||
| 558 | st, obj = xpcall(overflow, errorh, 0) | ||
| 559 | collectgarbage("restart") | ||
| 560 | end) | ||
| 561 | co() | ||
| 562 | assert(not st and obj[1] == 10 and flag[1] == 100) | ||
| 563 | end | ||
| 564 | |||
| 565 | |||
| 532 | if rawget(_G, "T") then | 566 | if rawget(_G, "T") then |
| 533 | 567 | ||
| 534 | -- memory error inside closing function | 568 | -- memory error inside closing function |
| @@ -563,13 +597,13 @@ if rawget(_G, "T") then | |||
| 563 | 597 | ||
| 564 | local function test () | 598 | local function test () |
| 565 | local x <close> = enter(0) -- set a memory limit | 599 | local x <close> = enter(0) -- set a memory limit |
| 566 | -- creation of previous upvalue will raise a memory error | 600 | local y = {} -- raise a memory error |
| 567 | assert(false) -- should not run | ||
| 568 | end | 601 | end |
| 569 | 602 | ||
| 570 | local _, msg = pcall(test) | 603 | local _, msg = pcall(test) |
| 571 | assert(msg == "not enough memory" and closemsg == "not enough memory") | 604 | assert(msg == "not enough memory" and closemsg == "not enough memory") |
| 572 | 605 | ||
| 606 | |||
| 573 | -- repeat test with extra closing upvalues | 607 | -- repeat test with extra closing upvalues |
| 574 | local function test () | 608 | local function test () |
| 575 | local xxx <close> = func2close(function (self, msg) | 609 | local xxx <close> = func2close(function (self, msg) |
| @@ -580,8 +614,7 @@ if rawget(_G, "T") then | |||
| 580 | assert(msg == "not enough memory"); | 614 | assert(msg == "not enough memory"); |
| 581 | end) | 615 | end) |
| 582 | local x <close> = enter(0) -- set a memory limit | 616 | local x <close> = enter(0) -- set a memory limit |
| 583 | -- creation of previous upvalue will raise a memory error | 617 | local y = {} -- raise a memory error |
| 584 | os.exit(false) -- should not run | ||
| 585 | end | 618 | end |
| 586 | 619 | ||
| 587 | local _, msg = pcall(test) | 620 | local _, msg = pcall(test) |
| @@ -607,7 +640,7 @@ if rawget(_G, "T") then | |||
| 607 | -- concat this table needs two buffer resizes (one for each 's') | 640 | -- concat this table needs two buffer resizes (one for each 's') |
| 608 | local a = {s, s} | 641 | local a = {s, s} |
| 609 | 642 | ||
| 610 | collectgarbage() | 643 | collectgarbage(); collectgarbage() |
| 611 | 644 | ||
| 612 | m = T.totalmem() | 645 | m = T.totalmem() |
| 613 | collectgarbage("stop") | 646 | collectgarbage("stop") |
| @@ -630,7 +663,7 @@ if rawget(_G, "T") then | |||
| 630 | -- second buffer was released by 'toclose' | 663 | -- second buffer was released by 'toclose' |
| 631 | assert(T.totalmem() - m <= extra) | 664 | assert(T.totalmem() - m <= extra) |
| 632 | 665 | ||
| 633 | -- userdata, upvalue, buffer, buffer, final string | 666 | -- userdata, buffer, buffer, final string |
| 634 | T.totalmem(m + 4*lim + extra) | 667 | T.totalmem(m + 4*lim + extra) |
| 635 | assert(#table.concat(a) == 2*lim) | 668 | assert(#table.concat(a) == 2*lim) |
| 636 | 669 | ||
| @@ -753,8 +786,8 @@ do | |||
| 753 | checktable({co()}, {true, 10, 20, 30}) | 786 | checktable({co()}, {true, 10, 20, 30}) |
| 754 | checktable(trace, {"nowX", "z1", "z2", "nowY", "y1", "y2", "x1", "x2"}) | 787 | checktable(trace, {"nowX", "z1", "z2", "nowY", "y1", "y2", "x1", "x2"}) |
| 755 | 788 | ||
| 756 | end | 789 | end |
| 757 | 790 | ||
| 758 | 791 | ||
| 759 | do | 792 | do |
| 760 | -- yielding inside closing metamethods after an error | 793 | -- yielding inside closing metamethods after an error |
