diff -r ca063536e4a6 -r 03944ee4fac4 src/share/classes/com/sun/tools/javac/jvm/Gen.java --- a/src/share/classes/com/sun/tools/javac/jvm/Gen.java Fri Jun 26 12:22:40 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/jvm/Gen.java Fri Jun 26 18:51:39 2009 -0700 @@ -26,6 +26,8 @@ package com.sun.tools.javac.jvm; import java.util.*; +import javax.lang.model.element.ElementKind; + import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import com.sun.tools.javac.util.List; @@ -939,7 +941,6 @@ startpcCrt, code.curPc()); - // End the scope of all local variables in variable info. code.endScopes(0); // If we exceeded limits, panic @@ -1439,7 +1440,6 @@ // Resolve all breaks. code.resolve(exitChain); - // End the scopes of all try-local variables in variable info. code.endScopes(limit); } @@ -1672,6 +1672,7 @@ *************************************************************************/ public void visitApply(JCMethodInvocation tree) { + setTypeAnnotationPositions(tree.pos); // Generate code for method. Item m = genExpr(tree.meth, methodType); // Generate code for all arguments, where the expected types are @@ -1707,10 +1708,45 @@ result = items.makeStackItem(pt); } + private void setTypeAnnotationPositions(int treePos) { + MethodSymbol meth = code.meth; + + for (Attribute.TypeCompound ta : meth.typeAnnotations) { + if (ta.position.pos == treePos) { + ta.position.offset = code.cp; + ta.position.lvarOffset[0] = code.cp; + } + } + + if (code.meth.getKind() != ElementKind.CONSTRUCTOR + && code.meth.getKind() != ElementKind.STATIC_INIT) + return; + + for (Attribute.TypeCompound ta : meth.owner.typeAnnotations) { + if (ta.position.pos == treePos) { + ta.position.offset = code.cp; + ta.position.lvarOffset[0] = code.cp; + } + } + + ClassSymbol clazz = meth.enclClass(); + for (Symbol s : new com.sun.tools.javac.model.FilteredMemberList(clazz.members())) { + if (!s.getKind().isField()) + continue; + for (Attribute.TypeCompound ta : s.typeAnnotations) { + if (ta.position.pos == treePos) { + ta.position.offset = code.cp; + ta.position.lvarOffset[0] = code.cp; + } + } + } + } + public void visitNewClass(JCNewClass tree) { // Enclosing instances or anonymous classes should have been eliminated // by now. assert tree.encl == null && tree.def == null; + setTypeAnnotationPositions(tree.pos); code.emitop2(new_, makeRef(tree.pos(), tree.type)); code.emitop0(dup); @@ -1725,6 +1761,8 @@ } public void visitNewArray(JCNewArray tree) { + setTypeAnnotationPositions(tree.pos); + if (tree.elems != null) { Type elemtype = types.elemtype(tree.type); loadIntConst(tree.elems.length()); @@ -2053,6 +2091,7 @@ } public void visitTypeCast(JCTypeCast tree) { + setTypeAnnotationPositions(tree.pos); result = genExpr(tree.expr, tree.clazz.type).load(); // Additional code is only needed if we cast to a reference type // which is not statically a supertype of the expression's type. @@ -2069,6 +2108,8 @@ } public void visitTypeTest(JCInstanceOf tree) { + setTypeAnnotationPositions(tree.pos); + genExpr(tree.expr, tree.expr.type).load(); code.emitop2(instanceof_, makeRef(tree.pos(), tree.clazz.type)); result = items.makeStackItem(syms.booleanType); @@ -2110,6 +2151,7 @@ if (tree.name == names._class) { assert target.hasClassLiterals(); + setTypeAnnotationPositions(tree.pos); code.emitop2(ldc2, makeRef(tree.pos(), tree.selected.type)); result = items.makeStackItem(pt); return;