From a0f23d0986f3af9d66367c617677f8a275b72737 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Thu, 23 Nov 2006 14:09:12 +0000 Subject: [PATCH 1/1] fix python refcounting (memleaks) --- lib/gdi/picload.cpp | 66 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/lib/gdi/picload.cpp b/lib/gdi/picload.cpp index 28a8991..d724bfc 100644 --- a/lib/gdi/picload.cpp +++ b/lib/gdi/picload.cpp @@ -335,54 +335,62 @@ static int png_load(const char *filename, int *x, int *y) PyObject *getExif(const char *filename) { - PyObject *list = PyList_New(0); + PyObject *list = 0; Cexif *m_exif = new Cexif(); if(m_exif->DecodeExif(filename)) { - if(m_exif->m_exifinfo->IsExif) { + int pos=0; char tmp[256]; - PyList_Append(list, PyString_FromString(m_exif->m_exifinfo->Version)); - PyList_Append(list, PyString_FromString(m_exif->m_exifinfo->CameraMake)); - PyList_Append(list, PyString_FromString(m_exif->m_exifinfo->CameraModel)); - PyList_Append(list, PyString_FromString(m_exif->m_exifinfo->DateTime)); - PyList_Append(list, PyString_FromString(m_exif->m_exifinfo->Comments)); - PyList_Append(list, PyString_FromFormat("%d x %d", m_exif->m_exifinfo->Width, m_exif->m_exifinfo->Height)); - PyList_Append(list, PyString_FromString(m_exif->m_exifinfo->Orientation)); - PyList_Append(list, PyString_FromString(m_exif->m_exifinfo->MeteringMode)); - PyList_Append(list, PyString_FromString(m_exif->m_exifinfo->ExposureProgram)); - PyList_Append(list, PyString_FromString(m_exif->m_exifinfo->LightSource)); - PyList_Append(list, PyString_FromString(m_exif->m_exifinfo->FlashUsed)); - PyList_Append(list, PyString_FromFormat("%d", m_exif->m_exifinfo->CompressionLevel)); - PyList_Append(list, PyString_FromFormat("%d", m_exif->m_exifinfo->ISOequivalent)); + list = PyList_New(22); + PyList_SET_ITEM(list, pos++, PyString_FromString(m_exif->m_exifinfo->Version)); + PyList_SET_ITEM(list, pos++, PyString_FromString(m_exif->m_exifinfo->CameraMake)); + PyList_SET_ITEM(list, pos++, PyString_FromString(m_exif->m_exifinfo->CameraModel)); + PyList_SET_ITEM(list, pos++, PyString_FromString(m_exif->m_exifinfo->DateTime)); + PyList_SET_ITEM(list, pos++, PyString_FromString(m_exif->m_exifinfo->Comments)); + PyList_SET_ITEM(list, pos++, PyString_FromFormat("%d x %d", m_exif->m_exifinfo->Width, m_exif->m_exifinfo->Height)); + PyList_SET_ITEM(list, pos++, PyString_FromString(m_exif->m_exifinfo->Orientation)); + PyList_SET_ITEM(list, pos++, PyString_FromString(m_exif->m_exifinfo->MeteringMode)); + PyList_SET_ITEM(list, pos++, PyString_FromString(m_exif->m_exifinfo->ExposureProgram)); + PyList_SET_ITEM(list, pos++, PyString_FromString(m_exif->m_exifinfo->LightSource)); + PyList_SET_ITEM(list, pos++, PyString_FromString(m_exif->m_exifinfo->FlashUsed)); + PyList_SET_ITEM(list, pos++, PyString_FromFormat("%d", m_exif->m_exifinfo->CompressionLevel)); + PyList_SET_ITEM(list, pos++, PyString_FromFormat("%d", m_exif->m_exifinfo->ISOequivalent)); sprintf(tmp, "%.2f", m_exif->m_exifinfo->Xresolution); - PyList_Append(list, PyString_FromString(tmp)); + PyList_SET_ITEM(list, pos++, PyString_FromString(tmp)); sprintf(tmp, "%.2f", m_exif->m_exifinfo->Yresolution); - PyList_Append(list, PyString_FromString(tmp)); - PyList_Append(list, PyString_FromString(m_exif->m_exifinfo->ResolutionUnit)); + PyList_SET_ITEM(list, pos++, PyString_FromString(tmp)); + PyList_SET_ITEM(list, pos++, PyString_FromString(m_exif->m_exifinfo->ResolutionUnit)); sprintf(tmp, "%.2f", m_exif->m_exifinfo->Brightness); - PyList_Append(list, PyString_FromString(tmp)); + PyList_SET_ITEM(list, pos++, PyString_FromString(tmp)); sprintf(tmp, "%.5f sec.", m_exif->m_exifinfo->ExposureTime); - PyList_Append(list, PyString_FromString(tmp)); + PyList_SET_ITEM(list, pos++, PyString_FromString(tmp)); sprintf(tmp, "%.5f", m_exif->m_exifinfo->ExposureBias); - PyList_Append(list, PyString_FromString(tmp)); + PyList_SET_ITEM(list, pos++, PyString_FromString(tmp)); sprintf(tmp, "%.5f", m_exif->m_exifinfo->Distance); - PyList_Append(list, PyString_FromString(tmp)); + PyList_SET_ITEM(list, pos++, PyString_FromString(tmp)); sprintf(tmp, "%.5f", m_exif->m_exifinfo->CCDWidth); - PyList_Append(list, PyString_FromString(tmp)); + PyList_SET_ITEM(list, pos++, PyString_FromString(tmp)); sprintf(tmp, "%.2f", m_exif->m_exifinfo->ApertureFNumber); - PyList_Append(list, PyString_FromString(tmp)); + PyList_SET_ITEM(list, pos++, PyString_FromString(tmp)); + } + else + { + list = PyList_New(1); + PyList_SET_ITEM(list, 0, PyString_FromString(m_exif->m_szLastError)); } - else PyList_Append(list, PyString_FromString(m_exif->m_szLastError)); - m_exif->ClearExif(); } - else PyList_Append(list, PyString_FromString(m_exif->m_szLastError)); + else + { + list = PyList_New(1); + PyList_SET_ITEM(list, 0, PyString_FromString(m_exif->m_szLastError)); + } delete m_exif; - - return list; + + return list ? list : PyList_New(0); } //--------------------------------------------------------------------------------------------- -- 2.7.4