Index: compiler/org/eclipse/jdt/internal/compiler/codegen/Label.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/Label.java,v retrieving revision 1.34 diff -u -r1.34 Label.java --- compiler/org/eclipse/jdt/internal/compiler/codegen/Label.java 14 Oct 2005 22:43:00 -0000 1.34 +++ compiler/org/eclipse/jdt/internal/compiler/codegen/Label.java 3 Nov 2005 03:04:01 -0000 @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.codegen; +import java.util.Arrays; + import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; import org.eclipse.jdt.internal.compiler.problem.AbortMethod; @@ -48,22 +50,44 @@ if (forwardReferenceCount >= (length = forwardReferences.length)) System.arraycopy(forwardReferences, 0, (forwardReferences = new int[2*length]), 0, length); forwardReferences[forwardReferenceCount++] = iPos; + Arrays.sort(this.forwardReferences, 0, this.forwardReferenceCount); } /** - * Add a forward refrence for the array. + * Add a forward reference for the array. */ public void appendForwardReferencesFrom(Label otherLabel) { int otherCount = otherLabel.forwardReferenceCount; if (otherCount == 0) return; - int length = forwardReferences.length; - int neededSpace = otherCount + forwardReferenceCount; - if (neededSpace >= length){ - System.arraycopy(forwardReferences, 0, (forwardReferences = new int[neededSpace]), 0, forwardReferenceCount); + // need to merge the two sorted arrays of forward references + int[] mergedForwardReferences = new int[this.forwardReferenceCount + otherCount]; + int indexInMerge = 0; + int j = 0; + int i = 0; + int max = this.forwardReferenceCount; + int max2 = otherLabel.forwardReferenceCount; + loop1 : for (; i < max; i++) { + int value1 = this.forwardReferences[i]; + loop2: for (; j < max2; j++) { + int value2 = otherLabel.forwardReferences[j]; + if (value1 < value2) { + mergedForwardReferences[indexInMerge++] = value1; + continue loop1; + } else if (value1 == value2) { + mergedForwardReferences[indexInMerge++] = value1; + j++; + continue loop1; + } else { + mergedForwardReferences[indexInMerge++] = value2; + } + } + } + for (; j < max2; j++) { + int value2 = otherLabel.forwardReferences[j]; + mergedForwardReferences[indexInMerge++] = value2; } - // append other forward references at the end, so they will get updated as well - System.arraycopy(otherLabel.forwardReferences, 0, forwardReferences, forwardReferenceCount, otherCount); - forwardReferenceCount = neededSpace; + this.forwardReferences = mergedForwardReferences; + this.forwardReferenceCount = indexInMerge; } /* @@ -172,7 +196,7 @@ codeStream.classFileOffset -= 3; forwardReferenceCount--; // also update the PCs in the related debug attributes - /** OLD CODE + /* OLD CODE int index = codeStream.pcToSourceMapSize - 1; while ((index >= 0) && (codeStream.pcToSourceMap[index][1] == oldPosition)) { codeStream.pcToSourceMap[index--][1] = position;