Fixed some references leaks in sys.

This commit is contained in:
Christian Heimes 2008-01-30 17:21:22 +00:00
parent 67ac0667f0
commit 0d9244332b
3 changed files with 19 additions and 22 deletions

View File

@ -143,7 +143,6 @@ PyFloat_GetInfo(void)
return NULL; return NULL;
} }
Py_INCREF(floatinfo);
return floatinfo; return floatinfo;
} }

View File

@ -370,6 +370,8 @@ static char* sys_deletes[] = {
"exc_type", "exc_value", "exc_traceback", "exc_type", "exc_value", "exc_traceback",
"last_type", "last_value", "last_traceback", "last_type", "last_value", "last_traceback",
"path_hooks", "path_importer_cache", "meta_path", "path_hooks", "path_importer_cache", "meta_path",
/* misc stuff */
"flags", "float_info",
NULL NULL
}; };

View File

@ -1181,7 +1181,6 @@ make_flags(void)
return NULL; return NULL;
} }
Py_INCREF(seq);
return seq; return seq;
} }
@ -1199,6 +1198,11 @@ _PySys_Init(void)
if (m == NULL) if (m == NULL)
return NULL; return NULL;
sysdict = PyModule_GetDict(m); 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) */ /* XXX: does this work on Win/Win64? (see posix_fstat) */
@ -1258,19 +1262,17 @@ _PySys_Init(void)
Py_XDECREF(sysin); Py_XDECREF(sysin);
Py_XDECREF(sysout); Py_XDECREF(sysout);
Py_XDECREF(syserr); Py_XDECREF(syserr);
PyDict_SetItemString(sysdict, "version",
v = PyString_FromString(Py_GetVersion())); SET_SYS_FROM_STRING("version",
Py_XDECREF(v); PyString_FromString(Py_GetVersion()));
PyDict_SetItemString(sysdict, "hexversion", SET_SYS_FROM_STRING("hexversion",
v = PyInt_FromLong(PY_VERSION_HEX)); PyInt_FromLong(PY_VERSION_HEX));
Py_XDECREF(v);
svnversion_init(); svnversion_init();
v = Py_BuildValue("(ssz)", "CPython", branch, svn_revision); SET_SYS_FROM_STRING("subversion",
PyDict_SetItemString(sysdict, "subversion", v); Py_BuildValue("(ssz)", "CPython", branch,
Py_XDECREF(v); svn_revision));
PyDict_SetItemString(sysdict, "dont_write_bytecode", SET_SYS_FROM_STRING("dont_write_bytecode",
v = PyBool_FromLong(Py_DontWriteBytecodeFlag)); PyBool_FromLong(Py_DontWriteBytecodeFlag));
Py_XDECREF(v);
/* /*
* These release level checks are mutually exclusive and cover * These release level checks are mutually exclusive and cover
* the field, so don't get too fancy with the pre-processor! * the field, so don't get too fancy with the pre-processor!
@ -1285,12 +1287,6 @@ _PySys_Init(void)
s = "final"; s = "final";
#endif #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", SET_SYS_FROM_STRING("version_info",
Py_BuildValue("iiisi", PY_MAJOR_VERSION, Py_BuildValue("iiisi", PY_MAJOR_VERSION,
PY_MINOR_VERSION, PY_MINOR_VERSION,
@ -1340,7 +1336,6 @@ _PySys_Init(void)
SET_SYS_FROM_STRING("winver", SET_SYS_FROM_STRING("winver",
PyString_FromString(PyWin_DLLVersionString)); PyString_FromString(PyWin_DLLVersionString));
#endif #endif
#undef SET_SYS_FROM_STRING
if (warnoptions == NULL) { if (warnoptions == NULL) {
warnoptions = PyList_New(0); warnoptions = PyList_New(0);
} }
@ -1352,11 +1347,12 @@ _PySys_Init(void)
} }
PyStructSequence_InitType(&FlagsType, &flags_desc); PyStructSequence_InitType(&FlagsType, &flags_desc);
PyDict_SetItemString(sysdict, "flags", make_flags()); SET_SYS_FROM_STRING("flags", make_flags());
/* prevent user from creating new instances */ /* prevent user from creating new instances */
FlagsType.tp_init = NULL; FlagsType.tp_init = NULL;
FlagsType.tp_new = NULL; FlagsType.tp_new = NULL;
#undef SET_SYS_FROM_STRING
if (PyErr_Occurred()) if (PyErr_Occurred())
return NULL; return NULL;
return m; return m;