[Python-checkins] r75405 - in python/trunk: Misc/NEWS Python/compile.c

neil.schemenauer python-checkins at python.org
Wed Oct 14 19:17:14 CEST 2009


Author: neil.schemenauer
Date: Wed Oct 14 19:17:14 2009
New Revision: 75405

Log:
Issue #1754094: Improve the stack depth calculation in the compiler.
There should be no other effect than a small decrease in memory use.
Patch by Christopher Tur Lesniewski-Laas.


Modified:
   python/trunk/Misc/NEWS
   python/trunk/Python/compile.c

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Wed Oct 14 19:17:14 2009
@@ -12,6 +12,10 @@
 Core and Builtins
 -----------------
 
+- Issue #1754094: Improve the stack depth calculation in the compiler.
+  There should be no other effect than a small decrease in memory use.
+  Patch by Christopher Tur Lesniewski-Laas.
+
 - Issue #7084: Fix a (very unlikely) crash when printing a list from one
   thread, and mutating it from another one.  Patch by Scott Dial.
 

Modified: python/trunk/Python/compile.c
==============================================================================
--- python/trunk/Python/compile.c	(original)
+++ python/trunk/Python/compile.c	Wed Oct 14 19:17:14 2009
@@ -692,13 +692,13 @@
 			return -1;
 
 		case SLICE+0:
-			return 1;
-		case SLICE+1:
 			return 0;
+		case SLICE+1:
+			return -1;
 		case SLICE+2:
-			return 0;
-		case SLICE+3:
 			return -1;
+		case SLICE+3:
+			return -2;
 
 		case STORE_SLICE+0:
 			return -2;
@@ -778,7 +778,8 @@
 		case POP_BLOCK:
 			return 0;
 		case END_FINALLY:
-			return -1; /* or -2 or -3 if exception occurred */
+			return -3; /* or -1 or -2 if no exception occurred or
+				      return/break/continue */
 		case BUILD_CLASS:
 			return -2;
 
@@ -789,7 +790,7 @@
 		case UNPACK_SEQUENCE:
 			return oparg-1;
 		case FOR_ITER:
-			return 1;
+			return 1; /* or -1, at end of iterator */
 
 		case STORE_ATTR:
 			return -2;
@@ -815,7 +816,7 @@
 		case COMPARE_OP:
 			return -1;
 		case IMPORT_NAME:
-			return 0;
+			return -1;
 		case IMPORT_FROM:
 			return 1;
 
@@ -835,10 +836,9 @@
 		case CONTINUE_LOOP:
 			return 0;
 		case SETUP_LOOP:
-			return 0;
 		case SETUP_EXCEPT:
 		case SETUP_FINALLY:
-			return 3; /* actually pushed by an exception */
+			return 0;
 
 		case LOAD_FAST:
 			return 1;
@@ -867,7 +867,7 @@
 				return -1;
 
 		case MAKE_CLOSURE:
-			return -oparg;
+			return -oparg-1;
 		case LOAD_CLOSURE:
 			return 1;
 		case LOAD_DEREF:
@@ -3328,7 +3328,7 @@
 static int
 stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
 {
-	int i;
+	int i, target_depth;
 	struct instr *instr;
 	if (b->b_seen || b->b_startdepth >= depth)
 		return maxdepth;
@@ -3341,8 +3341,17 @@
 			maxdepth = depth;
 		assert(depth >= 0); /* invalid code or bug in stackdepth() */
 		if (instr->i_jrel || instr->i_jabs) {
+			target_depth = depth;
+			if (instr->i_opcode == FOR_ITER) {
+				target_depth = depth-2;
+			} else if (instr->i_opcode == SETUP_FINALLY ||
+				   instr->i_opcode == SETUP_EXCEPT) {
+				target_depth = depth+3;
+				if (target_depth > maxdepth)
+					maxdepth = target_depth;
+			}
 			maxdepth = stackdepth_walk(c, instr->i_target,
-						   depth, maxdepth);
+						   target_depth, maxdepth);
 			if (instr->i_opcode == JUMP_ABSOLUTE ||
 			    instr->i_opcode == JUMP_FORWARD) {
 				goto out; /* remaining code is dead */


More information about the Python-checkins mailing list