Upgrade to ASM master (including early support for Java 23 bytecode)

Closes gh-31929
This commit is contained in:
Juergen Hoeller 2023-12-31 13:29:50 +01:00
parent 243ec88e95
commit 174eae377f
6 changed files with 66 additions and 68 deletions

View File

@ -144,7 +144,7 @@ final class AnnotationWriter extends AnnotationVisitor {
// Write type_index and reserve space for num_element_value_pairs.
annotation.putShort(symbolTable.addConstantUtf8(descriptor)).putShort(0);
return new AnnotationWriter(
symbolTable, /* useNamedValues = */ true, annotation, previousAnnotation);
symbolTable, /* useNamedValues= */ true, annotation, previousAnnotation);
}
/**
@ -179,7 +179,7 @@ final class AnnotationWriter extends AnnotationVisitor {
// Write type_index and reserve space for num_element_value_pairs.
typeAnnotation.putShort(symbolTable.addConstantUtf8(descriptor)).putShort(0);
return new AnnotationWriter(
symbolTable, /* useNamedValues = */ true, typeAnnotation, previousAnnotation);
symbolTable, /* useNamedValues= */ true, typeAnnotation, previousAnnotation);
}
// -----------------------------------------------------------------------------------------------
@ -284,7 +284,7 @@ final class AnnotationWriter extends AnnotationVisitor {
}
// Write tag and type_index, and reserve 2 bytes for num_element_value_pairs.
annotation.put12('@', symbolTable.addConstantUtf8(descriptor)).putShort(0);
return new AnnotationWriter(symbolTable, /* useNamedValues = */ true, annotation, null);
return new AnnotationWriter(symbolTable, /* useNamedValues= */ true, annotation, null);
}
@Override
@ -303,7 +303,7 @@ final class AnnotationWriter extends AnnotationVisitor {
// visit the array elements. Its num_element_value_pairs will correspond to the number of array
// elements and will be stored in what is in fact num_values.
annotation.put12('[', 0);
return new AnnotationWriter(symbolTable, /* useNamedValues = */ false, annotation, null);
return new AnnotationWriter(symbolTable, /* useNamedValues= */ false, annotation, null);
}
@Override

View File

@ -177,7 +177,7 @@ public class ClassReader {
final byte[] classFileBuffer,
final int classFileOffset,
final int classFileLength) { // NOPMD(UnusedFormalParameter) used for backward compatibility.
this(classFileBuffer, classFileOffset, /* checkClassVersion = */ true);
this(classFileBuffer, classFileOffset, /* checkClassVersion= */ true);
}
/**
@ -194,7 +194,7 @@ public class ClassReader {
this.b = classFileBuffer;
// Check the class' major_version. This field is after the magic and minor_version fields, which
// use 4 and 2 bytes respectively.
if (checkClassVersion && readShort(classFileOffset + 6) > Opcodes.V22) {
if (checkClassVersion && readShort(classFileOffset + 6) > Opcodes.V23) {
throw new IllegalArgumentException(
"Unsupported class file major version " + readShort(classFileOffset + 6));
}
@ -608,9 +608,9 @@ public class ClassReader {
// Parse num_element_value_pairs and element_value_pairs and visit these values.
currentAnnotationOffset =
readElementValues(
classVisitor.visitAnnotation(annotationDescriptor, /* visible = */ true),
classVisitor.visitAnnotation(annotationDescriptor, /* visible= */ true),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -626,9 +626,9 @@ public class ClassReader {
// Parse num_element_value_pairs and element_value_pairs and visit these values.
currentAnnotationOffset =
readElementValues(
classVisitor.visitAnnotation(annotationDescriptor, /* visible = */ false),
classVisitor.visitAnnotation(annotationDescriptor, /* visible= */ false),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -650,9 +650,9 @@ public class ClassReader {
context.currentTypeAnnotationTarget,
context.currentTypeAnnotationTargetPath,
annotationDescriptor,
/* visible = */ true),
/* visible= */ true),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -674,9 +674,9 @@ public class ClassReader {
context.currentTypeAnnotationTarget,
context.currentTypeAnnotationTargetPath,
annotationDescriptor,
/* visible = */ false),
/* visible= */ false),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -968,9 +968,9 @@ public class ClassReader {
// Parse num_element_value_pairs and element_value_pairs and visit these values.
currentAnnotationOffset =
readElementValues(
recordComponentVisitor.visitAnnotation(annotationDescriptor, /* visible = */ true),
recordComponentVisitor.visitAnnotation(annotationDescriptor, /* visible= */ true),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -986,9 +986,9 @@ public class ClassReader {
// Parse num_element_value_pairs and element_value_pairs and visit these values.
currentAnnotationOffset =
readElementValues(
recordComponentVisitor.visitAnnotation(annotationDescriptor, /* visible = */ false),
recordComponentVisitor.visitAnnotation(annotationDescriptor, /* visible= */ false),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -1010,9 +1010,9 @@ public class ClassReader {
context.currentTypeAnnotationTarget,
context.currentTypeAnnotationTargetPath,
annotationDescriptor,
/* visible = */ true),
/* visible= */ true),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -1034,9 +1034,9 @@ public class ClassReader {
context.currentTypeAnnotationTarget,
context.currentTypeAnnotationTargetPath,
annotationDescriptor,
/* visible = */ false),
/* visible= */ false),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -1152,9 +1152,9 @@ public class ClassReader {
// Parse num_element_value_pairs and element_value_pairs and visit these values.
currentAnnotationOffset =
readElementValues(
fieldVisitor.visitAnnotation(annotationDescriptor, /* visible = */ true),
fieldVisitor.visitAnnotation(annotationDescriptor, /* visible= */ true),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -1170,9 +1170,9 @@ public class ClassReader {
// Parse num_element_value_pairs and element_value_pairs and visit these values.
currentAnnotationOffset =
readElementValues(
fieldVisitor.visitAnnotation(annotationDescriptor, /* visible = */ false),
fieldVisitor.visitAnnotation(annotationDescriptor, /* visible= */ false),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -1194,9 +1194,9 @@ public class ClassReader {
context.currentTypeAnnotationTarget,
context.currentTypeAnnotationTargetPath,
annotationDescriptor,
/* visible = */ true),
/* visible= */ true),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -1218,9 +1218,9 @@ public class ClassReader {
context.currentTypeAnnotationTarget,
context.currentTypeAnnotationTargetPath,
annotationDescriptor,
/* visible = */ false),
/* visible= */ false),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -1413,9 +1413,9 @@ public class ClassReader {
// Parse num_element_value_pairs and element_value_pairs and visit these values.
currentAnnotationOffset =
readElementValues(
methodVisitor.visitAnnotation(annotationDescriptor, /* visible = */ true),
methodVisitor.visitAnnotation(annotationDescriptor, /* visible= */ true),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -1431,9 +1431,9 @@ public class ClassReader {
// Parse num_element_value_pairs and element_value_pairs and visit these values.
currentAnnotationOffset =
readElementValues(
methodVisitor.visitAnnotation(annotationDescriptor, /* visible = */ false),
methodVisitor.visitAnnotation(annotationDescriptor, /* visible= */ false),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -1455,9 +1455,9 @@ public class ClassReader {
context.currentTypeAnnotationTarget,
context.currentTypeAnnotationTargetPath,
annotationDescriptor,
/* visible = */ true),
/* visible= */ true),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -1479,9 +1479,9 @@ public class ClassReader {
context.currentTypeAnnotationTarget,
context.currentTypeAnnotationTargetPath,
annotationDescriptor,
/* visible = */ false),
/* visible= */ false),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -1489,16 +1489,13 @@ public class ClassReader {
// Visit the RuntimeVisibleParameterAnnotations attribute.
if (runtimeVisibleParameterAnnotationsOffset != 0) {
readParameterAnnotations(
methodVisitor, context, runtimeVisibleParameterAnnotationsOffset, /* visible = */ true);
methodVisitor, context, runtimeVisibleParameterAnnotationsOffset, /* visible= */ true);
}
// Visit the RuntimeInvisibleParameterAnnotations attribute.
if (runtimeInvisibleParameterAnnotationsOffset != 0) {
readParameterAnnotations(
methodVisitor,
context,
runtimeInvisibleParameterAnnotationsOffset,
/* visible = */ false);
methodVisitor, context, runtimeInvisibleParameterAnnotationsOffset, /* visible= */ false);
}
// Visit the non standard attributes.
@ -1927,7 +1924,7 @@ public class ClassReader {
}
} else if (Constants.RUNTIME_VISIBLE_TYPE_ANNOTATIONS.equals(attributeName)) {
visibleTypeAnnotationOffsets =
readTypeAnnotations(methodVisitor, context, currentOffset, /* visible = */ true);
readTypeAnnotations(methodVisitor, context, currentOffset, /* visible= */ true);
// Here we do not extract the labels corresponding to the attribute content. This would
// require a full parsing of the attribute, which would need to be repeated when parsing
// the bytecode instructions (see below). Instead, the content of the attribute is read one
@ -1936,7 +1933,7 @@ public class ClassReader {
// time. This assumes that type annotations are ordered by increasing bytecode offset.
} else if (Constants.RUNTIME_INVISIBLE_TYPE_ANNOTATIONS.equals(attributeName)) {
invisibleTypeAnnotationOffsets =
readTypeAnnotations(methodVisitor, context, currentOffset, /* visible = */ false);
readTypeAnnotations(methodVisitor, context, currentOffset, /* visible= */ false);
// Same comment as above for the RuntimeVisibleTypeAnnotations attribute.
} else if (Constants.STACK_MAP_TABLE.equals(attributeName)) {
if ((context.parsingOptions & SKIP_FRAMES) == 0) {
@ -2518,9 +2515,9 @@ public class ClassReader {
context.currentTypeAnnotationTarget,
context.currentTypeAnnotationTargetPath,
annotationDescriptor,
/* visible = */ true),
/* visible= */ true),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
currentVisibleTypeAnnotationBytecodeOffset =
@ -2546,9 +2543,9 @@ public class ClassReader {
context.currentTypeAnnotationTarget,
context.currentTypeAnnotationTargetPath,
annotationDescriptor,
/* visible = */ false),
/* visible= */ false),
currentAnnotationOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
currentInvisibleTypeAnnotationBytecodeOffset =
@ -2619,9 +2616,9 @@ public class ClassReader {
context.currentLocalVariableAnnotationRangeEnds,
context.currentLocalVariableAnnotationRangeIndices,
annotationDescriptor,
/* visible = */ true),
/* visible= */ true),
currentOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -2647,9 +2644,9 @@ public class ClassReader {
context.currentLocalVariableAnnotationRangeEnds,
context.currentLocalVariableAnnotationRangeIndices,
annotationDescriptor,
/* visible = */ false),
/* visible= */ false),
currentOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -2827,7 +2824,7 @@ public class ClassReader {
methodVisitor.visitTryCatchAnnotation(
targetType & 0xFFFFFF00, path, annotationDescriptor, visible),
currentOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
} else {
// We don't want to visit the other target_type annotations, so we just skip them (which
@ -2838,7 +2835,7 @@ public class ClassReader {
// with a null AnnotationVisitor).
currentOffset =
readElementValues(
/* annotationVisitor = */ null, currentOffset, /* named = */ true, charBuffer);
/* annotationVisitor= */ null, currentOffset, /* named= */ true, charBuffer);
}
}
return typeAnnotationsOffsets;
@ -2978,7 +2975,7 @@ public class ClassReader {
readElementValues(
methodVisitor.visitParameterAnnotation(i, annotationDescriptor, visible),
currentOffset,
/* named = */ true,
/* named= */ true,
charBuffer);
}
}
@ -3048,9 +3045,9 @@ public class ClassReader {
case 'e': // enum_const_value
return currentOffset + 5;
case '@': // annotation_value
return readElementValues(null, currentOffset + 3, /* named = */ true, charBuffer);
return readElementValues(null, currentOffset + 3, /* named= */ true, charBuffer);
case '[': // array_value
return readElementValues(null, currentOffset + 1, /* named = */ false, charBuffer);
return readElementValues(null, currentOffset + 1, /* named= */ false, charBuffer);
default:
return currentOffset + 3;
}
@ -3118,7 +3115,7 @@ public class ClassReader {
return readElementValues(
annotationVisitor.visitArray(elementName),
currentOffset - 2,
/* named = */ false,
/* named= */ false,
charBuffer);
}
switch (classFileBuffer[currentOffset] & 0xFF) {
@ -3195,7 +3192,7 @@ public class ClassReader {
readElementValues(
annotationVisitor.visitArray(elementName),
currentOffset - 2,
/* named = */ false,
/* named= */ false,
charBuffer);
break;
}

View File

@ -774,7 +774,7 @@ public class ClassWriter extends ClassVisitor {
lastRecordComponent = null;
firstAttribute = null;
compute = hasFrames ? MethodWriter.COMPUTE_INSERTED_FRAMES : MethodWriter.COMPUTE_NOTHING;
new ClassReader(classFile, 0, /* checkClassVersion = */ false)
new ClassReader(classFile, 0, /* checkClassVersion= */ false)
.accept(
this,
attributes,

View File

@ -651,7 +651,7 @@ final class MethodWriter extends MethodVisitor {
@Override
public AnnotationVisitor visitAnnotationDefault() {
defaultValue = new ByteVector();
return new AnnotationWriter(symbolTable, /* useNamedValues = */ false, defaultValue, null);
return new AnnotationWriter(symbolTable, /* useNamedValues= */ false, defaultValue, null);
}
@Override
@ -1519,14 +1519,14 @@ final class MethodWriter extends MethodVisitor {
return lastCodeRuntimeVisibleTypeAnnotation =
new AnnotationWriter(
symbolTable,
/* useNamedValues = */ true,
/* useNamedValues= */ true,
typeAnnotation,
lastCodeRuntimeVisibleTypeAnnotation);
} else {
return lastCodeRuntimeInvisibleTypeAnnotation =
new AnnotationWriter(
symbolTable,
/* useNamedValues = */ true,
/* useNamedValues= */ true,
typeAnnotation,
lastCodeRuntimeInvisibleTypeAnnotation);
}

View File

@ -287,6 +287,7 @@ public interface Opcodes {
int V20 = 0 << 16 | 64;
int V21 = 0 << 16 | 65;
int V22 = 0 << 16 | 66;
int V23 = 0 << 16 | 67;
/**
* Version flag indicating that the class is using 'preview' features.

View File

@ -1414,23 +1414,23 @@ final class SymbolTable {
}
Entry(final int index, final int tag, final String value, final int hashCode) {
super(index, tag, /* owner = */ null, /* name = */ null, value, /* data = */ 0);
super(index, tag, /* owner= */ null, /* name= */ null, value, /* data= */ 0);
this.hashCode = hashCode;
}
Entry(final int index, final int tag, final String value, final long data, final int hashCode) {
super(index, tag, /* owner = */ null, /* name = */ null, value, data);
super(index, tag, /* owner= */ null, /* name= */ null, value, data);
this.hashCode = hashCode;
}
Entry(
final int index, final int tag, final String name, final String value, final int hashCode) {
super(index, tag, /* owner = */ null, name, value, /* data = */ 0);
super(index, tag, /* owner= */ null, name, value, /* data= */ 0);
this.hashCode = hashCode;
}
Entry(final int index, final int tag, final long data, final int hashCode) {
super(index, tag, /* owner = */ null, /* name = */ null, /* value = */ null, data);
super(index, tag, /* owner= */ null, /* name= */ null, /* value= */ null, data);
this.hashCode = hashCode;
}
}