### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: compiler/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.java,v retrieving revision 1.35 diff -u -r1.35 ForeachStatement.java --- compiler/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.java 28 Mar 2006 20:29:56 -0000 1.35 +++ compiler/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.java 11 Jul 2006 13:40:03 -0000 @@ -124,20 +124,16 @@ // we need the variable to iterate the collection even if the // element variable is not used - if (!(this.action == null - || this.action.isEmptyBlock() - || ((this.action.bits & IsUsefulEmptyStatement) != 0))) { - switch(this.kind) { - case ARRAY : - this.collectionVariable.useFlag = LocalVariableBinding.USED; - this.indexVariable.useFlag = LocalVariableBinding.USED; - this.maxVariable.useFlag = LocalVariableBinding.USED; - break; - case RAW_ITERABLE : - case GENERIC_ITERABLE : - this.indexVariable.useFlag = LocalVariableBinding.USED; - break; - } + switch(this.kind) { + case ARRAY : + this.collectionVariable.useFlag = LocalVariableBinding.USED; + this.indexVariable.useFlag = LocalVariableBinding.USED; + this.maxVariable.useFlag = LocalVariableBinding.USED; + break; + case RAW_ITERABLE : + case GENERIC_ITERABLE : + this.indexVariable.useFlag = LocalVariableBinding.USED; + break; } //end of loop loopingContext.complainOnDeferredNullChecks(currentScope, actionInfo); @@ -167,27 +163,22 @@ return; } int pc = codeStream.position; - if (this.action == null - || this.action.isEmptyBlock() - || ((this.action.bits & IsUsefulEmptyStatement) != 0)) { - codeStream.exitUserScope(scope); - if (mergedInitStateIndex != -1) { - codeStream.removeNotDefinitelyAssignedVariables(currentScope, mergedInitStateIndex); - codeStream.addDefinitelyAssignedVariables(currentScope, mergedInitStateIndex); - } - codeStream.recordPositionsFrom(pc, this.sourceStart); - return; - } + final boolean generateActionBlock = !(this.action == null + || this.action.isEmptyBlock() + || ((this.action.bits & IsUsefulEmptyStatement) != 0)); + // generate the initializations switch(this.kind) { case ARRAY : - collection.generateCode(scope, codeStream, true); - codeStream.store(this.collectionVariable, false); - codeStream.iconst_0(); - codeStream.store(this.indexVariable, false); - codeStream.load(this.collectionVariable); - codeStream.arraylength(); - codeStream.store(this.maxVariable, false); + if (generateActionBlock) { + collection.generateCode(scope, codeStream, true); + codeStream.store(this.collectionVariable, false); + codeStream.iconst_0(); + codeStream.store(this.indexVariable, false); + codeStream.load(this.collectionVariable); + codeStream.arraylength(); + codeStream.store(this.maxVariable, false); + } break; case RAW_ITERABLE : case GENERIC_ITERABLE : @@ -209,7 +200,6 @@ codeStream.store(this.indexVariable, false); break; } - // label management BranchLabel actionLabel = new BranchLabel(codeStream); actionLabel.tagBits |= BranchLabel.USED; @@ -230,13 +220,15 @@ if (this.elementVariable.binding.resolvedPosition != -1) { switch(this.kind) { case ARRAY : - codeStream.load(this.collectionVariable); - codeStream.load(this.indexVariable); - codeStream.arrayAt(this.collectionElementType.id); - if (this.elementVariableImplicitWidening != -1) { - codeStream.generateImplicitConversion(this.elementVariableImplicitWidening); + if (generateActionBlock) { + codeStream.load(this.collectionVariable); + codeStream.load(this.indexVariable); + codeStream.arrayAt(this.collectionElementType.id); + if (this.elementVariableImplicitWidening != -1) { + codeStream.generateImplicitConversion(this.elementVariableImplicitWidening); + } + codeStream.store(this.elementVariable.binding, false); } - codeStream.store(this.elementVariable.binding, false); break; case RAW_ITERABLE : case GENERIC_ITERABLE : @@ -273,7 +265,10 @@ break; } } - this.action.generateCode(scope, codeStream); + + if (generateActionBlock) { + this.action.generateCode(scope, codeStream); + } // continuation point if (this.continueLabel != null) { @@ -282,7 +277,9 @@ // generate the increments for next iteration switch(this.kind) { case ARRAY : - codeStream.iinc(this.indexVariable.resolvedPosition, 1); + if (generateActionBlock) { + codeStream.iinc(this.indexVariable.resolvedPosition, 1); + } break; case RAW_ITERABLE : case GENERIC_ITERABLE : @@ -299,9 +296,11 @@ int conditionPC = codeStream.position; switch(this.kind) { case ARRAY : - codeStream.load(this.indexVariable); - codeStream.load(this.maxVariable); - codeStream.if_icmplt(actionLabel); + if (generateActionBlock) { + codeStream.load(this.indexVariable); + codeStream.load(this.maxVariable); + codeStream.if_icmplt(actionLabel); + } break; case RAW_ITERABLE : case GENERIC_ITERABLE :