Merge pull request #2487 from nicoddemus/recursion-error-2486

Fix internal error when trying to detect the start of a recursive traceback
This commit is contained in:
Ronny Pfannschmidt 2017-06-22 13:40:32 +02:00 committed by GitHub
commit 5e832017d5
3 changed files with 29 additions and 2 deletions

View File

@ -640,8 +640,11 @@ class FormattedExcinfo(object):
).format(exc_type=type(e).__name__, exc_msg=safe_str(e), max_frames=max_frames, total=len(traceback))
traceback = traceback[:max_frames] + traceback[-max_frames:]
else:
if recursionindex is not None:
extraline = "!!! Recursion detected (same locals & position)"
traceback = traceback[:recursionindex + 1]
else:
extraline = None
return traceback, extraline

1
changelog/2486.bugfix Normal file
View File

@ -0,0 +1 @@
Fix internal error when trying to detect the start of a recursive traceback.

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function
import sys
import operator
import _pytest
import py
@ -1173,3 +1174,25 @@ def test_exception_repr_extraction_error_on_recursion():
'*The following exception happened*',
'*ValueError: The truth value of an array*',
])
def test_no_recursion_index_on_recursion_error():
"""
Ensure that we don't break in case we can't find the recursion index
during a recursion error (#2486).
"""
try:
class RecursionDepthError(object):
def __getattr__(self, attr):
return getattr(self, '_' + attr)
RecursionDepthError().trigger
except:
from _pytest._code.code import ExceptionInfo
exc_info = ExceptionInfo()
if sys.version_info[:2] == (2, 6):
assert "'RecursionDepthError' object has no attribute '___" in str(exc_info.getrepr())
else:
assert 'maximum recursion' in str(exc_info.getrepr())
else:
assert 0