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:
		
						commit
						5e832017d5
					
				|  | @ -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)) |             ).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:] |             traceback = traceback[:max_frames] + traceback[-max_frames:] | ||||||
|         else: |         else: | ||||||
|             extraline = "!!! Recursion detected (same locals & position)" |             if recursionindex is not None: | ||||||
|             traceback = traceback[:recursionindex + 1] |                 extraline = "!!! Recursion detected (same locals & position)" | ||||||
|  |                 traceback = traceback[:recursionindex + 1] | ||||||
|  |             else: | ||||||
|  |                 extraline = None | ||||||
|              |              | ||||||
|         return traceback, extraline |         return traceback, extraline | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | Fix internal error when trying to detect the start of a recursive traceback. | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| # -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||||||
| from __future__ import absolute_import, division, print_function | from __future__ import absolute_import, division, print_function | ||||||
| 
 | 
 | ||||||
|  | import sys | ||||||
| import operator | import operator | ||||||
| import _pytest | import _pytest | ||||||
| import py | import py | ||||||
|  | @ -1173,3 +1174,25 @@ def test_exception_repr_extraction_error_on_recursion(): | ||||||
|             '*The following exception happened*', |             '*The following exception happened*', | ||||||
|             '*ValueError: The truth value of an array*', |             '*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 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue