Fix memory leak with pytest.raises by using weakref

This commit is contained in:
Michael Seifert 2016-10-18 00:56:44 +02:00 committed by Bruno Oliveira
parent 0b94c43bac
commit 1e5b21cd61
3 changed files with 7 additions and 2 deletions

View File

@ -99,6 +99,7 @@ mbyt
Michael Aquilina Michael Aquilina
Michael Birtwell Michael Birtwell
Michael Droettboom Michael Droettboom
Michael Seifert
Mike Lundy Mike Lundy
Nicolas Delaby Nicolas Delaby
Oleg Pidsadnyi Oleg Pidsadnyi

View File

@ -12,6 +12,9 @@
* When loading plugins, import errors which contain non-ascii messages are now properly handled in Python 2 (`#1998`_). * When loading plugins, import errors which contain non-ascii messages are now properly handled in Python 2 (`#1998`_).
Thanks `@nicoddemus`_ for the PR. Thanks `@nicoddemus`_ for the PR.
* Fixed memory leak in the RaisesContext (pytest.raises) (`#1965`_).
Thanks `@MSeifert04`_ for the report the PR.
* Fixed false-positives warnings from assertion rewrite hook for modules that were rewritten but * Fixed false-positives warnings from assertion rewrite hook for modules that were rewritten but
were later marked explicitly by ``pytest.register_assert_rewrite`` were later marked explicitly by ``pytest.register_assert_rewrite``
or implicitly as a plugin (`#2005`_). or implicitly as a plugin (`#2005`_).

View File

@ -1,6 +1,7 @@
import sys import sys
from inspect import CO_VARARGS, CO_VARKEYWORDS from inspect import CO_VARARGS, CO_VARKEYWORDS
import re import re
from weakref import ref
import py import py
builtin_repr = repr builtin_repr = repr
@ -230,7 +231,7 @@ class TracebackEntry(object):
return False return False
if py.builtin.callable(tbh): if py.builtin.callable(tbh):
return tbh(self._excinfo) return tbh(None if self._excinfo is None else self._excinfo())
else: else:
return tbh return tbh
@ -370,7 +371,7 @@ class ExceptionInfo(object):
#: the exception type name #: the exception type name
self.typename = self.type.__name__ self.typename = self.type.__name__
#: the exception traceback (_pytest._code.Traceback instance) #: the exception traceback (_pytest._code.Traceback instance)
self.traceback = _pytest._code.Traceback(self.tb, excinfo=self) self.traceback = _pytest._code.Traceback(self.tb, excinfo=ref(self))
def __repr__(self): def __repr__(self):
return "<ExceptionInfo %s tblen=%d>" % (self.typename, len(self.traceback)) return "<ExceptionInfo %s tblen=%d>" % (self.typename, len(self.traceback))