diff options
Diffstat (limited to 'testes/errors.lua')
-rw-r--r-- | testes/errors.lua | 83 |
1 files changed, 47 insertions, 36 deletions
diff --git a/testes/errors.lua b/testes/errors.lua index 55bdab82..cf0ab526 100644 --- a/testes/errors.lua +++ b/testes/errors.lua | |||
@@ -114,12 +114,14 @@ checkmessage("a = {} | 1", "bitwise operation") | |||
114 | checkmessage("a = {} < 1", "attempt to compare") | 114 | checkmessage("a = {} < 1", "attempt to compare") |
115 | checkmessage("a = {} <= 1", "attempt to compare") | 115 | checkmessage("a = {} <= 1", "attempt to compare") |
116 | 116 | ||
117 | checkmessage("a=1; bbbb=2; a=math.sin(3)+bbbb(3)", "global 'bbbb'") | 117 | checkmessage("aaa=1; bbbb=2; aaa=math.sin(3)+bbbb(3)", "global 'bbbb'") |
118 | checkmessage("a={}; do local a=1 end a:bbbb(3)", "method 'bbbb'") | 118 | checkmessage("aaa={}; do local aaa=1 end aaa:bbbb(3)", "method 'bbbb'") |
119 | checkmessage("local a={}; a.bbbb(3)", "field 'bbbb'") | 119 | checkmessage("local a={}; a.bbbb(3)", "field 'bbbb'") |
120 | assert(not string.find(doit"a={13}; local bbbb=1; a[bbbb](3)", "'bbbb'")) | 120 | assert(not string.find(doit"aaa={13}; local bbbb=1; aaa[bbbb](3)", "'bbbb'")) |
121 | checkmessage("a={13}; local bbbb=1; a[bbbb](3)", "number") | 121 | checkmessage("aaa={13}; local bbbb=1; aaa[bbbb](3)", "number") |
122 | checkmessage("a=(1)..{}", "a table value") | 122 | checkmessage("aaa=(1)..{}", "a table value") |
123 | |||
124 | _G.aaa, _G.bbbb = nil | ||
123 | 125 | ||
124 | -- calls | 126 | -- calls |
125 | checkmessage("local a; a(13)", "local 'a'") | 127 | checkmessage("local a; a(13)", "local 'a'") |
@@ -134,12 +136,13 @@ checkmessage([[ | |||
134 | 136 | ||
135 | -- tail calls | 137 | -- tail calls |
136 | checkmessage("local a={}; return a.bbbb(3)", "field 'bbbb'") | 138 | checkmessage("local a={}; return a.bbbb(3)", "field 'bbbb'") |
137 | checkmessage("a={}; do local a=1 end; return a:bbbb(3)", "method 'bbbb'") | 139 | checkmessage("aaa={}; do local aaa=1 end; return aaa:bbbb(3)", "method 'bbbb'") |
140 | |||
141 | checkmessage("aaa = #print", "length of a function value") | ||
142 | checkmessage("aaa = #3", "length of a number value") | ||
138 | 143 | ||
139 | checkmessage("a = #print", "length of a function value") | 144 | _G.aaa = nil |
140 | checkmessage("a = #3", "length of a number value") | ||
141 | 145 | ||
142 | aaa = nil | ||
143 | checkmessage("aaa.bbb:ddd(9)", "global 'aaa'") | 146 | checkmessage("aaa.bbb:ddd(9)", "global 'aaa'") |
144 | checkmessage("local aaa={bbb=1}; aaa.bbb:ddd(9)", "field 'bbb'") | 147 | checkmessage("local aaa={bbb=1}; aaa.bbb:ddd(9)", "field 'bbb'") |
145 | checkmessage("local aaa={bbb={}}; aaa.bbb:ddd(9)", "method 'ddd'") | 148 | checkmessage("local aaa={bbb={}}; aaa.bbb:ddd(9)", "method 'ddd'") |
@@ -152,15 +155,16 @@ checkmessage("local a,b,cc; (function () a.x = 1 end)()", "upvalue 'a'") | |||
152 | 155 | ||
153 | checkmessage("local _ENV = {x={}}; a = a + 1", "global 'a'") | 156 | checkmessage("local _ENV = {x={}}; a = a + 1", "global 'a'") |
154 | 157 | ||
155 | checkmessage("b=1; local aaa={}; x=aaa+b", "local 'aaa'") | 158 | checkmessage("BB=1; local aaa={}; x=aaa+BB", "local 'aaa'") |
156 | checkmessage("aaa={}; x=3.3/aaa", "global 'aaa'") | 159 | checkmessage("aaa={}; x=3.3/aaa", "global 'aaa'") |
157 | checkmessage("aaa=2; b=nil;x=aaa*b", "global 'b'") | 160 | checkmessage("aaa=2; BB=nil;x=aaa*BB", "global 'BB'") |
158 | checkmessage("aaa={}; x=-aaa", "global 'aaa'") | 161 | checkmessage("aaa={}; x=-aaa", "global 'aaa'") |
159 | 162 | ||
160 | -- short circuit | 163 | -- short circuit |
161 | checkmessage("a=1; local a,bbbb=2,3; a = math.sin(1) and bbbb(3)", | 164 | checkmessage("aaa=1; local aaa,bbbb=2,3; aaa = math.sin(1) and bbbb(3)", |
162 | "local 'bbbb'") | 165 | "local 'bbbb'") |
163 | checkmessage("a=1; local a,bbbb=2,3; a = bbbb(1) or a(3)", "local 'bbbb'") | 166 | checkmessage("aaa=1; local aaa,bbbb=2,3; aaa = bbbb(1) or aaa(3)", |
167 | "local 'bbbb'") | ||
164 | checkmessage("local a,b,c,f = 1,1,1; f((a and b) or c)", "local 'f'") | 168 | checkmessage("local a,b,c,f = 1,1,1; f((a and b) or c)", "local 'f'") |
165 | checkmessage("local a,b,c = 1,1,1; ((a and b) or c)()", "call a number value") | 169 | checkmessage("local a,b,c = 1,1,1; ((a and b) or c)()", "call a number value") |
166 | assert(not string.find(doit"aaa={}; x=(aaa or aaa)+(aaa and aaa)", "'aaa'")) | 170 | assert(not string.find(doit"aaa={}; x=(aaa or aaa)+(aaa and aaa)", "'aaa'")) |
@@ -187,8 +191,8 @@ checkmessage("return ~-3e40", "has no integer representation") | |||
187 | checkmessage("return ~-3.009", "has no integer representation") | 191 | checkmessage("return ~-3.009", "has no integer representation") |
188 | checkmessage("return 3.009 & 1", "has no integer representation") | 192 | checkmessage("return 3.009 & 1", "has no integer representation") |
189 | checkmessage("return 34 >> {}", "table value") | 193 | checkmessage("return 34 >> {}", "table value") |
190 | checkmessage("a = 24 // 0", "divide by zero") | 194 | checkmessage("aaa = 24 // 0", "divide by zero") |
191 | checkmessage("a = 1 % 0", "'n%0'") | 195 | checkmessage("aaa = 1 % 0", "'n%0'") |
192 | 196 | ||
193 | 197 | ||
194 | -- type error for an object which is neither in an upvalue nor a register. | 198 | -- type error for an object which is neither in an upvalue nor a register. |
@@ -269,13 +273,13 @@ end | |||
269 | -- tests for field accesses after RK limit | 273 | -- tests for field accesses after RK limit |
270 | local t = {} | 274 | local t = {} |
271 | for i = 1, 1000 do | 275 | for i = 1, 1000 do |
272 | t[i] = "a = x" .. i | 276 | t[i] = "aaa = x" .. i |
273 | end | 277 | end |
274 | local s = table.concat(t, "; ") | 278 | local s = table.concat(t, "; ") |
275 | t = nil | 279 | t = nil |
276 | checkmessage(s.."; a = bbb + 1", "global 'bbb'") | 280 | checkmessage(s.."; aaa = bbb + 1", "global 'bbb'") |
277 | checkmessage("local _ENV=_ENV;"..s.."; a = bbb + 1", "global 'bbb'") | 281 | checkmessage("local _ENV=_ENV;"..s.."; aaa = bbb + 1", "global 'bbb'") |
278 | checkmessage(s.."; local t = {}; a = t.bbb + 1", "field 'bbb'") | 282 | checkmessage(s.."; local t = {}; aaa = t.bbb + 1", "field 'bbb'") |
279 | checkmessage(s.."; local t = {}; t:bbb()", "method 'bbb'") | 283 | checkmessage(s.."; local t = {}; t:bbb()", "method 'bbb'") |
280 | 284 | ||
281 | checkmessage([[aaa=9 | 285 | checkmessage([[aaa=9 |
@@ -324,14 +328,17 @@ main() | |||
324 | ]], "global 'NoSuchName'") | 328 | ]], "global 'NoSuchName'") |
325 | print'+' | 329 | print'+' |
326 | 330 | ||
327 | a = {}; setmetatable(a, {__index = string}) | 331 | aaa = {}; setmetatable(aaa, {__index = string}) |
328 | checkmessage("a:sub()", "bad self") | 332 | checkmessage("aaa:sub()", "bad self") |
329 | checkmessage("string.sub('a', {})", "#2") | 333 | checkmessage("string.sub('a', {})", "#2") |
330 | checkmessage("('a'):sub{}", "#1") | 334 | checkmessage("('a'):sub{}", "#1") |
331 | 335 | ||
332 | checkmessage("table.sort({1,2,3}, table.sort)", "'table.sort'") | 336 | checkmessage("table.sort({1,2,3}, table.sort)", "'table.sort'") |
333 | checkmessage("string.gsub('s', 's', setmetatable)", "'setmetatable'") | 337 | checkmessage("string.gsub('s', 's', setmetatable)", "'setmetatable'") |
334 | 338 | ||
339 | _G.aaa = nil | ||
340 | |||
341 | |||
335 | -- tests for errors in coroutines | 342 | -- tests for errors in coroutines |
336 | 343 | ||
337 | local function f (n) | 344 | local function f (n) |
@@ -349,7 +356,7 @@ checkerr("yield across", f) | |||
349 | 356 | ||
350 | -- testing size of 'source' info; size of buffer for that info is | 357 | -- testing size of 'source' info; size of buffer for that info is |
351 | -- LUA_IDSIZE, declared as 60 in luaconf. Get one position for '\0'. | 358 | -- LUA_IDSIZE, declared as 60 in luaconf. Get one position for '\0'. |
352 | idsize = 60 - 1 | 359 | local idsize = 60 - 1 |
353 | local function checksize (source) | 360 | local function checksize (source) |
354 | -- syntax error | 361 | -- syntax error |
355 | local _, msg = load("x", source) | 362 | local _, msg = load("x", source) |
@@ -411,13 +418,14 @@ x | |||
411 | 418 | ||
412 | local p = [[ | 419 | local p = [[ |
413 | function g() f() end | 420 | function g() f() end |
414 | function f(x) error('a', X) end | 421 | function f(x) error('a', XX) end |
415 | g() | 422 | g() |
416 | ]] | 423 | ]] |
417 | X=3;lineerror((p), 3) | 424 | XX=3;lineerror((p), 3) |
418 | X=0;lineerror((p), false) | 425 | XX=0;lineerror((p), false) |
419 | X=1;lineerror((p), 2) | 426 | XX=1;lineerror((p), 2) |
420 | X=2;lineerror((p), 1) | 427 | XX=2;lineerror((p), 1) |
428 | _G.XX, _G.g, _G.f = nil | ||
421 | 429 | ||
422 | 430 | ||
423 | lineerror([[ | 431 | lineerror([[ |
@@ -449,11 +457,11 @@ if not _soft then | |||
449 | -- several tests that exaust the Lua stack | 457 | -- several tests that exaust the Lua stack |
450 | collectgarbage() | 458 | collectgarbage() |
451 | print"testing stack overflow" | 459 | print"testing stack overflow" |
452 | C = 0 | 460 | local C = 0 |
453 | -- get line where stack overflow will happen | 461 | -- get line where stack overflow will happen |
454 | local l = debug.getinfo(1, "l").currentline + 1 | 462 | local l = debug.getinfo(1, "l").currentline + 1 |
455 | local function auxy () C=C+1; auxy() end -- produce a stack overflow | 463 | local function auxy () C=C+1; auxy() end -- produce a stack overflow |
456 | function y () | 464 | function YY () |
457 | collectgarbage("stop") -- avoid running finalizers without stack space | 465 | collectgarbage("stop") -- avoid running finalizers without stack space |
458 | auxy() | 466 | auxy() |
459 | collectgarbage("restart") | 467 | collectgarbage("restart") |
@@ -465,9 +473,11 @@ if not _soft then | |||
465 | return (string.find(m, "stack overflow")) | 473 | return (string.find(m, "stack overflow")) |
466 | end | 474 | end |
467 | -- repeated stack overflows (to check stack recovery) | 475 | -- repeated stack overflows (to check stack recovery) |
468 | assert(checkstackmessage(doit('y()'))) | 476 | assert(checkstackmessage(doit('YY()'))) |
469 | assert(checkstackmessage(doit('y()'))) | 477 | assert(checkstackmessage(doit('YY()'))) |
470 | assert(checkstackmessage(doit('y()'))) | 478 | assert(checkstackmessage(doit('YY()'))) |
479 | |||
480 | _G.YY = nil | ||
471 | 481 | ||
472 | 482 | ||
473 | -- error lines in stack overflow | 483 | -- error lines in stack overflow |
@@ -561,7 +571,7 @@ do | |||
561 | end | 571 | end |
562 | 572 | ||
563 | -- xpcall with arguments | 573 | -- xpcall with arguments |
564 | a, b, c = xpcall(string.find, error, "alo", "al") | 574 | local a, b, c = xpcall(string.find, error, "alo", "al") |
565 | assert(a and b == 1 and c == 2) | 575 | assert(a and b == 1 and c == 2) |
566 | a, b, c = xpcall(string.find, function (x) return {} end, true, "al") | 576 | a, b, c = xpcall(string.find, function (x) return {} end, true, "al") |
567 | assert(not a and type(b) == "table" and c == nil) | 577 | assert(not a and type(b) == "table" and c == nil) |
@@ -581,11 +591,12 @@ checksyntax("a\1a = 1", "", "<\\1>", 1) | |||
581 | -- test 255 as first char in a chunk | 591 | -- test 255 as first char in a chunk |
582 | checksyntax("\255a = 1", "", "<\\255>", 1) | 592 | checksyntax("\255a = 1", "", "<\\255>", 1) |
583 | 593 | ||
584 | doit('I = load("a=9+"); a=3') | 594 | doit('I = load("a=9+"); aaa=3') |
585 | assert(a==3 and not I) | 595 | assert(_G.aaa==3 and not _G.I) |
596 | _G.I,_G.aaa = nil | ||
586 | print('+') | 597 | print('+') |
587 | 598 | ||
588 | lim = 1000 | 599 | local lim = 1000 |
589 | if _soft then lim = 100 end | 600 | if _soft then lim = 100 end |
590 | for i=1,lim do | 601 | for i=1,lim do |
591 | doit('a = ') | 602 | doit('a = ') |