diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-06-18 16:52:22 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-06-18 16:52:22 -0300 |
| commit | be73f72fcc944a8ebae2c60d2ce84139acb011b9 (patch) | |
| tree | 6ba1154c224a4b7af9e5202b4b52e43706faddb1 /testes/cstack.lua | |
| parent | 3cd9b56ae6002b4ef28d2467abd119606ae625d3 (diff) | |
| download | lua-github-be73f72fcc944a8ebae2c60d2ce84139acb011b9.tar.gz | |
New function 'setCstacklimit'
Added new functions to dynamically set the C-stack limit
('lua_setCstacklimit' in the C-API, 'debug.setCstacklimit' in Lua).
Diffstat (limited to 'testes/cstack.lua')
| -rw-r--r-- | testes/cstack.lua | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/testes/cstack.lua b/testes/cstack.lua index 3cb1e4ce..c7aa740f 100644 --- a/testes/cstack.lua +++ b/testes/cstack.lua @@ -1,8 +1,14 @@ -- $Id: testes/cstack.lua $ -- See Copyright Notice in file all.lua +local debug = require "debug" + print"testing C-stack overflow detection" +local origlimit = debug.setCstacklimit(400) +print("current stack limit: " .. origlimit) +debug.setCstacklimit(origlimit) + -- Segmentation faults in these tests probably result from a C-stack -- overflow. To avoid these errors, recompile Lua with a smaller -- value for the constant 'LUAI_MAXCCALLS' or else ensure a larger @@ -79,4 +85,46 @@ do print("testing stack-overflow in recursive 'gsub'") print("\tfinal count: ", count) end + +do print("testing changes in C-stack limit") + + assert(not debug.setCstacklimit(0)) -- limit too small + assert(not debug.setCstacklimit(50000)) -- limit too large + local co = coroutine.wrap (function () + return debug.setCstacklimit(400) + end) + assert(co() == false) -- cannot change C stack inside coroutine + + local n + local function foo () n = n + 1; foo () end + + local function check () + n = 0 + pcall(foo) + return n + end + + assert(debug.setCstacklimit(400) == origlimit) + local lim400 = check() + -- a very low limit (given that the several calls to arive here) + local lowlimit = 38 + assert(debug.setCstacklimit(lowlimit) == 400) + assert(check() < lowlimit - 30) + assert(debug.setCstacklimit(600) == lowlimit) + local lim600 = check() + assert(lim600 == lim400 + 200) + + + -- 'setCstacklimit' works inside protected calls. (The new stack + -- limit is kept when 'pcall' returns.) + assert(pcall(function () + assert(debug.setCstacklimit(400) == 600) + assert(check() <= lim400) + end)) + + assert(check() == lim400) + assert(debug.setCstacklimit(origlimit) == 400) -- restore original limit +end + + print'OK' |
