mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	SF bug 567538: Generator can crash the interpreter (Finn Bock).
This was a simple typo. Strange that the compiler didn't catch it! Instead of WHY_CONTINUE, two tests used CONTINUE_LOOP, which isn't a why_code at all, but an opcode; but even though 'why' is declared as an enum, comparing it to an int is apparently not even worth a warning -- not in gcc, and not in VC++. :-( Will fix in 2.2 too.
This commit is contained in:
		
							parent
							
								
									969de458aa
								
							
						
					
					
						commit
						c5fe5eb8d2
					
				
					 3 changed files with 25 additions and 2 deletions
				
			
		|  | @ -805,6 +805,26 @@ | ||||||
| ...         yield 2             # because it's a generator | ...         yield 2             # because it's a generator | ||||||
| Traceback (most recent call last): | Traceback (most recent call last): | ||||||
| SyntaxError: 'return' with argument inside generator (<string>, line 8) | SyntaxError: 'return' with argument inside generator (<string>, line 8) | ||||||
|  | 
 | ||||||
|  | This one caused a crash (see SF bug 567538): | ||||||
|  | 
 | ||||||
|  | >>> def f(): | ||||||
|  | ...     for i in range(3): | ||||||
|  | ...         try: | ||||||
|  | ...             continue | ||||||
|  | ...         finally: | ||||||
|  | ...             yield i | ||||||
|  | ...  | ||||||
|  | >>> g = f() | ||||||
|  | >>> print g.next() | ||||||
|  | 0 | ||||||
|  | >>> print g.next() | ||||||
|  | 1 | ||||||
|  | >>> print g.next() | ||||||
|  | 2 | ||||||
|  | >>> print g.next() | ||||||
|  | Traceback (most recent call last): | ||||||
|  | StopIteration | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| # conjoin is a simple backtracking generator, named in honor of Icon's | # conjoin is a simple backtracking generator, named in honor of Icon's | ||||||
|  |  | ||||||
|  | @ -6,6 +6,9 @@ Type/class unification and new-style classes | ||||||
| 
 | 
 | ||||||
| Core and builtins | Core and builtins | ||||||
| 
 | 
 | ||||||
|  | - Fixed a bug with a continue inside a try block and a yield in the | ||||||
|  |   finally clause.  [SF bug 567538] | ||||||
|  | 
 | ||||||
| - Most builtin sequences now support "extended slices", i.e. slices | - Most builtin sequences now support "extended slices", i.e. slices | ||||||
|   with a third "stride" parameter.  For example, "range(10)[1:6:2]" |   with a third "stride" parameter.  For example, "range(10)[1:6:2]" | ||||||
|   evaluates to [1, 3, 5]. |   evaluates to [1, 3, 5]. | ||||||
|  |  | ||||||
|  | @ -1543,7 +1543,7 @@ eval_frame(PyFrameObject *f) | ||||||
| 				why = (enum why_code) PyInt_AsLong(v); | 				why = (enum why_code) PyInt_AsLong(v); | ||||||
| 				if (why == WHY_RETURN || | 				if (why == WHY_RETURN || | ||||||
| 				    why == WHY_YIELD || | 				    why == WHY_YIELD || | ||||||
| 				    why == CONTINUE_LOOP) | 				    why == WHY_CONTINUE) | ||||||
| 					retval = POP(); | 					retval = POP(); | ||||||
| 			} | 			} | ||||||
| 			else if (PyString_Check(v) || PyClass_Check(v)) { | 			else if (PyString_Check(v) || PyClass_Check(v)) { | ||||||
|  | @ -2293,7 +2293,7 @@ eval_frame(PyFrameObject *f) | ||||||
| 				} | 				} | ||||||
| 				else { | 				else { | ||||||
| 					if (why == WHY_RETURN || | 					if (why == WHY_RETURN || | ||||||
| 					    why == CONTINUE_LOOP) | 					    why == WHY_CONTINUE) | ||||||
| 						PUSH(retval); | 						PUSH(retval); | ||||||
| 					v = PyInt_FromLong((long)why); | 					v = PyInt_FromLong((long)why); | ||||||
| 					PUSH(v); | 					PUSH(v); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Guido van Rossum
						Guido van Rossum