From 0d9244332b4c9dad8722f7ed651fb922de93afe6 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Wed, 30 Jan 2008 17:21:22 +0000 Subject: Fixed some references leaks in sys. --- Objects/floatobject.c | 1 - Python/import.c | 2 ++ Python/sysmodule.c | 38 +++++++++++++++++--------------------- 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 3d70e3a..689edcd 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -143,7 +143,6 @@ PyFloat_GetInfo(void) return NULL; } - Py_INCREF(floatinfo); return floatinfo; } diff --git a/Python/import.c b/Python/import.c index 71ec20a..0b0d810 100644 --- a/Python/import.c +++ b/Python/import.c @@ -370,6 +370,8 @@ static char* sys_deletes[] = { "exc_type", "exc_value", "exc_traceback", "last_type", "last_value", "last_traceback", "path_hooks", "path_importer_cache", "meta_path", + /* misc stuff */ + "flags", "float_info", NULL }; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index f9fb815..80d24d1 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1181,7 +1181,6 @@ make_flags(void) return NULL; } - Py_INCREF(seq); return seq; } @@ -1199,6 +1198,11 @@ _PySys_Init(void) if (m == NULL) return NULL; sysdict = PyModule_GetDict(m); +#define SET_SYS_FROM_STRING(key, value) \ + v = value; \ + if (v != NULL) \ + PyDict_SetItemString(sysdict, key, v); \ + Py_XDECREF(v) { /* XXX: does this work on Win/Win64? (see posix_fstat) */ @@ -1258,19 +1262,17 @@ _PySys_Init(void) Py_XDECREF(sysin); Py_XDECREF(sysout); Py_XDECREF(syserr); - PyDict_SetItemString(sysdict, "version", - v = PyString_FromString(Py_GetVersion())); - Py_XDECREF(v); - PyDict_SetItemString(sysdict, "hexversion", - v = PyInt_FromLong(PY_VERSION_HEX)); - Py_XDECREF(v); + + SET_SYS_FROM_STRING("version", + PyString_FromString(Py_GetVersion())); + SET_SYS_FROM_STRING("hexversion", + PyInt_FromLong(PY_VERSION_HEX)); svnversion_init(); - v = Py_BuildValue("(ssz)", "CPython", branch, svn_revision); - PyDict_SetItemString(sysdict, "subversion", v); - Py_XDECREF(v); - PyDict_SetItemString(sysdict, "dont_write_bytecode", - v = PyBool_FromLong(Py_DontWriteBytecodeFlag)); - Py_XDECREF(v); + SET_SYS_FROM_STRING("subversion", + Py_BuildValue("(ssz)", "CPython", branch, + svn_revision)); + SET_SYS_FROM_STRING("dont_write_bytecode", + PyBool_FromLong(Py_DontWriteBytecodeFlag)); /* * These release level checks are mutually exclusive and cover * the field, so don't get too fancy with the pre-processor! @@ -1285,12 +1287,6 @@ _PySys_Init(void) s = "final"; #endif -#define SET_SYS_FROM_STRING(key, value) \ - v = value; \ - if (v != NULL) \ - PyDict_SetItemString(sysdict, key, v); \ - Py_XDECREF(v) - SET_SYS_FROM_STRING("version_info", Py_BuildValue("iiisi", PY_MAJOR_VERSION, PY_MINOR_VERSION, @@ -1340,7 +1336,6 @@ _PySys_Init(void) SET_SYS_FROM_STRING("winver", PyString_FromString(PyWin_DLLVersionString)); #endif -#undef SET_SYS_FROM_STRING if (warnoptions == NULL) { warnoptions = PyList_New(0); } @@ -1352,11 +1347,12 @@ _PySys_Init(void) } PyStructSequence_InitType(&FlagsType, &flags_desc); - PyDict_SetItemString(sysdict, "flags", make_flags()); + SET_SYS_FROM_STRING("flags", make_flags()); /* prevent user from creating new instances */ FlagsType.tp_init = NULL; FlagsType.tp_new = NULL; +#undef SET_SYS_FROM_STRING if (PyErr_Occurred()) return NULL; return m; -- cgit v0.12