Commit 21809a69 authored by Victor Stinner's avatar Victor Stinner

(Merge 3.2) Issue #12124: zipimport doesn't keep a reference to

zlib.decompress() anymore to be able to unload the module.
parents f966803c 4445ec81
...@@ -19,11 +19,6 @@ import io ...@@ -19,11 +19,6 @@ import io
from traceback import extract_tb, extract_stack, print_tb from traceback import extract_tb, extract_stack, print_tb
raise_src = 'def do_raise(): raise TypeError\n' raise_src = 'def do_raise(): raise TypeError\n'
# so we only run testAFakeZlib once if this test is run repeatedly
# which happens when we look for ref leaks
test_imported = False
def make_pyc(co, mtime): def make_pyc(co, mtime):
data = marshal.dumps(co) data = marshal.dumps(co)
if type(mtime) is type(0.0): if type(mtime) is type(0.0):
...@@ -467,19 +462,7 @@ class BadFileZipImportTestCase(unittest.TestCase): ...@@ -467,19 +462,7 @@ class BadFileZipImportTestCase(unittest.TestCase):
zipimport._zip_directory_cache.clear() zipimport._zip_directory_cache.clear()
def cleanup():
# this is necessary if test is run repeated (like when finding leaks)
global test_imported
if test_imported:
zipimport._zip_directory_cache.clear()
if hasattr(UncompressedZipImportTestCase, 'testAFakeZlib'):
delattr(UncompressedZipImportTestCase, 'testAFakeZlib')
if hasattr(CompressedZipImportTestCase, 'testAFakeZlib'):
delattr(CompressedZipImportTestCase, 'testAFakeZlib')
test_imported = True
def test_main(): def test_main():
cleanup()
try: try:
support.run_unittest( support.run_unittest(
UncompressedZipImportTestCase, UncompressedZipImportTestCase,
......
...@@ -153,6 +153,9 @@ Core and Builtins ...@@ -153,6 +153,9 @@ Core and Builtins
Library Library
------- -------
- Issue #12124: zipimport doesn't keep a reference to zlib.decompress() anymore
to be able to unload the module.
- Issue #12120, #12119: skip a test in packaging and distutils - Issue #12120, #12119: skip a test in packaging and distutils
if sys.dont_write_bytecode is set to True. if sys.dont_write_bytecode is set to True.
......
...@@ -867,16 +867,13 @@ error: ...@@ -867,16 +867,13 @@ error:
/* Return the zlib.decompress function object, or NULL if zlib couldn't /* Return the zlib.decompress function object, or NULL if zlib couldn't
be imported. The function is cached when found, so subsequent calls be imported. The function is cached when found, so subsequent calls
don't import zlib again. Returns a *borrowed* reference. don't import zlib again. */
XXX This makes zlib.decompress immortal. */
static PyObject * static PyObject *
get_decompress_func(void) get_decompress_func(void)
{ {
static PyObject *decompress = NULL;
if (decompress == NULL) {
PyObject *zlib;
static int importing_zlib = 0; static int importing_zlib = 0;
PyObject *zlib;
PyObject *decompress;
if (importing_zlib != 0) if (importing_zlib != 0)
/* Someone has a zlib.py[co] in their Zip file; /* Someone has a zlib.py[co] in their Zip file;
...@@ -890,12 +887,13 @@ get_decompress_func(void) ...@@ -890,12 +887,13 @@ get_decompress_func(void)
"decompress"); "decompress");
Py_DECREF(zlib); Py_DECREF(zlib);
} }
else else {
PyErr_Clear(); PyErr_Clear();
decompress = NULL;
}
if (Py_VerboseFlag) if (Py_VerboseFlag)
PySys_WriteStderr("# zipimport: zlib %s\n", PySys_WriteStderr("# zipimport: zlib %s\n",
zlib != NULL ? "available": "UNAVAILABLE"); zlib != NULL ? "available": "UNAVAILABLE");
}
return decompress; return decompress;
} }
...@@ -986,6 +984,7 @@ get_data(PyObject *archive, PyObject *toc_entry) ...@@ -986,6 +984,7 @@ get_data(PyObject *archive, PyObject *toc_entry)
goto error; goto error;
} }
data = PyObject_CallFunction(decompress, "Oi", raw_data, -15); data = PyObject_CallFunction(decompress, "Oi", raw_data, -15);
Py_DECREF(decompress);
error: error:
Py_DECREF(raw_data); Py_DECREF(raw_data);
return data; return data;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment