[cpp] Copy EventQueueEntry instead of taking pointer to reallocatable instance. Closes #1827.

This commit is contained in:
Mario Zechner 2021-06-14 14:55:45 +02:00
parent 3af35555a9
commit 6d384cd75c

View File

@ -265,23 +265,23 @@ void EventQueue::drain() {
// Don't cache _eventQueueEntries.size() so callbacks can queue their own events (eg, call setAnimation in AnimationState_Complete).
for (size_t i = 0; i < _eventQueueEntries.size(); ++i) {
EventQueueEntry *queueEntry = &_eventQueueEntries[i];
TrackEntry *trackEntry = queueEntry->_entry;
EventQueueEntry queueEntry = _eventQueueEntries[i];
TrackEntry *trackEntry = queueEntry._entry;
switch (queueEntry->_type) {
switch (queueEntry._type) {
case EventType_Start:
case EventType_Interrupt:
case EventType_Complete:
if (!trackEntry->_listenerObject) trackEntry->_listener(&state, queueEntry->_type, trackEntry, NULL);
else trackEntry->_listenerObject->callback(&state, queueEntry->_type, trackEntry, NULL);
if (!state._listenerObject) state._listener(&state, queueEntry->_type, trackEntry, NULL);
else state._listenerObject->callback(&state, queueEntry->_type, trackEntry, NULL);
if (!trackEntry->_listenerObject) trackEntry->_listener(&state, queueEntry._type, trackEntry, NULL);
else trackEntry->_listenerObject->callback(&state, queueEntry._type, trackEntry, NULL);
if (!state._listenerObject) state._listener(&state, queueEntry._type, trackEntry, NULL);
else state._listenerObject->callback(&state, queueEntry._type, trackEntry, NULL);
break;
case EventType_End:
if (!trackEntry->_listenerObject) trackEntry->_listener(&state, queueEntry->_type, trackEntry, NULL);
else trackEntry->_listenerObject->callback(&state, queueEntry->_type, trackEntry, NULL);
if (!state._listenerObject) state._listener(&state, queueEntry->_type, trackEntry, NULL);
else state._listenerObject->callback(&state, queueEntry->_type, trackEntry, NULL);
if (!trackEntry->_listenerObject) trackEntry->_listener(&state, queueEntry._type, trackEntry, NULL);
else trackEntry->_listenerObject->callback(&state, queueEntry._type, trackEntry, NULL);
if (!state._listenerObject) state._listener(&state, queueEntry._type, trackEntry, NULL);
else state._listenerObject->callback(&state, queueEntry._type, trackEntry, NULL);
/* Fall through. */
case EventType_Dispose:
if (!trackEntry->_listenerObject) trackEntry->_listener(&state, EventType_Dispose, trackEntry, NULL);
@ -294,10 +294,10 @@ void EventQueue::drain() {
break;
case EventType_Event:
if (!trackEntry->_listenerObject)
trackEntry->_listener(&state, queueEntry->_type, trackEntry, queueEntry->_event);
else trackEntry->_listenerObject->callback(&state, queueEntry->_type, trackEntry, queueEntry->_event);
if (!state._listenerObject) state._listener(&state, queueEntry->_type, trackEntry, queueEntry->_event);
else state._listenerObject->callback(&state, queueEntry->_type, trackEntry, queueEntry->_event);
trackEntry->_listener(&state, queueEntry._type, trackEntry, queueEntry._event);
else trackEntry->_listenerObject->callback(&state, queueEntry._type, trackEntry, queueEntry._event);
if (!state._listenerObject) state._listener(&state, queueEntry._type, trackEntry, queueEntry._event);
else state._listenerObject->callback(&state, queueEntry._type, trackEntry, queueEntry._event);
break;
}
}