2021-03-08 02:22:53 +00:00
|
|
|
-- $Id: test/big.lua $
|
2021-03-02 13:51:10 +00:00
|
|
|
-- See Copyright Notice in file all.lua
|
|
|
|
|
|
|
|
if _soft then
|
|
|
|
return 'a'
|
|
|
|
end
|
|
|
|
|
|
|
|
print "testing large tables"
|
|
|
|
|
2022-07-22 04:46:07 +00:00
|
|
|
local debug = require"debug"
|
2021-03-02 13:51:10 +00:00
|
|
|
|
|
|
|
local lim = 2^18 + 1000
|
|
|
|
local prog = { "local y = {0" }
|
|
|
|
for i = 1, lim do prog[#prog + 1] = i end
|
|
|
|
prog[#prog + 1] = "}\n"
|
|
|
|
prog[#prog + 1] = "X = y\n"
|
|
|
|
prog[#prog + 1] = ("assert(X[%d] == %d)"):format(lim - 1, lim - 2)
|
|
|
|
prog[#prog + 1] = "return 0"
|
|
|
|
prog = table.concat(prog, ";")
|
|
|
|
|
|
|
|
local env = {string = string, assert = assert}
|
|
|
|
local f = assert(load(prog, nil, nil, env))
|
|
|
|
|
|
|
|
f()
|
|
|
|
assert(env.X[lim] == lim - 1 and env.X[lim + 1] == lim)
|
|
|
|
for k in pairs(env) do env[k] = undef end
|
|
|
|
|
|
|
|
-- yields during accesses larger than K (in RK)
|
|
|
|
setmetatable(env, {
|
|
|
|
__index = function (t, n) coroutine.yield('g'); return _G[n] end,
|
|
|
|
__newindex = function (t, n, v) coroutine.yield('s'); _G[n] = v end,
|
|
|
|
})
|
|
|
|
|
|
|
|
X = nil
|
Bring Lua to 5.4.6. (#1214)
This essentially re-does the work of #875 on top of master.
This is what I did to check that Cosmo's Lua extensions still worked:
```
$ build/bootstrap/make MODE=aarch64 o/aarch64/third_party/lua/lua
$ ape o/aarch64/third_party/lua/lua
>: 10
10
>: 010
8
>: 0b10
2
>: string.byte("\e")
27
>: "Hello, %s" % {"world"}
Hello, world
>: "*" * 3
***
```
`luaL_traceback2` was used to show the stack trace with parameter
values; it's used in `LuaCallWithTrace`, which is used in Redbean to run
Lua code. You should be able to see the extended stack trace by running
something like this: `redbean -e "function a(b)c()end a(2)"` (with
"params" indicating the extended stack trace):
```
stack traceback:
[string "function a(b)c()end a(2)"]:1: in function 'a', params: b = 2;
[string "function a(b)c()end a(2)"]:1: in main chunk
```
@pkulchenko confirmed that I get the expected result with the updated
code.
This is what I did to check that Lua itself still worked:
```
$ cd third_party/lua/test/
$ ape ../../../o/aarch64/third_party/lua/lua all.lua
```
There's one test failure, in `files.lua`:
```
***** FILE 'files.lua'*****
testing i/o
../../../o/aarch64/third_party/lua/lua: files.lua:84: assertion failed!
stack traceback:
[C]: in function 'assert'
files.lua:84: in main chunk
(...tail calls...)
all.lua:195: in main chunk
[C]: in ?
.>>> closing state <<<
```
That isn't a result of these changes; the same test is failing in
master.
The failure is here:
```lua
if not _port then -- invalid seek
local status, msg, code = io.stdin:seek("set", 1000)
assert(not status and type(msg) == "string" and type(code) == "number")
end
```
The test expects a seek to offset 1,000 on stdin to fail — but it
doesn't. `status` ends up being the new offset rather than `nil`.
If I comment out that one test, the remaining tests succeed.
2024-06-16 00:13:08 +00:00
|
|
|
local co = coroutine.wrap(f)
|
2021-03-02 13:51:10 +00:00
|
|
|
assert(co() == 's')
|
|
|
|
assert(co() == 'g')
|
|
|
|
assert(co() == 'g')
|
|
|
|
assert(co() == 0)
|
|
|
|
|
|
|
|
assert(X[lim] == lim - 1 and X[lim + 1] == lim)
|
|
|
|
|
|
|
|
-- errors in accesses larger than K (in RK)
|
|
|
|
getmetatable(env).__index = function () end
|
|
|
|
getmetatable(env).__newindex = function () end
|
|
|
|
local e, m = pcall(f)
|
|
|
|
assert(not e and m:find("global 'X'"))
|
|
|
|
|
2022-07-22 04:46:07 +00:00
|
|
|
-- errors in metamethods
|
2021-03-02 13:51:10 +00:00
|
|
|
getmetatable(env).__newindex = function () error("hi") end
|
|
|
|
local e, m = xpcall(f, debug.traceback)
|
|
|
|
assert(not e and m:find("'newindex'"))
|
|
|
|
|
|
|
|
f, X = nil
|
|
|
|
|
|
|
|
coroutine.yield'b'
|
|
|
|
|
2022-07-22 04:46:07 +00:00
|
|
|
if 2^32 == 0 then -- (small integers) {
|
2021-03-02 13:51:10 +00:00
|
|
|
|
|
|
|
print "testing string length overflow"
|
|
|
|
|
|
|
|
local repstrings = 192 -- number of strings to be concatenated
|
|
|
|
local ssize = math.ceil(2.0^32 / repstrings) + 1 -- size of each string
|
|
|
|
|
|
|
|
assert(repstrings * ssize > 2.0^32) -- it should be larger than maximum size
|
|
|
|
|
|
|
|
local longs = string.rep("\0", ssize) -- create one long string
|
|
|
|
|
|
|
|
-- create function to concatenate 'repstrings' copies of its argument
|
|
|
|
local rep = assert(load(
|
|
|
|
"local a = ...; return " .. string.rep("a", repstrings, "..")))
|
|
|
|
|
|
|
|
local a, b = pcall(rep, longs) -- call that function
|
|
|
|
|
|
|
|
-- it should fail without creating string (result would be too large)
|
|
|
|
assert(not a and string.find(b, "overflow"))
|
|
|
|
|
|
|
|
end -- }
|
|
|
|
|
|
|
|
print'OK'
|
|
|
|
|
|
|
|
return 'a'
|