mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-22 13:36:14 +02:00
c0f4315cd8
CLOSES #1484, CLOSES #1486, CLOSES #1513, CLOSES #1517, CLOSES #1556, CLOSES #1564, CLOSES #1567
47 lines
2.2 KiB
Lua
47 lines
2.2 KiB
Lua
-- Driver: #1517's other half, the error handler that hid the crash.
|
|
--
|
|
-- boot.lua's deferErrhand picks `love.errorhandler or love.errhand`, so a
|
|
-- love.errorhandler that returns nil ends love.run's `while func do` loop and
|
|
-- the process leaves to the OS with no error screen and nothing on stdout.
|
|
-- LOVE 11.5 pre-populates love.errhand only, so main.lua capturing
|
|
-- love.errorhandler captured nil and every Lua error in every shipped build
|
|
-- exited silently. Measured on the installed 11.5:
|
|
-- love.errorhandler type: nil / love.errhand type: function
|
|
--
|
|
-- Nothing here can be a unit test: the deliverable is whether a human sees
|
|
-- LOVE's blue error screen or an app that vanishes.
|
|
--
|
|
-- POKEPORT_TOUCH=0 \
|
|
-- POKEPORT_DRIVER=tests/drivers/errorhandler_probe_bug1517_test.lua love .
|
|
--
|
|
-- Pre-fix: the window closes on the first drawn frame after the probe arms,
|
|
-- exit 1, no output. Post-fix: the blue screen reads "bug1517: error-handler
|
|
-- probe" plus the lua-error.log hint, and stays up until it is dismissed.
|
|
return function(game)
|
|
local U = dofile("tests/drivers/util.lua")
|
|
|
|
U.log("[1517] love.errorhandler at boot was: "
|
|
.. (rawget(love, "errorhandler") and "a function" or "nil"))
|
|
U.log("[1517] love.errhand is: " .. type(rawget(love, "errhand")))
|
|
|
|
U.wait(30)
|
|
|
|
-- Raise from a draw callback, not from this coroutine: main.lua resumes the
|
|
-- driver under coroutine.resume and prints its errors itself, which is the
|
|
-- one path that does NOT reach love.errorhandler. StateStack:draw only
|
|
-- calls the states it is actually holding, so the probe goes on the live
|
|
-- top state rather than on game.overworld, which is not on the stack while
|
|
-- the title screen or the load menu is up.
|
|
local target = game.stack:top()
|
|
U.log("[1517] arming the probe on " .. tostring(target and target.screenId))
|
|
local realDraw = target.draw
|
|
target.draw = function(self, ...)
|
|
if realDraw then realDraw(self, ...) end
|
|
error("bug1517: error-handler probe")
|
|
end
|
|
|
|
U.log("[1517] armed; the next drawn frame raises from love.draw")
|
|
U.log("[1517] you should now see LOVE's blue error screen, not a closed app")
|
|
while true do coroutine.yield() end
|
|
end
|