webmcp

changeset 425:beb1e7925a52

Stack traceback for "coro" (initializers/finalizers)
author jbe
date Tue Jan 12 20:03:17 2016 +0100 (2016-01-12)
parents 553a1a9dbc4c
children 9d15451c340a
files framework/env/execute/_initializers.lua
line diff
     1.1 --- a/framework/env/execute/_initializers.lua	Tue Jan 12 19:30:59 2016 +0100
     1.2 +++ b/framework/env/execute/_initializers.lua	Tue Jan 12 20:03:17 2016 +0100
     1.3 @@ -1,7 +1,6 @@
     1.4  function execute._initializers(initializer_path_element)
     1.5 -  local yieldvalue1 = {}
     1.6 -  local yieldvalue2 = {}
     1.7 -  local coro = coroutine.wrap(function()
     1.8 +  local yieldvalue_inner = {}
     1.9 +  local coro = coroutine.create(function()
    1.10      execute.multi_wrapped(
    1.11        execute._create_sorted_execution_list(
    1.12          function(add_by_path)
    1.13 @@ -13,18 +12,25 @@
    1.14          end
    1.15        ),
    1.16        function()
    1.17 -        coroutine.yield(yieldvalue1)
    1.18 +        coroutine.yield(yieldvalue_inner)
    1.19        end
    1.20      )
    1.21 -    return yieldvalue2
    1.22    end)
    1.23 -  local yieldvalue = coro()
    1.24 -  if yieldvalue == yieldvalue2 then
    1.25 +  local success, yieldvalue = coroutine.resume(coro)
    1.26 +  if not success then
    1.27 +    error(debug.traceback(coro, "Error in initializer"))
    1.28 +  end
    1.29 +  if coroutine.status(coro) == "dead" then
    1.30      error("Initializers failed to call execute.inner()")
    1.31 -  elseif yieldvalue ~= yieldvalue1 then
    1.32 -    error("Unexpected yield in initializers")
    1.33 +  elseif yieldvalue ~= yieldvalue_inner then
    1.34 +    error("Unexpected yield in initializer")
    1.35    end
    1.36    execute._finalizers[#execute._finalizers+1] = function()
    1.37 -    assert(coro() == yieldvalue2, "Unexpected yield in finalizers")
    1.38 +    if not coroutine.resume(coro) then
    1.39 +      error(debug.traceback(coro, "Error in finalizer"))
    1.40 +    end
    1.41 +    if coroutine.status(coro) ~= "dead" then
    1.42 +      error("Unexpected yield in finalizer")
    1.43 +    end
    1.44    end
    1.45  end

Impressum / About Us