diff options
author | Eric Snow <ericsnowcurrently@gmail.com> | 2017-09-14 07:35:58 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-14 07:35:58 (GMT) |
commit | dae0276bb6bc7281d59fb0b8f1aab31634ee80dc (patch) | |
tree | d36e7b49ee6ef1cdb2a2384be568c8d28a7b0bb0 /Python | |
parent | 93c92f7d1dbb6e7e472f1d0444c6968858113de2 (diff) | |
download | cpython-dae0276bb6bc7281d59fb0b8f1aab31634ee80dc.zip cpython-dae0276bb6bc7281d59fb0b8f1aab31634ee80dc.tar.gz cpython-dae0276bb6bc7281d59fb0b8f1aab31634ee80dc.tar.bz2 |
bpo-30860: Fix a refleak. (#3567)
Resolves bpo-31420.
(This was accidentally reverted when in #3565.)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/pylifecycle.c | 10 | ||||
-rw-r--r-- | Python/pystate.c | 2 | ||||
-rw-r--r-- | Python/pythonrun.c | 5 | ||||
-rw-r--r-- | Python/sysmodule.c | 41 |
4 files changed, 31 insertions, 27 deletions
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 0700569..2aac901 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1011,6 +1011,11 @@ Py_FinalizeEx(void) while (_PyGC_CollectIfEnabled() > 0) /* nothing */; #endif + +#ifdef Py_REF_DEBUG + PyObject *showrefcount = _PyDebug_XOptionShowRefCount(); +#endif + /* Destroy all modules */ PyImport_Cleanup(); @@ -1058,7 +1063,10 @@ Py_FinalizeEx(void) /* dump hash stats */ _PyHash_Fini(); - _PY_DEBUG_PRINT_TOTAL_REFS(); +#ifdef Py_REF_DEBUG + if (showrefcount == Py_True) + _PyDebug_PrintTotalRefs(); +#endif #ifdef Py_TRACE_REFS /* Display all objects still alive -- this can invoke arbitrary diff --git a/Python/pystate.c b/Python/pystate.c index 41adf03..53c1236 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -97,8 +97,6 @@ PyInterpreterState_New(void) interp->builtins_copy = NULL; interp->tstate_head = NULL; interp->check_interval = 100; - interp->warnoptions = NULL; - interp->xoptions = NULL; interp->num_threads = 0; interp->pythread_stacksize = 0; interp->codec_search_path = NULL; diff --git a/Python/pythonrun.c b/Python/pythonrun.c index d1d4a69..df814fb 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -113,7 +113,10 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags * err = -1; for (;;) { ret = PyRun_InteractiveOneObject(fp, filename, flags); - _PY_DEBUG_PRINT_TOTAL_REFS(); +#ifdef Py_REF_DEBUG + if (_PyDebug_XOptionShowRefCount() == Py_True) + _PyDebug_PrintTotalRefs(); +#endif if (ret == E_EOF) { err = 0; break; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index dd127a1..9e13d49 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -36,12 +36,14 @@ extern const char *PyWin_DLLVersionString; _Py_IDENTIFIER(_); _Py_IDENTIFIER(__sizeof__); +_Py_IDENTIFIER(_xoptions); _Py_IDENTIFIER(buffer); _Py_IDENTIFIER(builtins); _Py_IDENTIFIER(encoding); _Py_IDENTIFIER(path); _Py_IDENTIFIER(stdout); _Py_IDENTIFIER(stderr); +_Py_IDENTIFIER(warnoptions); _Py_IDENTIFIER(write); PyObject * @@ -1481,13 +1483,17 @@ list_builtin_module_names(void) static PyObject * get_warnoptions(void) { - PyObject *warnoptions = PyThreadState_GET()->interp->warnoptions; + PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions); if (warnoptions == NULL || !PyList_Check(warnoptions)) { Py_XDECREF(warnoptions); warnoptions = PyList_New(0); if (warnoptions == NULL) return NULL; - PyThreadState_GET()->interp->warnoptions = warnoptions; + if (_PySys_SetObjectId(&PyId_warnoptions, warnoptions)) { + Py_DECREF(warnoptions); + return NULL; + } + Py_DECREF(warnoptions); } return warnoptions; } @@ -1495,7 +1501,7 @@ get_warnoptions(void) void PySys_ResetWarnOptions(void) { - PyObject *warnoptions = PyThreadState_GET()->interp->warnoptions; + PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions); if (warnoptions == NULL || !PyList_Check(warnoptions)) return; PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL); @@ -1524,20 +1530,24 @@ PySys_AddWarnOption(const wchar_t *s) int PySys_HasWarnOptions(void) { - PyObject *warnoptions = PyThreadState_GET()->interp->warnoptions; + PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions); return (warnoptions != NULL && (PyList_Size(warnoptions) > 0)) ? 1 : 0; } static PyObject * get_xoptions(void) { - PyObject *xoptions = PyThreadState_GET()->interp->xoptions; + PyObject *xoptions = _PySys_GetObjectId(&PyId__xoptions); if (xoptions == NULL || !PyDict_Check(xoptions)) { Py_XDECREF(xoptions); xoptions = PyDict_New(); if (xoptions == NULL) return NULL; - PyThreadState_GET()->interp->xoptions = xoptions; + if (_PySys_SetObjectId(&PyId__xoptions, xoptions)) { + Py_DECREF(xoptions); + return NULL; + } + Py_DECREF(xoptions); } return xoptions; } @@ -2086,16 +2096,6 @@ _PySys_BeginInit(void) #undef SET_SYS_FROM_STRING_BORROW /* Updating the sys namespace, returning integer error codes */ -#define SET_SYS_FROM_STRING_BORROW_INT_RESULT(key, value) \ - do { \ - PyObject *v = (value); \ - if (v == NULL) \ - return -1; \ - res = PyDict_SetItemString(sysdict, key, v); \ - if (res < 0) { \ - return res; \ - } \ - } while (0) #define SET_SYS_FROM_STRING_INT_RESULT(key, value) \ do { \ PyObject *v = (value); \ @@ -2140,15 +2140,11 @@ _PySys_EndInit(PyObject *sysdict) SET_SYS_FROM_STRING_INT_RESULT("base_exec_prefix", PyUnicode_FromWideChar(Py_GetExecPrefix(), -1)); - PyObject *warnoptions = get_warnoptions(); - if (warnoptions == NULL) + if (get_warnoptions() == NULL) return -1; - SET_SYS_FROM_STRING_BORROW_INT_RESULT("warnoptions", warnoptions); - PyObject *xoptions = get_xoptions(); - if (xoptions == NULL) + if (get_xoptions() == NULL) return -1; - SET_SYS_FROM_STRING_BORROW_INT_RESULT("_xoptions", xoptions); if (PyErr_Occurred()) return -1; @@ -2156,7 +2152,6 @@ _PySys_EndInit(PyObject *sysdict) } #undef SET_SYS_FROM_STRING_INT_RESULT -#undef SET_SYS_FROM_STRING_BORROW_INT_RESULT static PyObject * makepathobject(const wchar_t *path, wchar_t delim) |