SUGGESTED FIX
A possible fix:
diff -r 2c89c0bc537e src/share/classes/com/sun/tools/javac/parser/Parser.java
--- a/src/share/classes/com/sun/tools/javac/parser/Parser.java Mon Jan 21 22:20:41 2008 +0100
+++ b/src/share/classes/com/sun/tools/javac/parser/Parser.java Wed Jan 23 11:24:20 2008 +0100
@@ -721,6 +721,8 @@ public class Parser {
JCExpression term2Rest(JCExpression t, int minprec) {
List<JCExpression[]> savedOd = odStackSupply.elems;
JCExpression[] odStack = newOdStack();
+ List<int[]> savedPos = posStackSupply.elems;
+ int[] posStack = newPosStack();
List<Token[]> savedOp = opStackSupply.elems;
Token[] opStack = newOpStack();
// optimization, was odStack = new Tree[...]; opStack = new Tree[...];
@@ -735,8 +737,9 @@ public class Parser {
int pos = S.pos();
S.nextToken();
odStack[top] = topOp == INSTANCEOF ? type() : term3();
+ posStack[top - 1] = pos;
while (top > 0 && prec(topOp) >= prec(S.token())) {
- odStack[top-1] = makeOp(pos, topOp, odStack[top-1],
+ odStack[top-1] = makeOp(posStack[top - 1], topOp, odStack[top-1],
odStack[top]);
top--;
topOp = opStack[top];
@@ -753,6 +756,7 @@ public class Parser {
}
odStackSupply.elems = savedOd; // optimization
+ posStackSupply.elems = savedPos; // optimization
opStackSupply.elems = savedOp; // optimization
return t;
}
@@ -806,6 +810,7 @@ public class Parser {
* for every binary operation, we use supplys.
*/
ListBuffer<JCExpression[]> odStackSupply = new ListBuffer<JCExpression[]>();
+ ListBuffer<int[]> posStackSupply = new ListBuffer<int[]>();
ListBuffer<Token[]> opStackSupply = new ListBuffer<Token[]>();
private JCExpression[] newOdStack() {
@@ -816,6 +821,14 @@ public class Parser {
return odStack;
}
+ private int[] newPosStack() {
+ if (posStackSupply.elems == posStackSupply.last)
+ posStackSupply.append(new int[infixPrecedenceLevels + 1]);
+ int[] posStack = posStackSupply.elems.head;
+ posStackSupply.elems = posStackSupply.elems.tail;
+ return posStack;
+ }
+
private Token[] newOpStack() {
if (opStackSupply.elems == opStackSupply.last)
opStackSupply.append(new Token[infixPrecedenceLevels + 1]);
|