added java14 support

This commit is contained in:
Sander Hautvast 2020-07-17 17:33:44 +02:00
parent 0763ad1fd6
commit caf43cfb19
5 changed files with 76 additions and 62 deletions

View file

@ -19,8 +19,8 @@ public class ClassReader extends DataReader {
readConstantPool(in, builder); readConstantPool(in, builder);
skip(in, 6); // u2 access_flags, u2 this_class, u2 super_class skip(in, 6); // u2 access_flags, u2 this_class, u2 super_class
int interfacesCount = readUnsignedShort(in); int interfacesCount = readU16(in);
skip(in, interfacesCount * 2); // interfaces[] skip(in, interfacesCount * 2); // interfaces[u2;]
readFields(in, builder); readFields(in, builder);
readMethods(in, builder); readMethods(in, builder);
@ -29,7 +29,7 @@ public class ClassReader extends DataReader {
} }
private <T> void readConstantPool(DataInputStream in, ClassObject.Builder<T> builder) { private <T> void readConstantPool(DataInputStream in, ClassObject.Builder<T> builder) {
int constantPoolCount = readUnsignedShort(in); int constantPoolCount = readU16(in);
builder.constantPoolCount(constantPoolCount); builder.constantPoolCount(constantPoolCount);
for (int i = 1; i < constantPoolCount; i++) { for (int i = 1; i < constantPoolCount; i++) {
builder.constantPoolEntry(readConstantPoolEntry(in)); builder.constantPoolEntry(readConstantPoolEntry(in));
@ -37,7 +37,7 @@ public class ClassReader extends DataReader {
} }
private <T> void readFields(DataInputStream in, ClassObject.Builder<T> builder) { private <T> void readFields(DataInputStream in, ClassObject.Builder<T> builder) {
int fieldInfoCount = readUnsignedShort(in); int fieldInfoCount = readU16(in);
builder.fieldInfoCount(fieldInfoCount); builder.fieldInfoCount(fieldInfoCount);
for (int i = 0; i < fieldInfoCount; i++) { for (int i = 0; i < fieldInfoCount; i++) {
builder.fieldInfo(readField(in)); builder.fieldInfo(readField(in));
@ -45,7 +45,7 @@ public class ClassReader extends DataReader {
} }
private <T> void readMethods(DataInputStream in, ClassObject.Builder<T> builder) { private <T> void readMethods(DataInputStream in, ClassObject.Builder<T> builder) {
int methodInfoCount = readUnsignedShort(in); int methodInfoCount = readU16(in);
builder.methodInfoCount(methodInfoCount); builder.methodInfoCount(methodInfoCount);
for (int i = 0; i < methodInfoCount; i++) { for (int i = 0; i < methodInfoCount; i++) {
builder.methodInfo(readMethod(in)); builder.methodInfo(readMethod(in));
@ -53,7 +53,7 @@ public class ClassReader extends DataReader {
} }
private <T> Info readField(DataInputStream in) { private <T> Info readField(DataInputStream in) {
Info fieldInfo = new Info(readUnsignedShort(in), readUnsignedShort(in), readUnsignedShort(in), readUnsignedShort(in)); Info fieldInfo = new Info(readU16(in), readU16(in), readU16(in), readU16(in));
for (int i = 0; i < fieldInfo.getAttributesCount(); i++) { for (int i = 0; i < fieldInfo.getAttributesCount(); i++) {
fieldInfo.add(readAttribute(in)); fieldInfo.add(readAttribute(in));
} }
@ -62,7 +62,7 @@ public class ClassReader extends DataReader {
} }
private <T> Info readMethod(DataInputStream in) { private <T> Info readMethod(DataInputStream in) {
Info methodInfo = new Info(readUnsignedShort(in), readUnsignedShort(in), readUnsignedShort(in), readUnsignedShort(in)); Info methodInfo = new Info(readU16(in), readU16(in), readU16(in), readU16(in));
for (int i = 0; i < methodInfo.getAttributesCount(); i++) { for (int i = 0; i < methodInfo.getAttributesCount(); i++) {
methodInfo.add(readAttribute(in)); methodInfo.add(readAttribute(in));
} }
@ -71,8 +71,8 @@ public class ClassReader extends DataReader {
} }
private AttributeInfo readAttribute(DataInputStream in) { private AttributeInfo readAttribute(DataInputStream in) {
int attributeNameIndex = readUnsignedShort(in); int attributeNameIndex = readU16(in);
int attributeLength = readInt(in); int attributeLength = readS32(in);
byte[] info; byte[] info;
if (attributeLength > 0) { if (attributeLength > 0) {
info = new byte[attributeLength]; info = new byte[attributeLength];
@ -92,19 +92,21 @@ public class ClassReader extends DataReader {
switch (tag) { switch (tag) {
case 1: return readUtf8Entry(in); case 1: return readUtf8Entry(in);
case 2: throw new IllegalStateException("2: invalid classpool tag"); case 2: throw new IllegalStateException("2: invalid classpool tag");
case 3: return new IntEntry(readInt(in)); case 3: return new IntEntry(readS32(in));
case 4: return new FloatEntry(readFloat(in)); case 4: return new FloatEntry(readF32(in));
case 5: return new LongEntry(readLong(in)); case 5: return new LongEntry(readS64(in));
case 6: return new DoubleEntry(readDouble(in)); case 6: return new DoubleEntry(readF64(in));
case 7: return new ClassEntry(readUnsignedShort(in)); case 7: return new ClassEntry(readU16(in));
case 8: return new StringEntry(readUnsignedShort(in)); case 8: return new StringEntry(readU16(in));
case 9: return new FieldRefEntry(readShort(in), readShort(in)); case 9: return new FieldRefEntry(readU16(in), readU16(in));
case 10: return new MethodRefEntry(readUnsignedShort(in), readUnsignedShort(in)); case 10: return new MethodRefEntry(readU16(in), readU16(in));
case 11: return new InterfaceMethodRefEntry(readUnsignedShort(in), readUnsignedShort(in)); case 11: return new InterfaceMethodRefEntry(readU16(in), readU16(in));
case 12: return new NameAndTypeEntry(readUnsignedShort(in), readUnsignedShort(in)); case 12: return new NameAndTypeEntry(readU16(in), readU16(in));
case 15: return new MethodHandleEntry(readUnsignedShort(in), readUnsignedShort(in)); case 15: return new MethodHandleEntry(readU16(in), readU16(in));
case 16: return new MethodTypeEntry(readUnsignedShort(in)); case 16: return new MethodTypeEntry(readU16(in));
case 18: return new InvokeDynamicEntry(readUnsignedShort(in), readUnsignedShort(in)); case 18: return new InvokeDynamicEntry(readU16(in), readU16(in));
case 19: return new ModuleEntry(readU16(in));
case 20: return new PackageEntry(readU16(in));
default: throw new IllegalStateException("invalid classpool"); default: throw new IllegalStateException("invalid classpool");
} }
} }

View file

@ -9,29 +9,7 @@ import java.nio.charset.StandardCharsets;
public class DataReader { public class DataReader {
protected float readFloat(DataInputStream in) { protected long readS64(DataInputStream in) {
try {
return in.readFloat();
} catch (IOException e) {
throw new RuntimeException();
}
}
protected Utf8Entry readUtf8Entry(DataInputStream in) {
short length = readShort(in);
return new Utf8Entry(readString(in, length));
}
protected String readString(DataInputStream in, short length) {
try {
byte[] bytes = in.readNBytes(length);
return new String(bytes, StandardCharsets.UTF_8);
} catch (IOException e) {
throw new RuntimeException();
}
}
protected long readLong(DataInputStream in) {
try { try {
return in.readLong(); return in.readLong();
} catch (IOException e) { } catch (IOException e) {
@ -39,7 +17,15 @@ public class DataReader {
} }
} }
protected double readDouble(DataInputStream in) { protected float readF32(DataInputStream in) {
try {
return in.readFloat();
} catch (IOException e) {
throw new RuntimeException();
}
}
protected double readF64(DataInputStream in) {
try { try {
return in.readDouble(); return in.readDouble();
} catch (IOException e) { } catch (IOException e) {
@ -47,15 +33,7 @@ public class DataReader {
} }
} }
protected short readShort(DataInputStream in) { protected int readU16(DataInputStream in) {
try {
return in.readShort();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
protected int readUnsignedShort(DataInputStream in) {
try { try {
return in.readUnsignedShort(); return in.readUnsignedShort();
} catch (IOException e) { } catch (IOException e) {
@ -63,7 +41,7 @@ public class DataReader {
} }
} }
protected int readInt(DataInputStream in) { protected int readS32(DataInputStream in) {
try { try {
return in.readInt(); return in.readInt();
} catch (IOException e) { } catch (IOException e) {
@ -71,6 +49,20 @@ public class DataReader {
} }
} }
protected Utf8Entry readUtf8Entry(DataInputStream in) {
int length = readU16(in);
return new Utf8Entry(readString(in, length));
}
protected String readString(DataInputStream in, int length) {
try {
byte[] bytes = in.readNBytes(length);
return new String(bytes, StandardCharsets.UTF_8);
} catch (IOException e) {
throw new RuntimeException();
}
}
protected byte readByte(DataInputStream in) { protected byte readByte(DataInputStream in) {
try { try {
return in.readByte(); return in.readByte();

View file

@ -1,19 +1,19 @@
package nl.sander.jsontoy2.java.constantpool; package nl.sander.jsontoy2.java.constantpool;
public class FieldRefEntry extends ConstantPoolEntry { public class FieldRefEntry extends ConstantPoolEntry {
private final short classIndex; private final int classIndex;
private final short nameAndTypeIndex; private final int nameAndTypeIndex;
public FieldRefEntry(short classIndex, short nameAndTypeIndex) { public FieldRefEntry(int classIndex, int nameAndTypeIndex) {
this.classIndex = classIndex; this.classIndex = classIndex;
this.nameAndTypeIndex = nameAndTypeIndex; this.nameAndTypeIndex = nameAndTypeIndex;
} }
public short getClassIndex() { public int getClassIndex() {
return classIndex; return classIndex;
} }
public short getNameAndTypeIndex() { public int getNameAndTypeIndex() {
return nameAndTypeIndex; return nameAndTypeIndex;
} }

View file

@ -0,0 +1,11 @@
package nl.sander.jsontoy2.java.constantpool;
import nl.sander.jsontoy2.java.constantpool.ConstantPoolEntry;
public class ModuleEntry extends ConstantPoolEntry {
private final int nameIndex;
public ModuleEntry(int nameIndex) {
this.nameIndex = nameIndex;
}
}

View file

@ -0,0 +1,9 @@
package nl.sander.jsontoy2.java.constantpool;
public class PackageEntry extends ConstantPoolEntry {
private final int nameIndex;
public PackageEntry(int nameIndex) {
this.nameIndex = nameIndex;
}
}