mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	Issue 4597: Fix several cases in EvalFrameEx where an exception could be
"raised" without setting x, err, or why to let the eval loop know.
This commit is contained in:
		
							parent
							
								
									b5120ceae2
								
							
						
					
					
						commit
						2d873bd68b
					
				
					 2 changed files with 28 additions and 3 deletions
				
			
		|  | @ -531,6 +531,20 @@ def write(self, data): | ||||||
|         finally: |         finally: | ||||||
|             sys.stdout = save_stdout |             sys.stdout = save_stdout | ||||||
| 
 | 
 | ||||||
|  |     def test_del_stdout_before_print(self): | ||||||
|  |         # Issue 4597: 'print' with no argument wasn't reporting when | ||||||
|  |         # sys.stdout was deleted. | ||||||
|  |         save_stdout = sys.stdout | ||||||
|  |         del sys.stdout | ||||||
|  |         try: | ||||||
|  |             print | ||||||
|  |         except RuntimeError as e: | ||||||
|  |             self.assertEquals(str(e), "lost sys.stdout") | ||||||
|  |         else: | ||||||
|  |             self.fail("Expected RuntimeError") | ||||||
|  |         finally: | ||||||
|  |             sys.stdout = save_stdout | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def test_main(): | def test_main(): | ||||||
|     # Historically, these tests have been sloppy about removing TESTFN. |     # Historically, these tests have been sloppy about removing TESTFN. | ||||||
|  |  | ||||||
|  | @ -1049,6 +1049,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) | ||||||
| 			} | 			} | ||||||
| 			Py_FatalError("invalid argument to DUP_TOPX" | 			Py_FatalError("invalid argument to DUP_TOPX" | ||||||
| 				      " (bytecode corruption?)"); | 				      " (bytecode corruption?)"); | ||||||
|  | 			/* Never returns, so don't bother to set why. */ | ||||||
| 			break; | 			break; | ||||||
| 
 | 
 | ||||||
| 		case UNARY_POSITIVE: | 		case UNARY_POSITIVE: | ||||||
|  | @ -1642,9 +1643,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) | ||||||
| 		case PRINT_NEWLINE: | 		case PRINT_NEWLINE: | ||||||
| 			if (stream == NULL || stream == Py_None) { | 			if (stream == NULL || stream == Py_None) { | ||||||
| 				w = PySys_GetObject("stdout"); | 				w = PySys_GetObject("stdout"); | ||||||
| 				if (w == NULL) | 				if (w == NULL) { | ||||||
| 					PyErr_SetString(PyExc_RuntimeError, | 					PyErr_SetString(PyExc_RuntimeError, | ||||||
| 							"lost sys.stdout"); | 							"lost sys.stdout"); | ||||||
|  | 					why = WHY_EXCEPTION; | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 			if (w != NULL) { | 			if (w != NULL) { | ||||||
| 				/* w.write() may replace sys.stdout, so we
 | 				/* w.write() may replace sys.stdout, so we
 | ||||||
|  | @ -1870,6 +1873,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) | ||||||
| 				PyErr_Format(PyExc_SystemError, | 				PyErr_Format(PyExc_SystemError, | ||||||
| 					     "no locals when loading %s", | 					     "no locals when loading %s", | ||||||
| 					     PyObject_REPR(w)); | 					     PyObject_REPR(w)); | ||||||
|  | 				why = WHY_EXCEPTION; | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 			if (PyDict_CheckExact(v)) { | 			if (PyDict_CheckExact(v)) { | ||||||
|  | @ -2459,7 +2463,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) | ||||||
| 			Py_DECREF(v); | 			Py_DECREF(v); | ||||||
| 			if (x != NULL) { | 			if (x != NULL) { | ||||||
| 				v = POP(); | 				v = POP(); | ||||||
| 				err = PyFunction_SetClosure(x, v); | 				if (PyFunction_SetClosure(x, v) != 0) { | ||||||
|  | 					/* Can't happen unless bytecode is corrupt. */ | ||||||
|  | 					why = WHY_EXCEPTION; | ||||||
|  | 				} | ||||||
| 				Py_DECREF(v); | 				Py_DECREF(v); | ||||||
| 			} | 			} | ||||||
| 			if (x != NULL && oparg > 0) { | 			if (x != NULL && oparg > 0) { | ||||||
|  | @ -2473,7 +2480,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) | ||||||
| 					w = POP(); | 					w = POP(); | ||||||
| 					PyTuple_SET_ITEM(v, oparg, w); | 					PyTuple_SET_ITEM(v, oparg, w); | ||||||
| 				} | 				} | ||||||
| 				err = PyFunction_SetDefaults(x, v); | 				if (PyFunction_SetDefaults(x, v) != 0) { | ||||||
|  | 					/* Can't happen unless
 | ||||||
|  |                                            PyFunction_SetDefaults changes. */ | ||||||
|  | 					why = WHY_EXCEPTION; | ||||||
|  | 				} | ||||||
| 				Py_DECREF(v); | 				Py_DECREF(v); | ||||||
| 			} | 			} | ||||||
| 			PUSH(x); | 			PUSH(x); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jeffrey Yasskin
						Jeffrey Yasskin