From aa06b0ede584324ea2a509b344ef07d619d0827f Mon Sep 17 00:00:00 2001
From: Guido van Rossum <guido@python.org>
Date: Fri, 26 Dec 1997 22:15:57 +0000
Subject: Plug the most annoying recursive printing problem -- reset '_' to
 None before printing and set it to the printed variable *after* printing (and
 only when printing is successful).

---
 Python/ceval.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/Python/ceval.c b/Python/ceval.c
index fad8c2b..8b7447c 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1008,11 +1008,12 @@ eval_code2(co, globals, locals,
 		
 		case PRINT_EXPR:
 			v = POP();
-			/* Print value except if procedure result */
-			/* Before printing, also assign to '_' */
+			/* Print value except if None */
+			/* After printing, also assign to '_' */
+			/* Before, set '_' to None to avoid recursion */
 			if (v != Py_None &&
 			    (err = PyDict_SetItemString(
-				    f->f_builtins, "_", v)) == 0) {
+				    f->f_builtins, "_", Py_None)) == 0) {
 				err = Py_FlushLine();
 				if (err == 0) {
 					x = PySys_GetObject("stdout");
@@ -1025,6 +1026,10 @@ eval_code2(co, globals, locals,
 					PyFile_SoftSpace(x, 1);
 					err = Py_FlushLine();
 				}
+				if (err == 0) {
+					err = PyDict_SetItemString(
+						f->f_builtins, "_", v);
+				}
 			}
 			Py_DECREF(v);
 			break;
-- 
cgit v0.12

