Skip to content

Commit e7fa309

Browse files
authored
Merge pull request #7003 from radarhere/reference_count
Decrement reference count
2 parents 7700840 + 9ef65b0 commit e7fa309

File tree

5 files changed

+85
-58
lines changed

5 files changed

+85
-58
lines changed

src/_imaging.c

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3810,6 +3810,7 @@ static PyTypeObject PixelAccess_Type = {
38103810
static PyObject *
38113811
_get_stats(PyObject *self, PyObject *args) {
38123812
PyObject *d;
3813+
PyObject *v;
38133814
ImagingMemoryArena arena = &ImagingDefaultArena;
38143815

38153816
if (!PyArg_ParseTuple(args, ":get_stats")) {
@@ -3820,15 +3821,29 @@ _get_stats(PyObject *self, PyObject *args) {
38203821
if (!d) {
38213822
return NULL;
38223823
}
3823-
PyDict_SetItemString(d, "new_count", PyLong_FromLong(arena->stats_new_count));
3824-
PyDict_SetItemString(
3825-
d, "allocated_blocks", PyLong_FromLong(arena->stats_allocated_blocks));
3826-
PyDict_SetItemString(
3827-
d, "reused_blocks", PyLong_FromLong(arena->stats_reused_blocks));
3828-
PyDict_SetItemString(
3829-
d, "reallocated_blocks", PyLong_FromLong(arena->stats_reallocated_blocks));
3830-
PyDict_SetItemString(d, "freed_blocks", PyLong_FromLong(arena->stats_freed_blocks));
3831-
PyDict_SetItemString(d, "blocks_cached", PyLong_FromLong(arena->blocks_cached));
3824+
v = PyLong_FromLong(arena->stats_new_count);
3825+
PyDict_SetItemString(d, "new_count", v ? v : Py_None);
3826+
Py_XDECREF(v);
3827+
3828+
v = PyLong_FromLong(arena->stats_allocated_blocks);
3829+
PyDict_SetItemString(d, "allocated_blocks", v ? v : Py_None);
3830+
Py_XDECREF(v);
3831+
3832+
v = PyLong_FromLong(arena->stats_reused_blocks);
3833+
PyDict_SetItemString(d, "reused_blocks", v ? v : Py_None);
3834+
Py_XDECREF(v);
3835+
3836+
v = PyLong_FromLong(arena->stats_reallocated_blocks);
3837+
PyDict_SetItemString(d, "reallocated_blocks", v ? v : Py_None);
3838+
Py_XDECREF(v);
3839+
3840+
v = PyLong_FromLong(arena->stats_freed_blocks);
3841+
PyDict_SetItemString(d, "freed_blocks", v ? v : Py_None);
3842+
Py_XDECREF(v);
3843+
3844+
v = PyLong_FromLong(arena->blocks_cached);
3845+
PyDict_SetItemString(d, "blocks_cached", v ? v : Py_None);
3846+
Py_XDECREF(v);
38323847
return d;
38333848
}
38343849

@@ -4197,28 +4212,33 @@ setup_module(PyObject *m) {
41974212
#ifdef HAVE_LIBJPEG
41984213
{
41994214
extern const char *ImagingJpegVersion(void);
4200-
PyDict_SetItemString(
4201-
d, "jpeglib_version", PyUnicode_FromString(ImagingJpegVersion()));
4215+
PyObject *v = PyUnicode_FromString(ImagingJpegVersion());
4216+
PyDict_SetItemString(d, "jpeglib_version", v ? v : Py_None);
4217+
Py_XDECREF(v);
42024218
}
42034219
#endif
42044220

42054221
#ifdef HAVE_OPENJPEG
42064222
{
42074223
extern const char *ImagingJpeg2KVersion(void);
4208-
PyDict_SetItemString(
4209-
d, "jp2klib_version", PyUnicode_FromString(ImagingJpeg2KVersion()));
4224+
PyObject *v = PyUnicode_FromString(ImagingJpeg2KVersion());
4225+
PyDict_SetItemString(d, "jp2klib_version", v ? v : Py_None);
4226+
Py_XDECREF(v);
42104227
}
42114228
#endif
42124229

42134230
PyObject *have_libjpegturbo;
42144231
#ifdef LIBJPEG_TURBO_VERSION
42154232
have_libjpegturbo = Py_True;
4233+
{
42164234
#define tostr1(a) #a
42174235
#define tostr(a) tostr1(a)
4218-
PyDict_SetItemString(
4219-
d, "libjpeg_turbo_version", PyUnicode_FromString(tostr(LIBJPEG_TURBO_VERSION)));
4236+
PyObject *v = PyUnicode_FromString(tostr(LIBJPEG_TURBO_VERSION));
4237+
PyDict_SetItemString(d, "libjpeg_turbo_version", v ? v : Py_None);
4238+
Py_XDECREF(v);
42204239
#undef tostr
42214240
#undef tostr1
4241+
}
42224242
#else
42234243
have_libjpegturbo = Py_False;
42244244
#endif
@@ -4230,8 +4250,9 @@ setup_module(PyObject *m) {
42304250
have_libimagequant = Py_True;
42314251
{
42324252
extern const char *ImagingImageQuantVersion(void);
4233-
PyDict_SetItemString(
4234-
d, "imagequant_version", PyUnicode_FromString(ImagingImageQuantVersion()));
4253+
PyObject *v = PyUnicode_FromString(ImagingImageQuantVersion());
4254+
PyDict_SetItemString(d, "imagequant_version", v ? v : Py_None);
4255+
Py_XDECREF(v);
42354256
}
42364257
#else
42374258
have_libimagequant = Py_False;
@@ -4248,16 +4269,18 @@ setup_module(PyObject *m) {
42484269
PyModule_AddIntConstant(m, "FIXED", Z_FIXED);
42494270
{
42504271
extern const char *ImagingZipVersion(void);
4251-
PyDict_SetItemString(
4252-
d, "zlib_version", PyUnicode_FromString(ImagingZipVersion()));
4272+
PyObject *v = PyUnicode_FromString(ImagingZipVersion());
4273+
PyDict_SetItemString(d, "zlib_version", v ? v : Py_None);
4274+
Py_XDECREF(v);
42534275
}
42544276
#endif
42554277

42564278
#ifdef HAVE_LIBTIFF
42574279
{
42584280
extern const char *ImagingTiffVersion(void);
4259-
PyDict_SetItemString(
4260-
d, "libtiff_version", PyUnicode_FromString(ImagingTiffVersion()));
4281+
PyObject *v = PyUnicode_FromString(ImagingTiffVersion());
4282+
PyDict_SetItemString(d, "libtiff_version", v ? v : Py_None);
4283+
Py_XDECREF(v);
42614284

42624285
// Test for libtiff 4.0 or later, excluding libtiff 3.9.6 and 3.9.7
42634286
PyObject *support_custom_tags;
@@ -4280,7 +4303,9 @@ setup_module(PyObject *m) {
42804303
Py_INCREF(have_xcb);
42814304
PyModule_AddObject(m, "HAVE_XCB", have_xcb);
42824305

4283-
PyDict_SetItemString(d, "PILLOW_VERSION", PyUnicode_FromString(version));
4306+
PyObject *pillow_version = PyUnicode_FromString(version);
4307+
PyDict_SetItemString(d, "PILLOW_VERSION", pillow_version ? pillow_version : Py_None);
4308+
Py_XDECREF(pillow_version);
42844309

42854310
return 0;
42864311
}

src/_imagingcms.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,8 @@ _is_intent_supported(CmsProfileObject *self, int clut) {
950950
return Py_None;
951951
}
952952
PyDict_SetItem(result, id, entry);
953+
Py_DECREF(id);
954+
Py_DECREF(entry);
953955
}
954956
return result;
955957
}
@@ -1531,7 +1533,8 @@ setup_module(PyObject *m) {
15311533
} else {
15321534
v = PyUnicode_FromFormat("%d.%d", vn / 1000, (vn / 10) % 100);
15331535
}
1534-
PyDict_SetItemString(d, "littlecms_version", v);
1536+
PyDict_SetItemString(d, "littlecms_version", v ? v : Py_None);
1537+
Py_XDECREF(v);
15351538

15361539
return 0;
15371540
}

src/_imagingft.c

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,11 +1129,17 @@ font_getvaraxes(FontObject *self) {
11291129
axis = master->axis[i];
11301130

11311131
list_axis = PyDict_New();
1132-
PyDict_SetItemString(
1133-
list_axis, "minimum", PyLong_FromLong(axis.minimum / 65536));
1134-
PyDict_SetItemString(list_axis, "default", PyLong_FromLong(axis.def / 65536));
1135-
PyDict_SetItemString(
1136-
list_axis, "maximum", PyLong_FromLong(axis.maximum / 65536));
1132+
PyObject *minimum = PyLong_FromLong(axis.minimum / 65536);
1133+
PyDict_SetItemString(list_axis, "minimum", minimum ? minimum : Py_None);
1134+
Py_XDECREF(minimum);
1135+
1136+
PyObject *def = PyLong_FromLong(axis.def / 65536);
1137+
PyDict_SetItemString(list_axis, "default", def ? def : Py_None);
1138+
Py_XDECREF(def);
1139+
1140+
PyObject *maximum = PyLong_FromLong(axis.maximum / 65536);
1141+
PyDict_SetItemString(list_axis, "maximum", maximum ? maximum : Py_None);
1142+
Py_XDECREF(maximum);
11371143

11381144
for (j = 0; j < name_count; j++) {
11391145
error = FT_Get_Sfnt_Name(self->face, j, &name);
@@ -1143,7 +1149,8 @@ font_getvaraxes(FontObject *self) {
11431149

11441150
if (name.name_id == axis.strid) {
11451151
axis_name = Py_BuildValue("y#", name.string, name.string_len);
1146-
PyDict_SetItemString(list_axis, "name", axis_name);
1152+
PyDict_SetItemString(list_axis, "name", axis_name ? axis_name : Py_None);
1153+
Py_XDECREF(axis_name);
11471154
break;
11481155
}
11491156
}
@@ -1358,7 +1365,8 @@ setup_module(PyObject *m) {
13581365
FT_Library_Version(library, &major, &minor, &patch);
13591366

13601367
v = PyUnicode_FromFormat("%d.%d.%d", major, minor, patch);
1361-
PyDict_SetItemString(d, "freetype2_version", v);
1368+
PyDict_SetItemString(d, "freetype2_version", v ? v : Py_None);
1369+
Py_XDECREF(v);
13621370

13631371
#ifdef HAVE_RAQM
13641372
#if defined(HAVE_RAQM_SYSTEM) || defined(HAVE_FRIBIDI_SYSTEM)
@@ -1376,35 +1384,34 @@ setup_module(PyObject *m) {
13761384
PyDict_SetItemString(d, "HAVE_RAQM", v);
13771385
PyDict_SetItemString(d, "HAVE_FRIBIDI", v);
13781386
PyDict_SetItemString(d, "HAVE_HARFBUZZ", v);
1387+
Py_DECREF(v);
13791388
if (have_raqm) {
1389+
v = NULL;
13801390
#ifdef RAQM_VERSION_MAJOR
13811391
v = PyUnicode_FromString(raqm_version_string());
1382-
#else
1383-
v = Py_None;
13841392
#endif
1385-
PyDict_SetItemString(d, "raqm_version", v);
1393+
PyDict_SetItemString(d, "raqm_version", v ? v : Py_None);
1394+
Py_XDECREF(v);
13861395

1396+
v = NULL;
13871397
#ifdef FRIBIDI_MAJOR_VERSION
13881398
{
13891399
const char *a = strchr(fribidi_version_info, ')');
13901400
const char *b = strchr(fribidi_version_info, '\n');
13911401
if (a && b && a + 2 < b) {
13921402
v = PyUnicode_FromStringAndSize(a + 2, b - (a + 2));
1393-
} else {
1394-
v = Py_None;
13951403
}
13961404
}
1397-
#else
1398-
v = Py_None;
13991405
#endif
1400-
PyDict_SetItemString(d, "fribidi_version", v);
1406+
PyDict_SetItemString(d, "fribidi_version", v ? v : Py_None);
1407+
Py_XDECREF(v);
14011408

1409+
v = NULL;
14021410
#ifdef HB_VERSION_STRING
14031411
v = PyUnicode_FromString(hb_version_string());
1404-
#else
1405-
v = Py_None;
14061412
#endif
1407-
PyDict_SetItemString(d, "harfbuzz_version", v);
1413+
PyDict_SetItemString(d, "harfbuzz_version", v ? v : Py_None);
1414+
Py_XDECREF(v);
14081415
}
14091416

14101417
return 0;

src/_imagingmorph.c

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ match(PyObject *self, PyObject *args) {
194194
if (lut[lut_idx]) {
195195
PyObject *coordObj = Py_BuildValue("(nn)", col_idx, row_idx);
196196
PyList_Append(ret, coordObj);
197+
Py_XDECREF(coordObj);
197198
}
198199
}
199200
}
@@ -230,21 +231,13 @@ get_on_pixels(PyObject *self, PyObject *args) {
230231
if (row[col_idx]) {
231232
PyObject *coordObj = Py_BuildValue("(nn)", col_idx, row_idx);
232233
PyList_Append(ret, coordObj);
234+
Py_XDECREF(coordObj);
233235
}
234236
}
235237
}
236238
return ret;
237239
}
238240

239-
static int
240-
setup_module(PyObject *m) {
241-
PyObject *d = PyModule_GetDict(m);
242-
243-
PyDict_SetItemString(d, "__version", PyUnicode_FromString("0.1"));
244-
245-
return 0;
246-
}
247-
248241
static PyMethodDef functions[] = {
249242
/* Functions */
250243
{"apply", (PyCFunction)apply, METH_VARARGS, NULL},
@@ -266,9 +259,5 @@ PyInit__imagingmorph(void) {
266259

267260
m = PyModule_Create(&module_def);
268261

269-
if (setup_module(m) < 0) {
270-
return NULL;
271-
}
272-
273262
return m;
274263
}

src/_webp.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -949,8 +949,10 @@ addAnimFlagToModule(PyObject *m) {
949949

950950
void
951951
addTransparencyFlagToModule(PyObject *m) {
952-
PyModule_AddObject(
953-
m, "HAVE_TRANSPARENCY", PyBool_FromLong(!WebPDecoderBuggyAlpha()));
952+
PyObject *have_transparency = PyBool_FromLong(!WebPDecoderBuggyAlpha());
953+
if (PyModule_AddObject(m, "HAVE_TRANSPARENCY", have_transparency)) {
954+
Py_DECREF(have_transparency);
955+
}
954956
}
955957

956958
static int
@@ -967,8 +969,9 @@ setup_module(PyObject *m) {
967969
addAnimFlagToModule(m);
968970
addTransparencyFlagToModule(m);
969971

970-
PyDict_SetItemString(
971-
d, "webpdecoder_version", PyUnicode_FromString(WebPDecoderVersion_str()));
972+
PyObject *v = PyUnicode_FromString(WebPDecoderVersion_str());
973+
PyDict_SetItemString(d, "webpdecoder_version", v ? v : Py_None);
974+
Py_XDECREF(v);
972975

973976
return 0;
974977
}

0 commit comments

Comments
 (0)