aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authormitchell <70453897+667e-11@users.noreply.github.com>2016-07-14 12:06:27 -0400
committermitchell <70453897+667e-11@users.noreply.github.com>2016-07-14 12:06:27 -0400
commita035724adfe0a10f42b89ae60c89e42c23427125 (patch)
treebfb2020a28f94e7fcdb8fc8d3238183497202abd /core
parentb9b2df0cc750c2c74e1118029b293699b3cac25c (diff)
downloadtextadept-a035724adfe0a10f42b89ae60c89e42c23427125.tar.gz
textadept-a035724adfe0a10f42b89ae60c89e42c23427125.zip
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.
Diffstat (limited to 'core')
-rw-r--r--core/events.lua11
1 files changed, 6 insertions, 5 deletions
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