turn goto into do while loop

This commit is contained in:
Benjamin Peterson 2009-11-20 02:15:50 +00:00
parent 009b89d22a
commit cef9782810

View file

@ -3586,12 +3586,12 @@ static void
assemble_jump_offsets(struct assembler *a, struct compiler *c) assemble_jump_offsets(struct assembler *a, struct compiler *c)
{ {
basicblock *b; 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; int i;
/* Compute the size of each block and fixup jump args. /* Compute the size of each block and fixup jump args.
Replace block pointer with position in bytecode. */ Replace block pointer with position in bytecode. */
start: do {
totsize = 0; totsize = 0;
for (i = a->a_nblocks - 1; i >= 0; i--) { for (i = a->a_nblocks - 1; i >= 0; i--) {
b = a->a_postorder[i]; b = a->a_postorder[i];
@ -3599,6 +3599,7 @@ start:
b->b_offset = totsize; b->b_offset = totsize;
totsize += bsize; totsize += bsize;
} }
last_extended_arg_count = extended_arg_count;
extended_arg_count = 0; extended_arg_count = 0;
for (b = c->u->u_blocks; b != NULL; b = b->b_list) { for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
bsize = b->b_offset; bsize = b->b_offset;
@ -3626,9 +3627,6 @@ start:
on the bright side it should work until we come up on the bright side it should work until we come up
with a better solution. 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 The issue is that in the first loop blocksize() is called
which calls instrsize() which requires i_oparg be set which calls instrsize() which requires i_oparg be set
appropriately. There is a bootstrap problem because appropriately. There is a bootstrap problem because
@ -3639,10 +3637,7 @@ start:
ones in jump instructions. So this should converge ones in jump instructions. So this should converge
fairly quickly. fairly quickly.
*/ */
if (last_extended_arg_count != extended_arg_count) { } while (last_extended_arg_count != extended_arg_count);
last_extended_arg_count = extended_arg_count;
goto start;
}
} }
static PyObject * static PyObject *