mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Revert a premature patch for issue #14010 (changeset aaaf36026511).
This commit is contained in:
		
							parent
							
								
									9e64c91c92
								
							
						
					
					
						commit
						278d03bd66
					
				
					 6 changed files with 14 additions and 224 deletions
				
			
		|  | @ -1565,40 +1565,8 @@ def test_baddecorator(self): | |||
|         data = 'The quick Brown fox Jumped over The lazy Dog'.split() | ||||
|         self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0) | ||||
| 
 | ||||
| class TestRecursionLimit(unittest.TestCase): | ||||
|     # Issue #14010 | ||||
|     recursionlimit = sys.getrecursionlimit() | ||||
| 
 | ||||
|     def test_filter(self): | ||||
|         it = (0, 1) | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = filter(bool, it) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
|     def test_map(self): | ||||
|         it = (0, 1) | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = map(int, it) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
|     def test_zip(self): | ||||
|         it = (0, 1) | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = zip(it) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
| 
 | ||||
| def test_main(verbose=None): | ||||
|     test_classes = (BuiltinTest, TestSorted, TestRecursionLimit) | ||||
|     test_classes = (BuiltinTest, TestSorted) | ||||
| 
 | ||||
|     run_unittest(*test_classes) | ||||
| 
 | ||||
|  |  | |||
|  | @ -1809,121 +1809,6 @@ def __init__(self, newarg=None, *args): | |||
|                 self.assertNotIn("does not take keyword arguments", err.args[0]) | ||||
| 
 | ||||
| 
 | ||||
| class TestRecursionLimit(unittest.TestCase): | ||||
|     # Issue #14010 | ||||
|     recursionlimit = sys.getrecursionlimit() | ||||
| 
 | ||||
|     def test_accumulate(self): | ||||
|         it = (0, 1) | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = accumulate(it) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
|     def test_chain(self): | ||||
|         it = (0, 1) | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = chain(it, ()) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
|     def test_compress(self): | ||||
|         data = (0, 1) | ||||
|         selectors = (True, True) | ||||
|         it = data | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = compress(it, selectors) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
|         it = selectors | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = compress(data, it) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
|     def test_cycle(self): | ||||
|         it = (0, 1) | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = cycle(it) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in range(3): | ||||
|                 next(it) | ||||
|         del it | ||||
| 
 | ||||
|     def test_dropwhile(self): | ||||
|         it = (0, 1, 0) | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = dropwhile(bool, it) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
|     def test_filterfalse(self): | ||||
|         it = (0, 1) | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = filterfalse(bool, it) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
|     def test_groupby(self): | ||||
|         key = operator.itemgetter(0) | ||||
|         it = ((0, []), (1, [])) | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = groupby(it, key) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
|     def test_islice(self): | ||||
|         it = (0, 1) | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = islice(it, 2) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
|     def test_starmap(self): | ||||
|         it = 'ab' | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = starmap(tuple, it) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
|     def test_takewhile(self): | ||||
|         it = (1, 0) | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = takewhile(bool, it) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
|     def test_zip_longest(self): | ||||
|         it = (0, 1) | ||||
|         for _ in range(self.recursionlimit): | ||||
|             it = zip_longest(it) | ||||
|         with self.assertRaises(RuntimeError): | ||||
|             for _ in it: | ||||
|                 pass | ||||
|         del it | ||||
| 
 | ||||
| 
 | ||||
| libreftest = """ Doctest for examples in the library reference: libitertools.tex | ||||
| 
 | ||||
| 
 | ||||
|  | @ -2158,7 +2043,7 @@ def test_zip_longest(self): | |||
| def test_main(verbose=None): | ||||
|     test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC, | ||||
|                     RegressionTests, LengthTransparency, | ||||
|                     SubclassWithKwargsTest, TestExamples, TestRecursionLimit) | ||||
|                     SubclassWithKwargsTest, TestExamples) | ||||
|     support.run_unittest(*test_classes) | ||||
| 
 | ||||
|     # verify reference counting | ||||
|  |  | |||
|  | @ -12,9 +12,6 @@ What's New in Python 3.3.2? | |||
| Core and Builtins | ||||
| ----------------- | ||||
| 
 | ||||
| - Issue #14010: Fix a crash when iterating or deleting deeply nested filters | ||||
|   (builting and in itertools module, i.e. map(), itertools.chain(), etc). | ||||
| 
 | ||||
| - Issue #17619: Make input() check for Ctrl-C correctly on Windows. | ||||
| 
 | ||||
| - Issue #17610: Don't rely on non-standard behavior of the C qsort() function. | ||||
|  |  | |||
|  | @ -54,14 +54,12 @@ static void | |||
| groupby_dealloc(groupbyobject *gbo) | ||||
| { | ||||
|     PyObject_GC_UnTrack(gbo); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(gbo) | ||||
|     Py_XDECREF(gbo->it); | ||||
|     Py_XDECREF(gbo->keyfunc); | ||||
|     Py_XDECREF(gbo->tgtkey); | ||||
|     Py_XDECREF(gbo->currkey); | ||||
|     Py_XDECREF(gbo->currvalue); | ||||
|     Py_TYPE(gbo)->tp_free(gbo); | ||||
|     Py_TRASHCAN_SAFE_END(gbo) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -913,11 +911,9 @@ static void | |||
| cycle_dealloc(cycleobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->saved); | ||||
|     Py_XDECREF(lz->it); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -1092,11 +1088,9 @@ static void | |||
| dropwhile_dealloc(dropwhileobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->func); | ||||
|     Py_XDECREF(lz->it); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -1117,10 +1111,7 @@ dropwhile_next(dropwhileobject *lz) | |||
| 
 | ||||
|     iternext = *Py_TYPE(it)->tp_iternext; | ||||
|     for (;;) { | ||||
|         if (Py_EnterRecursiveCall(" while iterating")) | ||||
|             return NULL; | ||||
|         item = iternext(it); | ||||
|         Py_LeaveRecursiveCall(); | ||||
|         if (item == NULL) | ||||
|             return NULL; | ||||
|         if (lz->start == 1) | ||||
|  | @ -1266,11 +1257,9 @@ static void | |||
| takewhile_dealloc(takewhileobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->func); | ||||
|     Py_XDECREF(lz->it); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -1291,10 +1280,7 @@ takewhile_next(takewhileobject *lz) | |||
|     if (lz->stop == 1) | ||||
|         return NULL; | ||||
| 
 | ||||
|     if (Py_EnterRecursiveCall(" while iterating")) | ||||
|         return NULL; | ||||
|     item = (*Py_TYPE(it)->tp_iternext)(it); | ||||
|     Py_LeaveRecursiveCall(); | ||||
|     if (item == NULL) | ||||
|         return NULL; | ||||
| 
 | ||||
|  | @ -1486,10 +1472,8 @@ static void | |||
| islice_dealloc(isliceobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->it); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -1510,10 +1494,7 @@ islice_next(isliceobject *lz) | |||
| 
 | ||||
|     iternext = *Py_TYPE(it)->tp_iternext; | ||||
|     while (lz->cnt < lz->next) { | ||||
|         if (Py_EnterRecursiveCall(" while iterating")) | ||||
|             return NULL; | ||||
|         item = iternext(it); | ||||
|         Py_LeaveRecursiveCall(); | ||||
|         if (item == NULL) | ||||
|             return NULL; | ||||
|         Py_DECREF(item); | ||||
|  | @ -1521,10 +1502,7 @@ islice_next(isliceobject *lz) | |||
|     } | ||||
|     if (stop != -1 && lz->cnt >= stop) | ||||
|         return NULL; | ||||
|     if (Py_EnterRecursiveCall(" while iterating")) | ||||
|         return NULL; | ||||
|     item = iternext(it); | ||||
|     Py_LeaveRecursiveCall(); | ||||
|     if (item == NULL) | ||||
|         return NULL; | ||||
|     lz->cnt++; | ||||
|  | @ -1675,11 +1653,9 @@ static void | |||
| starmap_dealloc(starmapobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->func); | ||||
|     Py_XDECREF(lz->it); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -1697,10 +1673,7 @@ starmap_next(starmapobject *lz) | |||
|     PyObject *result; | ||||
|     PyObject *it = lz->it; | ||||
| 
 | ||||
|     if (Py_EnterRecursiveCall(" while iterating")) | ||||
|         return NULL; | ||||
|     args = (*Py_TYPE(it)->tp_iternext)(it); | ||||
|     Py_LeaveRecursiveCall(); | ||||
|     if (args == NULL) | ||||
|         return NULL; | ||||
|     if (!PyTuple_CheckExact(args)) { | ||||
|  | @ -1836,11 +1809,9 @@ static void | |||
| chain_dealloc(chainobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->active); | ||||
|     Py_XDECREF(lz->source); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -3369,12 +3340,10 @@ static void | |||
| accumulate_dealloc(accumulateobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->binop); | ||||
|     Py_XDECREF(lz->total); | ||||
|     Py_XDECREF(lz->it); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -3545,11 +3514,9 @@ static void | |||
| compress_dealloc(compressobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->data); | ||||
|     Py_XDECREF(lz->selectors); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -3576,16 +3543,11 @@ compress_next(compressobject *lz) | |||
|            exception first). | ||||
|         */ | ||||
| 
 | ||||
|         if (Py_EnterRecursiveCall(" while iterating")) | ||||
|             return NULL; | ||||
|         datum = datanext(data); | ||||
|         if (datum == NULL) { | ||||
|             Py_LeaveRecursiveCall(); | ||||
|         if (datum == NULL) | ||||
|             return NULL; | ||||
|         } | ||||
| 
 | ||||
|         selector = selectornext(selectors); | ||||
|         Py_LeaveRecursiveCall(); | ||||
|         if (selector == NULL) { | ||||
|             Py_DECREF(datum); | ||||
|             return NULL; | ||||
|  | @ -3712,11 +3674,9 @@ static void | |||
| filterfalse_dealloc(filterfalseobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->func); | ||||
|     Py_XDECREF(lz->it); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -3737,10 +3697,7 @@ filterfalse_next(filterfalseobject *lz) | |||
| 
 | ||||
|     iternext = *Py_TYPE(it)->tp_iternext; | ||||
|     for (;;) { | ||||
|         if (Py_EnterRecursiveCall(" while iterating")) | ||||
|             return NULL; | ||||
|         item = iternext(it); | ||||
|         Py_LeaveRecursiveCall(); | ||||
|         if (item == NULL) | ||||
|             return NULL; | ||||
| 
 | ||||
|  | @ -4304,12 +4261,10 @@ static void | |||
| zip_longest_dealloc(ziplongestobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->ittuple); | ||||
|     Py_XDECREF(lz->result); | ||||
|     Py_XDECREF(lz->fillvalue); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  |  | |||
|  | @ -2681,10 +2681,7 @@ PyObject * | |||
| PyIter_Next(PyObject *iter) | ||||
| { | ||||
|     PyObject *result; | ||||
|     if (Py_EnterRecursiveCall(" while iterating")) | ||||
|         return NULL; | ||||
|     result = (*iter->ob_type->tp_iternext)(iter); | ||||
|     Py_LeaveRecursiveCall(); | ||||
|     if (result == NULL && | ||||
|         PyErr_Occurred() && | ||||
|         PyErr_ExceptionMatches(PyExc_StopIteration)) | ||||
|  |  | |||
|  | @ -391,11 +391,9 @@ static void | |||
| filter_dealloc(filterobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->func); | ||||
|     Py_XDECREF(lz->it); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -416,10 +414,7 @@ filter_next(filterobject *lz) | |||
| 
 | ||||
|     iternext = *Py_TYPE(it)->tp_iternext; | ||||
|     for (;;) { | ||||
|         if (Py_EnterRecursiveCall(" while iterating")) | ||||
|             return NULL; | ||||
|         item = iternext(it); | ||||
|         Py_LeaveRecursiveCall(); | ||||
|         if (item == NULL) | ||||
|             return NULL; | ||||
| 
 | ||||
|  | @ -1036,11 +1031,9 @@ static void | |||
| map_dealloc(mapobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->iters); | ||||
|     Py_XDECREF(lz->func); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -2227,11 +2220,9 @@ static void | |||
| zip_dealloc(zipobject *lz) | ||||
| { | ||||
|     PyObject_GC_UnTrack(lz); | ||||
|     Py_TRASHCAN_SAFE_BEGIN(lz) | ||||
|     Py_XDECREF(lz->ittuple); | ||||
|     Py_XDECREF(lz->result); | ||||
|     Py_TYPE(lz)->tp_free(lz); | ||||
|     Py_TRASHCAN_SAFE_END(lz) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | @ -2254,15 +2245,15 @@ zip_next(zipobject *lz) | |||
| 
 | ||||
|     if (tuplesize == 0) | ||||
|         return NULL; | ||||
|     if (Py_EnterRecursiveCall(" while iterating")) | ||||
|         return NULL; | ||||
|     if (Py_REFCNT(result) == 1) { | ||||
|         Py_INCREF(result); | ||||
|         for (i=0 ; i < tuplesize ; i++) { | ||||
|             it = PyTuple_GET_ITEM(lz->ittuple, i); | ||||
|             item = (*Py_TYPE(it)->tp_iternext)(it); | ||||
|             if (item == NULL) | ||||
|                 goto error; | ||||
|             if (item == NULL) { | ||||
|                 Py_DECREF(result); | ||||
|                 return NULL; | ||||
|             } | ||||
|             olditem = PyTuple_GET_ITEM(result, i); | ||||
|             PyTuple_SET_ITEM(result, i, item); | ||||
|             Py_DECREF(olditem); | ||||
|  | @ -2270,21 +2261,18 @@ zip_next(zipobject *lz) | |||
|     } else { | ||||
|         result = PyTuple_New(tuplesize); | ||||
|         if (result == NULL) | ||||
|             goto error; | ||||
|             return NULL; | ||||
|         for (i=0 ; i < tuplesize ; i++) { | ||||
|             it = PyTuple_GET_ITEM(lz->ittuple, i); | ||||
|             item = (*Py_TYPE(it)->tp_iternext)(it); | ||||
|             if (item == NULL) | ||||
|                 goto error; | ||||
|             if (item == NULL) { | ||||
|                 Py_DECREF(result); | ||||
|                 return NULL; | ||||
|             } | ||||
|             PyTuple_SET_ITEM(result, i, item); | ||||
|         } | ||||
|     } | ||||
|     Py_LeaveRecursiveCall(); | ||||
|     return result; | ||||
| error: | ||||
|     Py_XDECREF(result); | ||||
|     Py_LeaveRecursiveCall(); | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| static PyObject * | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Serhiy Storchaka
						Serhiy Storchaka