From 98ea8fae3227d6fa3ac63192b900d2e282518997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jurko=20Gospodneti=C4=87?= Date: Wed, 2 Apr 2014 15:34:36 +0200 Subject: [PATCH] break reference cycles caused by storing local reference to exception info Such reference cycles unnecessarily cause Python interpreter not to garbage collect the objects referenced in those cycles as soon they could be collected, and in turn cause the tests to use more memory than is strictly necessary. --HG-- branch : break_ExceptionInfo_reference_cycles --- _pytest/assertion/util.py | 3 +-- _pytest/main.py | 1 + _pytest/python.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_pytest/assertion/util.py b/_pytest/assertion/util.py index 13a31a4a9..3564e4882 100644 --- a/_pytest/assertion/util.py +++ b/_pytest/assertion/util.py @@ -149,11 +149,10 @@ def assertrepr_compare(config, op, left, right): if istext(left) and istext(right): explanation = _notin_text(left, right, verbose) except Exception: - excinfo = py.code.ExceptionInfo() explanation = [ u('(pytest_assertion plugin: representation of details failed. ' 'Probably an object has a faulty __repr__.)'), - u(excinfo)] + u(py.code.ExceptionInfo())] if not explanation: return None diff --git a/_pytest/main.py b/_pytest/main.py index b4cea1ca0..69184c957 100644 --- a/_pytest/main.py +++ b/_pytest/main.py @@ -98,6 +98,7 @@ def wrap_session(config, doit): if session._testsfailed: session.exitstatus = EXIT_TESTSFAILED finally: + excinfo = None # Explicitly break reference cycle. session.startdir.chdir() if initstate >= 2: config.hook.pytest_sessionfinish( diff --git a/_pytest/python.py b/_pytest/python.py index 544055ec9..0c48f01c2 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -456,8 +456,8 @@ class Module(pytest.File, PyCollector): try: mod = self.fspath.pyimport(ensuresyspath=True) except SyntaxError: - excinfo = py.code.ExceptionInfo() - raise self.CollectError(excinfo.getrepr(style="short")) + raise self.CollectError( + py.code.ExceptionInfo().getrepr(style="short")) except self.fspath.ImportMismatchError: e = sys.exc_info()[1] raise self.CollectError(