diff Python/compile.c @ 57450:0db67153d25f

Merged revisions 75264,75268,75293,75318,75391-75392,75436,75478,75971,76003,76058,76140-76141,76231,76380,76428-76429 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r75264 | andrew.kuchling | 2009-10-05 17:30:22 -0500 (Mon, 05 Oct 2009) | 1 line Add various items ........ r75268 | andrew.kuchling | 2009-10-05 17:45:39 -0500 (Mon, 05 Oct 2009) | 1 line Remove two notes ........ r75293 | kristjan.jonsson | 2009-10-09 09:32:19 -0500 (Fri, 09 Oct 2009) | 2 lines http://bugs.python.org/issue7029 a non-default timer wasn't actually used by the individual Tests. ........ r75318 | benjamin.peterson | 2009-10-10 16:15:58 -0500 (Sat, 10 Oct 2009) | 1 line remove script which uses long gone module ........ r75391 | andrew.kuchling | 2009-10-13 10:49:33 -0500 (Tue, 13 Oct 2009) | 1 line Link to PEP ........ r75392 | andrew.kuchling | 2009-10-13 11:11:49 -0500 (Tue, 13 Oct 2009) | 1 line Various link, textual, and markup fixes ........ r75436 | benjamin.peterson | 2009-10-15 10:39:15 -0500 (Thu, 15 Oct 2009) | 1 line don't need to mess up sys.path ........ r75478 | senthil.kumaran | 2009-10-17 20:58:45 -0500 (Sat, 17 Oct 2009) | 3 lines Fix a typo. ........ r75971 | benjamin.peterson | 2009-10-30 22:56:15 -0500 (Fri, 30 Oct 2009) | 1 line add some checks for evaluation order with parenthesis #7210 ........ r76003 | antoine.pitrou | 2009-10-31 19:30:13 -0500 (Sat, 31 Oct 2009) | 6 lines Hopefully fix the buildbot problems on test_mailbox, by computing the maildir toc cache refresh date before actually refreshing the cache. (see #6896) ........ r76058 | benjamin.peterson | 2009-11-02 10:14:19 -0600 (Mon, 02 Nov 2009) | 1 line grant list.index() a more informative error message #7252 ........ r76140 | nick.coghlan | 2009-11-07 02:13:55 -0600 (Sat, 07 Nov 2009) | 1 line Add test for runpy.run_module package execution and use something other than logging as the example of a non-executable package ........ r76141 | nick.coghlan | 2009-11-07 02:15:01 -0600 (Sat, 07 Nov 2009) | 1 line Some minor cleanups to private runpy code and docstrings ........ r76231 | benjamin.peterson | 2009-11-12 17:42:23 -0600 (Thu, 12 Nov 2009) | 1 line this main is much more useful ........ r76380 | antoine.pitrou | 2009-11-18 14:20:46 -0600 (Wed, 18 Nov 2009) | 3 lines Mention Giampolo R's new FTP TLS support in the what's new file ........ r76428 | benjamin.peterson | 2009-11-19 20:15:50 -0600 (Thu, 19 Nov 2009) | 1 line turn goto into do while loop ........ r76429 | benjamin.peterson | 2009-11-19 20:56:43 -0600 (Thu, 19 Nov 2009) | 2 lines avoid doing an uneeded import in a function ........
author Benjamin Peterson <benjamin@python.org>
date Wed, 25 Nov 2009 17:46:26 +0000
parents 2c60ac4ed65f
children b0fc54c5d234
line wrap: on
line diff
--- a/Python/compile.c	Wed Nov 25 17:19:56 2009 +0000
+++ b/Python/compile.c	Wed Nov 25 17:46:26 2009 +0000
@@ -3802,49 +3802,47 @@
 assemble_jump_offsets(struct assembler *a, struct compiler *c)
 {
 	basicblock *b;
-	int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
+	int bsize, totsize, extended_arg_count = 0, last_extended_arg_count;
 	int i;
 
 	/* Compute the size of each block and fixup jump args.
 	   Replace block pointer with position in bytecode. */
-start:
-	totsize = 0;
-	for (i = a->a_nblocks - 1; i >= 0; i--) {
-		b = a->a_postorder[i];
-		bsize = blocksize(b);
-		b->b_offset = totsize;
-		totsize += bsize;
-	}
-	extended_arg_count = 0;
-	for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
-		bsize = b->b_offset;
-		for (i = 0; i < b->b_iused; i++) {
-			struct instr *instr = &b->b_instr[i];
-			/* Relative jumps are computed relative to
-			   the instruction pointer after fetching
-			   the jump instruction.
-			*/
-			bsize += instrsize(instr);
-			if (instr->i_jabs)
-				instr->i_oparg = instr->i_target->b_offset;
-			else if (instr->i_jrel) {
-				int delta = instr->i_target->b_offset - bsize;
-				instr->i_oparg = delta;
+	do {
+		totsize = 0;
+		for (i = a->a_nblocks - 1; i >= 0; i--) {
+			b = a->a_postorder[i];
+			bsize = blocksize(b);
+			b->b_offset = totsize;
+			totsize += bsize;
+		}
+		last_extended_arg_count = extended_arg_count;
+		extended_arg_count = 0;
+		for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
+			bsize = b->b_offset;
+			for (i = 0; i < b->b_iused; i++) {
+				struct instr *instr = &b->b_instr[i];
+				/* Relative jumps are computed relative to
+				   the instruction pointer after fetching
+				   the jump instruction.
+				*/
+				bsize += instrsize(instr);
+				if (instr->i_jabs)
+					instr->i_oparg = instr->i_target->b_offset;
+				else if (instr->i_jrel) {
+					int delta = instr->i_target->b_offset - bsize;
+					instr->i_oparg = delta;
+				}
+				else
+					continue;
+				if (instr->i_oparg > 0xffff)
+					extended_arg_count++;
 			}
-			else
-				continue;
-			if (instr->i_oparg > 0xffff)
-				extended_arg_count++;
 		}
-	}
 
 	/* XXX: This is an awful hack that could hurt performance, but
 		on the bright side it should work until we come up
 		with a better solution.
 
-		In the meantime, should the goto be dropped in favor
-		of a loop?
-
 		The issue is that in the first loop blocksize() is called
 		which calls instrsize() which requires i_oparg be set
 		appropriately.	There is a bootstrap problem because
@@ -3855,10 +3853,7 @@
 		ones in jump instructions.  So this should converge
 		fairly quickly.
 	*/
-	if (last_extended_arg_count != extended_arg_count) {
-		last_extended_arg_count = extended_arg_count;
-		goto start;
-	}
+	} while (last_extended_arg_count != extended_arg_count);
 }
 
 static PyObject *