in src/main/java/com/amazon/corretto/hotpatch/org/objectweb/asm/ClassReader.java [3273:3356]
private int readStackMapFrame(
final int stackMapFrameOffset,
final boolean compressed,
final boolean expand,
final Context context) {
int currentOffset = stackMapFrameOffset;
final char[] charBuffer = context.charBuffer;
final Label[] labels = context.currentMethodLabels;
int frameType;
if (compressed) {
// Read the frame_type field.
frameType = classFileBuffer[currentOffset++] & 0xFF;
} else {
frameType = Frame.FULL_FRAME;
context.currentFrameOffset = -1;
}
int offsetDelta;
context.currentFrameLocalCountDelta = 0;
if (frameType < Frame.SAME_LOCALS_1_STACK_ITEM_FRAME) {
offsetDelta = frameType;
context.currentFrameType = Opcodes.F_SAME;
context.currentFrameStackCount = 0;
} else if (frameType < Frame.RESERVED) {
offsetDelta = frameType - Frame.SAME_LOCALS_1_STACK_ITEM_FRAME;
currentOffset =
readVerificationTypeInfo(
currentOffset, context.currentFrameStackTypes, 0, charBuffer, labels);
context.currentFrameType = Opcodes.F_SAME1;
context.currentFrameStackCount = 1;
} else if (frameType >= Frame.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) {
offsetDelta = readUnsignedShort(currentOffset);
currentOffset += 2;
if (frameType == Frame.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) {
currentOffset =
readVerificationTypeInfo(
currentOffset, context.currentFrameStackTypes, 0, charBuffer, labels);
context.currentFrameType = Opcodes.F_SAME1;
context.currentFrameStackCount = 1;
} else if (frameType >= Frame.CHOP_FRAME && frameType < Frame.SAME_FRAME_EXTENDED) {
context.currentFrameType = Opcodes.F_CHOP;
context.currentFrameLocalCountDelta = Frame.SAME_FRAME_EXTENDED - frameType;
context.currentFrameLocalCount -= context.currentFrameLocalCountDelta;
context.currentFrameStackCount = 0;
} else if (frameType == Frame.SAME_FRAME_EXTENDED) {
context.currentFrameType = Opcodes.F_SAME;
context.currentFrameStackCount = 0;
} else if (frameType < Frame.FULL_FRAME) {
int local = expand ? context.currentFrameLocalCount : 0;
for (int k = frameType - Frame.SAME_FRAME_EXTENDED; k > 0; k--) {
currentOffset =
readVerificationTypeInfo(
currentOffset, context.currentFrameLocalTypes, local++, charBuffer, labels);
}
context.currentFrameType = Opcodes.F_APPEND;
context.currentFrameLocalCountDelta = frameType - Frame.SAME_FRAME_EXTENDED;
context.currentFrameLocalCount += context.currentFrameLocalCountDelta;
context.currentFrameStackCount = 0;
} else {
final int numberOfLocals = readUnsignedShort(currentOffset);
currentOffset += 2;
context.currentFrameType = Opcodes.F_FULL;
context.currentFrameLocalCountDelta = numberOfLocals;
context.currentFrameLocalCount = numberOfLocals;
for (int local = 0; local < numberOfLocals; ++local) {
currentOffset =
readVerificationTypeInfo(
currentOffset, context.currentFrameLocalTypes, local, charBuffer, labels);
}
final int numberOfStackItems = readUnsignedShort(currentOffset);
currentOffset += 2;
context.currentFrameStackCount = numberOfStackItems;
for (int stack = 0; stack < numberOfStackItems; ++stack) {
currentOffset =
readVerificationTypeInfo(
currentOffset, context.currentFrameStackTypes, stack, charBuffer, labels);
}
}
} else {
throw new IllegalArgumentException();
}
context.currentFrameOffset += offsetDelta + 1;
createLabel(context.currentFrameOffset, labels);
return currentOffset;
}