event.lua(这个应该是源码)好像有BUG

cocos2d-x-3.14.1test\cocos\scripting\lua-bindings\script\framework\components 文件路径大致在这里。
疑似有问题的代码块大致在这里:
function Event:dispatchEvent(event)
event.name = string.upper(tostring(event.name))
local eventName = event.name
if DEBUG > 1 then
– printInfo("%s [Event] dispatchEvent() - event %s", tostring(self.target_), eventName)
end

if self.listeners_[eventName] == nil then return end
event.target = self.target_
event.stop_ = false
event.stop = function(self)
    self.stop_ = true
end

for handle, listener in pairs(self.listeners_[eventName]) do
    if DEBUG > 1 then
        -- printInfo("%s [Event] dispatchEvent() - dispatching event %s to listener %s", tostring(self.target_), eventName, handle)
    end
    -- listener[1] = listener
    -- listener[2] = tag
    event.tag = listener[2]
    listener[1](event)
    if event.stop_ then
        if DEBUG > 1 then
            -- printInfo("%s [Event] dispatchEvent() - break dispatching for event %s", tostring(self.target_), eventName)
        end
        break
    end
end

return self.target_

end


上面代码会用for循环进行消息分发【假设要分发的是消息A】,但假如在for循环的过程中,接收到消息分发的对象又需要注册【消息A】的监听,就会改变了self.listeners_[eventName]这个table,导致for循环出问题,有可能之前分发过消息的对象又重复分发消息。

我也不确定这算不算bug【其实我觉得算……】。 也可以说使用者既然接收到这条消息就应该放在下一帧去注册同类消息,这么说就不算bug了。
但我觉得假设使用者调用了其他人的接口而不知道其他人的接口会注册这消息,这就难控制了,所以不应该交给使用者来控制………………

所以,我感觉在for循环之前简单的clone一下这个table就可以解决问题了。

还要考虑在事件处理函数中删除同类事件监听导致table变化的问题