accepts limit param

This commit is contained in:
kikito 2013-09-03 13:14:42 +02:00
parent ea90a3c971
commit 57a914f082
2 changed files with 18 additions and 8 deletions

View File

@ -54,7 +54,11 @@ local function cleanup()
end end
local function run(f, options) local function run(f, options)
if type(f) == 'string' then f = loadstring(f) end if type(f) == 'string' then f = assert(loadstring(f)) end
options = options or {}
local limit = options.limit or 500000
setfenv(f, BASE_ENV) setfenv(f, BASE_ENV)
@ -65,8 +69,8 @@ local function run(f, options)
local step = 1 local step = 1
local count = 0 local count = 0
local timeout = function(str) local timeout = function(str)
count = count + step count = count + 1
if count >= 500000 then if count >= limit then
cleanup() cleanup()
error('Timeout') error('Timeout')
end end
@ -87,4 +91,4 @@ end
local sandbox = { run = run } local sandbox = { run = run }
return setmetatable(sandbox, {__call = function(_,f) return run(f) end}) return setmetatable(sandbox, {__call = function(_,f,o) return run(f,o) end})

View File

@ -38,10 +38,16 @@ describe('sandbox', function()
assert.equal('hellohello', string.rep('hello', 2)) assert.equal('hellohello', string.rep('hello', 2))
end) end)
it('#focus throws an error with infinite loops', function()
assert.has_error(function() sandbox("while true do end") end) describe('when handling infinite loops', function()
it('throws an error with infinite loops', function()
assert.has_error(function() sandbox("while true do end") end)
end)
it('#focus accepts a limit param', function()
--assert.no_has_error(function() sandbox("for i=1,10000 do end") end)
assert.has_error(function() sandbox("for i=1,10000 do end", {limit = 50}) end)
end)
end) end)
end) end)