diff -r b402b93cbe38 -r 3f3cc8d3f13c src/share/classes/com/sun/tools/javac/parser/JavacParser.java --- a/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Mon Apr 08 11:54:26 2013 -0700 +++ b/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Mon Apr 08 11:57:37 2013 -0700 @@ -171,8 +171,8 @@ protected AbstractEndPosTable newEndPosTable(boolean keepEndPositions) { return keepEndPositions - ? new SimpleEndPosTable() - : new EmptyEndPosTable(); + ? new SimpleEndPosTable(this) + : new EmptyEndPosTable(this); } protected DocCommentTable newDocCommentTable(boolean keepDocComments, ParserFactory fac) { @@ -3088,6 +3088,7 @@ toplevel.docComments = docComments; if (keepLineMap) toplevel.lineMap = S.getLineMap(); + this.endPosTable.setParser(null); // remove reference to parser toplevel.endPositions = this.endPosTable; return toplevel; } @@ -4003,11 +4004,12 @@ /* * a functional source tree and end position mappings */ - protected class SimpleEndPosTable extends AbstractEndPosTable { + protected static class SimpleEndPosTable extends AbstractEndPosTable { private final Map endPosMap; - SimpleEndPosTable() { + SimpleEndPosTable(JavacParser parser) { + super(parser); endPosMap = new HashMap(); } @@ -4016,12 +4018,12 @@ } protected T to(T t) { - storeEnd(t, token.endPos); + storeEnd(t, parser.token.endPos); return t; } protected T toP(T t) { - storeEnd(t, S.prevToken().endPos); + storeEnd(t, parser.S.prevToken().endPos); return t; } @@ -4043,7 +4045,11 @@ /* * a default skeletal implementation without any mapping overhead. */ - protected class EmptyEndPosTable extends AbstractEndPosTable { + protected static class EmptyEndPosTable extends AbstractEndPosTable { + + EmptyEndPosTable(JavacParser parser) { + super(parser); + } protected void storeEnd(JCTree tree, int endpos) { /* empty */ } @@ -4065,13 +4071,21 @@ } - protected abstract class AbstractEndPosTable implements EndPosTable { + protected static abstract class AbstractEndPosTable implements EndPosTable { + /** + * The current parser. + */ + protected JavacParser parser; /** * Store the last error position. */ protected int errorEndPos; + public AbstractEndPosTable(JavacParser parser) { + this.parser = parser; + } + /** * Store ending position for a tree, the value of which is the greater * of last error position and the given ending position. @@ -4106,5 +4120,9 @@ errorEndPos = errPos; } } + + protected void setParser(JavacParser parser) { + this.parser = parser; + } } }