equal
deleted
inserted
replaced
24 return event:sub(-2, -1) == "/*"; |
24 return event:sub(-2, -1) == "/*"; |
25 end |
25 end |
26 local function is_wildcard_match(wildcard_event, event) |
26 local function is_wildcard_match(wildcard_event, event) |
27 return wildcard_event:sub(1, -2) == event:sub(1, #wildcard_event-1); |
27 return wildcard_event:sub(1, -2) == event:sub(1, #wildcard_event-1); |
28 end |
28 end |
|
29 |
|
30 local recent_wildcard_events, max_cached_wildcard_events = {}, 10000; |
29 |
31 |
30 local event_map = events._event_map; |
32 local event_map = events._event_map; |
31 setmetatable(events._handlers, { |
33 setmetatable(events._handlers, { |
32 __index = function (handlers, curr_event) |
34 __index = function (handlers, curr_event) |
33 if is_wildcard_event(curr_event) then return; end -- Wildcard events cannot be fired |
35 if is_wildcard_event(curr_event) then return; end -- Wildcard events cannot be fired |
56 end); |
58 end); |
57 else |
59 else |
58 handlers_array = false; |
60 handlers_array = false; |
59 end |
61 end |
60 rawset(handlers, curr_event, handlers_array); |
62 rawset(handlers, curr_event, handlers_array); |
|
63 if not event_map[curr_event] then -- Only wildcard handlers match, if any |
|
64 table.insert(recent_wildcard_events, curr_event); |
|
65 if #recent_wildcard_events > max_cached_wildcard_events then |
|
66 rawset(handlers, table.remove(recent_wildcard_events, 1), nil); |
|
67 end |
|
68 end |
61 return handlers_array; |
69 return handlers_array; |
62 end; |
70 end; |
63 __newindex = function (handlers, curr_event, handlers_array) |
71 __newindex = function (handlers, curr_event, handlers_array) |
64 if handlers_array == nil |
72 if handlers_array == nil |
65 and is_wildcard_event(curr_event) then |
73 and is_wildcard_event(curr_event) then |