From a035724adfe0a10f42b89ae60c89e42c23427125 Mon Sep 17 00:00:00 2001 From: mitchell <70453897+667e-11@users.noreply.github.com> Date: Thu, 14 Jul 2016 12:06:27 -0400 Subject: Fixed bug in keeping track of event indices; core/events.lua As a result, `events.disconnect()` may disconnect the wrong event handler. Thanks to David Karell. --- core/events.lua | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'core') diff --git a/core/events.lua b/core/events.lua index 9d84a48c..849c4302 100644 --- a/core/events.lua +++ b/core/events.lua @@ -272,9 +272,8 @@ function M.connect(event, f, index) -- Note: cannot assert() here since _L is undefined early in init process. if not event then error(_L['Undefined event name']) end if not handlers[event] then handlers[event] = {} end - if handlers[event][f] then M.disconnect(event, f) end + M.disconnect(event, f) -- in case it already exists table.insert(handlers[event], index or #handlers[event] + 1, f) - handlers[event][f] = index or #handlers[event] end --- @@ -284,9 +283,10 @@ end -- @see connect -- @name disconnect function M.disconnect(event, f) - if not handlers[event] or not handlers[event][f] then return end - table.remove(handlers[event], handlers[event][f]) - handlers[event][f] = nil + if not handlers[event] then return end + for i = 1, #handlers[event] do + if handlers[event][i] == f then table.remove(handlers[event], i) break end + end end local error_emitted = false @@ -309,6 +309,7 @@ function M.emit(event, ...) local h = handlers[event] if not h then return end for i = 1, #h do + if not h[i] then break end -- M.disconnect() for this event was called local ok, result = pcall(h[i], ...) if not ok then if not error_emitted then -- cgit v1.2.3