Invalid reordering in ClassReader
Werner Dietl
wdietl at gmail.com
Fri Feb 7 16:30:22 PST 2014
This changeset:
http://hg.openjdk.java.net/jdk9/dev/langtools/rev/d607ae60772d
contains a re-ordering of how the bytecode is read.
--- a/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Sun
Feb 02 12:12:01 2014 +0100
+++ b/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Mon
Feb 03 17:19:15 2014 -0500
// local variable
- case LOCAL_VARIABLE:
- // resource variable
- case RESOURCE_VARIABLE:
- int table_length = nextChar();
+ case LOCAL_VARIABLE: {
+ final int table_length = nextChar();
+ final TypeAnnotationPosition position =
+ TypeAnnotationPosition.localVariable(readTypePath());
+
position.lvarOffset = new int[table_length];
position.lvarLength = new int[table_length];
position.lvarIndex = new int[table_length];
@@ -1498,67 +1518,142 @@ public class ClassReader {
position.lvarLength[i] = nextChar();
position.lvarIndex[i] = nextChar();
}
- break;
+ return position;
+ }
The code now reads the TypePath before the local variable information.
This breaks the order in which the ClassWriter writes this information.
This results in a ClassCastException in unrelated code, because the
ClassReader gets confused about the class file.
In type-annotations, I changed the code back:
http://hg.openjdk.java.net/type-annotations/type-annotations/langtools/rev/7e9c983565ac
and this resolves these exceptions.
Is there a reason for this change? I think the previous implementation
did the right ordering according to the spec.
cu, WMD.
--
http://www.google.com/profiles/wdietl
More information about the type-annotations-dev
mailing list