--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Tue May 14 13:55:35 2013 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Tue May 14 15:04:06 2013 -0700
@@ -1010,7 +1010,16 @@
state.pop(((Symbol)(pool.pool[od])).erasure(types));
break;
case new_:
- state.push(uninitializedObject(((Symbol)(pool.pool[od])).erasure(types), cp-3));
+ Symbol sym;
+ if (pool.pool[od] instanceof UniqueType) {
+ // Required by change in Gen.makeRef to allow
+ // annotated types.
+ // TODO: is this needed anywhere else?
+ sym = ((UniqueType)(pool.pool[od])).type.tsym;
+ } else {
+ sym = (Symbol)(pool.pool[od]);
+ }
+ state.push(uninitializedObject(sym.erasure(types), cp-3));
break;
case sipush:
state.push(syms.intType);
@@ -1972,25 +1981,38 @@
if (lv == null || lv.sym == null
|| lv.sym.annotations.isTypesEmpty()
|| !lv.sym.isExceptionParameter())
- return;
-
- int exidx = findExceptionIndex(lv);
+ continue;
for (Attribute.TypeCompound ta : lv.sym.getRawTypeAttributes()) {
TypeAnnotationPosition p = ta.position;
- p.exception_index = exidx;
+ // At this point p.type_index contains the catch type index.
+ // Use that index to determine the exception table index.
+ // We can afterwards discard the type_index.
+ // A TA position is shared for all type annotations in the
+ // same location; updating one is enough.
+ // Use -666 as a marker that the exception_index was already updated.
+ if (p.type_index != -666) {
+ p.exception_index = findExceptionIndex(p.type_index);
+ p.type_index = -666;
+ }
}
}
}
- private int findExceptionIndex(LocalVar lv) {
+ private int findExceptionIndex(int catchType) {
+ if (catchType == Integer.MIN_VALUE) {
+ // We didn't set the catch type index correctly.
+ // This shouldn't happen.
+ // TODO: issue error?
+ return -1;
+ }
List<char[]> iter = catchInfo.toList();
int len = catchInfo.length();
for (int i = 0; i < len; ++i) {
char[] catchEntry = iter.head;
iter = iter.tail;
- char handlerpc = catchEntry[2];
- if (lv.start_pc == handlerpc + 1) {
+ char ct = catchEntry[3];
+ if (catchType == ct) {
return i;
}
}