diff options
| author | Benjamin Peterson <benjamin@python.org> | 2009-11-25 17:46:26 (GMT) | 
|---|---|---|
| committer | Benjamin Peterson <benjamin@python.org> | 2009-11-25 17:46:26 (GMT) | 
| commit | f6489f941c7ad37751a597fc664c3f9946e8a0c3 (patch) | |
| tree | a07ab31526e96cc835fbef7ea06b0a69a67250b8 /Python/compile.c | |
| parent | 5554993d375b43114ac6b431d596a0ef2cb58a5e (diff) | |
| download | cpython-f6489f941c7ad37751a597fc664c3f9946e8a0c3.zip cpython-f6489f941c7ad37751a597fc664c3f9946e8a0c3.tar.gz cpython-f6489f941c7ad37751a597fc664c3f9946e8a0c3.tar.bz2  | |
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
........
Diffstat (limited to 'Python/compile.c')
| -rw-r--r-- | Python/compile.c | 67 | 
1 files changed, 31 insertions, 36 deletions
diff --git a/Python/compile.c b/Python/compile.c index 2bb9beb..d8fb47b 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3802,49 +3802,47 @@ static void  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 @@ start:  		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 *  | 
