diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2025-03-10 15:21:32 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2025-03-10 15:21:32 -0300 |
| commit | b5b1995f2925b2f9be4a48304ac97a38f8608648 (patch) | |
| tree | 6935ced2337eb900029ccb119636185df5037fd8 /testes | |
| parent | cb88c1cd5d22fe7c56f4f374ded7c16f7cf14bf3 (diff) | |
| download | lua-b5b1995f2925b2f9be4a48304ac97a38f8608648.tar.gz lua-b5b1995f2925b2f9be4a48304ac97a38f8608648.tar.bz2 lua-b5b1995f2925b2f9be4a48304ac97a38f8608648.zip | |
Checks for type 'int' added to binary header
The structure 'AbsLineInfo' is hard-dumped into binary chunks, and
it comprises two 'int' fields.
Diffstat (limited to 'testes')
| -rw-r--r-- | testes/calls.lua | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/testes/calls.lua b/testes/calls.lua index 31028215..8b355957 100644 --- a/testes/calls.lua +++ b/testes/calls.lua | |||
| @@ -480,15 +480,22 @@ assert((function (a) return a end)() == nil) | |||
| 480 | 480 | ||
| 481 | print("testing binary chunks") | 481 | print("testing binary chunks") |
| 482 | do | 482 | do |
| 483 | local header = string.pack("c4BBc6BBB", | 483 | local headformat = "c4BBc6BiBI4BjBn" |
| 484 | "\27Lua", -- signature | 484 | local header = { -- header components |
| 485 | 0x55, -- version 5.5 (0x55) | 485 | "\27Lua", -- signature |
| 486 | 0, -- format | 486 | 0x55, -- version 5.5 (0x55) |
| 487 | "\x19\x93\r\n\x1a\n", -- data | 487 | 0, -- format |
| 488 | 4, -- size of instruction | 488 | "\x19\x93\r\n\x1a\n", -- a binary string |
| 489 | string.packsize("j"), -- sizeof(lua integer) | 489 | string.packsize("i"), -- size of an int |
| 490 | string.packsize("n") -- sizeof(lua number) | 490 | -0x5678, -- an int |
| 491 | ) | 491 | 4, -- size of an instruction |
| 492 | 0x12345678, -- an instruction (4 bytes) | ||
| 493 | string.packsize("j"), -- size of a Lua integer | ||
| 494 | -0x5678, -- a Lua integer | ||
| 495 | string.packsize("n"), -- size of a Lua float | ||
| 496 | -370.5, -- a Lua float | ||
| 497 | } | ||
| 498 | |||
| 492 | local c = string.dump(function () | 499 | local c = string.dump(function () |
| 493 | local a = 1; local b = 3; | 500 | local a = 1; local b = 3; |
| 494 | local f = function () return a + b + _ENV.c; end -- upvalues | 501 | local f = function () return a + b + _ENV.c; end -- upvalues |
| @@ -500,17 +507,23 @@ do | |||
| 500 | assert(assert(load(c))() == 10) | 507 | assert(assert(load(c))() == 10) |
| 501 | 508 | ||
| 502 | -- check header | 509 | -- check header |
| 503 | assert(string.sub(c, 1, #header) == header) | 510 | local t = {string.unpack(headformat, c)} |
| 504 | -- check LUAC_INT and LUAC_NUM | ||
| 505 | local ci, cn = string.unpack("jn", c, #header + 1) | ||
| 506 | assert(ci == 0x5678 and cn == 370.5) | ||
| 507 | |||
| 508 | -- corrupted header | ||
| 509 | for i = 1, #header do | 511 | for i = 1, #header do |
| 512 | assert(t[i] == header[i]) | ||
| 513 | end | ||
| 514 | |||
| 515 | -- Testing corrupted header. | ||
| 516 | -- A single wrong byte in the head invalidates the chunk, | ||
| 517 | -- except for the Lua float check. (If numbers are long double, | ||
| 518 | -- the representation may need padding, and changing that padding | ||
| 519 | -- will not invalidate the chunk.) | ||
| 520 | local headlen = string.packsize(headformat) | ||
| 521 | headlen = headlen - string.packsize("n") -- remove float check | ||
| 522 | for i = 1, headlen do | ||
| 510 | local s = string.sub(c, 1, i - 1) .. | 523 | local s = string.sub(c, 1, i - 1) .. |
| 511 | string.char(string.byte(string.sub(c, i, i)) + 1) .. | 524 | string.char((string.byte(string.sub(c, i, i)) + 1) & 0xFF) .. |
| 512 | string.sub(c, i + 1, -1) | 525 | string.sub(c, i + 1, -1) |
| 513 | assert(#s == #c) | 526 | assert(#s == #c and s ~= c) |
| 514 | assert(not load(s)) | 527 | assert(not load(s)) |
| 515 | end | 528 | end |
| 516 | 529 | ||
