8341028: Do not use lambdas or method refs for verifyConstantPool

Reviewed-by: adinn, liach
This commit is contained in:
David M. Lloyd 2024-11-27 01:03:33 +00:00 committed by Chen Liang
parent 28c8729019
commit 08c1f44eef

View file

@ -34,10 +34,9 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.stream.Collectors;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.ToIntFunction; import java.util.function.ToIntFunction;
import java.util.stream.Collectors;
import jdk.internal.classfile.impl.BoundAttribute; import jdk.internal.classfile.impl.BoundAttribute;
import jdk.internal.classfile.impl.Util; import jdk.internal.classfile.impl.Util;
@ -65,48 +64,77 @@ public record ParserVerifier(ClassModel classModel) {
private void verifyConstantPool(List<VerifyError> errors) { private void verifyConstantPool(List<VerifyError> errors) {
for (var cpe : classModel.constantPool()) { for (var cpe : classModel.constantPool()) {
Consumer<Runnable> check = c -> {
try { try {
c.run(); switch (cpe) {
} catch (VerifyError|Exception e) { case DoubleEntry de -> de.doubleValue();
errors.add(new VerifyError("%s at constant pool index %d in %s".formatted(e.getMessage(), cpe.index(), toString(classModel)))); case FloatEntry fe -> fe.floatValue();
} case IntegerEntry ie -> ie.intValue();
}; case LongEntry le -> le.longValue();
check.accept(switch (cpe) { case Utf8Entry ue -> ue.stringValue();
case DoubleEntry de -> de::doubleValue; case ConstantDynamicEntry cde -> cde.asSymbol();
case FloatEntry fe -> fe::floatValue; case InvokeDynamicEntry ide -> ide.asSymbol();
case IntegerEntry ie -> ie::intValue; case ClassEntry ce -> ce.asSymbol();
case LongEntry le -> le::longValue; case StringEntry se -> se.stringValue();
case Utf8Entry ue -> ue::stringValue; case MethodHandleEntry mhe -> mhe.asSymbol();
case ConstantDynamicEntry cde -> cde::asSymbol; case MethodTypeEntry mte -> mte.asSymbol();
case InvokeDynamicEntry ide -> ide::asSymbol;
case ClassEntry ce -> ce::asSymbol;
case StringEntry se -> se::stringValue;
case MethodHandleEntry mhe -> mhe::asSymbol;
case MethodTypeEntry mte -> mte::asSymbol;
case FieldRefEntry fre -> { case FieldRefEntry fre -> {
check.accept(fre.owner()::asSymbol); try {
check.accept(fre::typeSymbol); fre.owner().asSymbol();
yield () -> verifyFieldName(fre.name().stringValue()); } catch (VerifyError|Exception e) {
errors.add(cpeVerifyError(cpe, e));
}
try {
fre.typeSymbol();
} catch (VerifyError|Exception e) {
errors.add(cpeVerifyError(cpe, e));
}
verifyFieldName(fre.name().stringValue());
} }
case InterfaceMethodRefEntry imre -> { case InterfaceMethodRefEntry imre -> {
check.accept(imre.owner()::asSymbol); try {
check.accept(imre::typeSymbol); imre.owner().asSymbol();
yield () -> verifyMethodName(imre.name().stringValue()); } catch (VerifyError|Exception e) {
errors.add(cpeVerifyError(cpe, e));
}
try {
imre.typeSymbol();
} catch (VerifyError|Exception e) {
errors.add(cpeVerifyError(cpe, e));
}
verifyMethodName(imre.name().stringValue());
} }
case MethodRefEntry mre -> { case MethodRefEntry mre -> {
check.accept(mre.owner()::asSymbol); try {
check.accept(mre::typeSymbol); mre.owner().asSymbol();
yield () -> verifyMethodName(mre.name().stringValue()); } catch (VerifyError|Exception e) {
errors.add(cpeVerifyError(cpe, e));
} }
case ModuleEntry me -> me::asSymbol; try {
mre.typeSymbol();
} catch (VerifyError|Exception e) {
errors.add(cpeVerifyError(cpe, e));
}
verifyMethodName(mre.name().stringValue());
}
case ModuleEntry me -> me.asSymbol();
case NameAndTypeEntry nate -> { case NameAndTypeEntry nate -> {
check.accept(nate.name()::stringValue); try {
yield () -> nate.type().stringValue(); nate.name().stringValue();
} catch (VerifyError|Exception e) {
errors.add(cpeVerifyError(cpe, e));
} }
case PackageEntry pe -> pe::asSymbol; nate.type().stringValue();
});
} }
case PackageEntry pe -> pe.asSymbol();
}
} catch (VerifyError|Exception e) {
errors.add(cpeVerifyError(cpe, e));
}
}
}
private VerifyError cpeVerifyError(final PoolEntry cpe, final Throwable e) {
return new VerifyError("%s at constant pool index %d in %s".formatted(e.getMessage(), cpe.index(), toString(classModel)));
} }
private void verifyFieldName(String name) { private void verifyFieldName(String name) {