diff options
author | Campbell Barton <ideasman42@gmail.com> | 2016-07-14 10:28:28 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2016-07-14 10:30:52 +0300 |
commit | f5e020a7a6ad6451fcaf075ae14f7014b8a4faea (patch) | |
tree | fabaa955b5da459f4a254f4b5d8c912e55f8e627 /source/gameengine/GameLogic/SCA_PythonKeyboard.cpp | |
parent | cca57bf04c9b84da742743343077db9b3f6f7025 (diff) |
PyAPI: fix memory leaks in dictionary assignment
Thanks to Kévin Dietrich for spotting driver leak,
checked other uses of PyDict_SetItem and found more.
Diffstat (limited to 'source/gameengine/GameLogic/SCA_PythonKeyboard.cpp')
-rw-r--r-- | source/gameengine/GameLogic/SCA_PythonKeyboard.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp b/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp index 19aae46f2a3..9a96a7b0334 100644 --- a/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp +++ b/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp @@ -113,11 +113,15 @@ PyObject *SCA_PythonKeyboard::pyattr_get_events(void *self_v, const KX_PYATTRIBU { SCA_PythonKeyboard* self = static_cast<SCA_PythonKeyboard*>(self_v); - for (int i=SCA_IInputDevice::KX_BEGINKEY; i<=SCA_IInputDevice::KX_ENDKEY; i++) - { + for (int i = SCA_IInputDevice::KX_BEGINKEY; i <= SCA_IInputDevice::KX_ENDKEY; i++) { const SCA_InputEvent & inevent = self->m_keyboard->GetEventValue((SCA_IInputDevice::KX_EnumInputs)i); - - PyDict_SetItem(self->m_event_dict, PyLong_FromLong(i), PyLong_FromLong(inevent.m_status)); + PyObject *key = PyLong_FromLong(i); + PyObject *value = PyLong_FromLong(inevent.m_status); + + PyDict_SetItem(self->m_event_dict, key, value); + + Py_DECREF(key); + Py_DECREF(value); } Py_INCREF(self->m_event_dict); return self->m_event_dict; @@ -129,12 +133,18 @@ PyObject *SCA_PythonKeyboard::pyattr_get_active_events(void *self_v, const KX_PY PyDict_Clear(self->m_event_dict); - for (int i=SCA_IInputDevice::KX_BEGINKEY; i<=SCA_IInputDevice::KX_ENDKEY; i++) - { + for (int i = SCA_IInputDevice::KX_BEGINKEY; i <= SCA_IInputDevice::KX_ENDKEY; i++) { const SCA_InputEvent & inevent = self->m_keyboard->GetEventValue((SCA_IInputDevice::KX_EnumInputs)i); - if (inevent.m_status != SCA_InputEvent::KX_NO_INPUTSTATUS) - PyDict_SetItem(self->m_event_dict, PyLong_FromLong(i), PyLong_FromLong(inevent.m_status)); + if (inevent.m_status != SCA_InputEvent::KX_NO_INPUTSTATUS) { + PyObject *key = PyLong_FromLong(i); + PyObject *value = PyLong_FromLong(inevent.m_status); + + PyDict_SetItem(self->m_event_dict, key, value); + + Py_DECREF(key); + Py_DECREF(value); + } } Py_INCREF(self->m_event_dict); return self->m_event_dict; |