in application/org.openjdk.jmc.joverflow/src/main/java/org/openjdk/jmc/joverflow/heap/parser/HprofReader.java [891:976]
private int readArray(boolean isPrimitive) throws DumpCorruptedException, IOException {
long objOfsInFile = in.position();
long id = readID();
skipBytes(4); // StackTrace stackTrace = getStackTraceFromSerial(in.readInt());
int num = in.readInt();
int bytesRead = identifierSize + 8;
long arrayClassID;
if (isPrimitive) {
arrayClassID = in.readByte();
bytesRead++;
} else {
arrayClassID = readID();
bytesRead += identifierSize;
}
// Check for primitive arrays:
char primitiveSignature = 0x00;
int elSize = 0;
if (isPrimitive || version < VERSION_JDK12BETA4) {
switch ((int) arrayClassID) {
case T_BOOLEAN: {
primitiveSignature = 'Z';
elSize = 1;
break;
}
case T_CHAR: {
primitiveSignature = 'C';
elSize = 2;
break;
}
case T_FLOAT: {
primitiveSignature = 'F';
elSize = 4;
break;
}
case T_DOUBLE: {
primitiveSignature = 'D';
elSize = 8;
break;
}
case T_BYTE: {
primitiveSignature = 'B';
elSize = 1;
break;
}
case T_SHORT: {
primitiveSignature = 'S';
elSize = 2;
break;
}
case T_INT: {
primitiveSignature = 'I';
elSize = 4;
break;
}
case T_LONG: {
primitiveSignature = 'J';
elSize = 8;
break;
}
}
if (version >= VERSION_JDK12BETA4 && primitiveSignature == 0x00) {
throw new DumpCorruptedException("unrecognized typecode: " + arrayClassID);
}
}
int dataSize = isPrimitive ? elSize * num : identifierSize * num;
if (in.position() + dataSize > fileSize) {
throw new DumpCorruptedException((isPrimitive ? "Primitive" : "Object") + " array at position "
+ in.position() + " is " + dataSize + " bytes long, that does not fit into the dump file");
}
bytesRead += dataSize;
skipBytes(dataSize);
if (isPrimitive) {
snpBuilder.addJavaValueArray(id, primitiveSignature, objOfsInFile, num, dataSize);
} else {
snpBuilder.addJavaObjectArray(id, arrayClassID, objOfsInFile, num, dataSize);
}
if (longFile) {
handlePossibleBBBorder(objOfsInFile);
}
return bytesRead;
}