Skip to content

Commit 8253219

Browse files
authored
Merge a900d8b into b9c6ce9
2 parents b9c6ce9 + a900d8b commit 8253219

File tree

1 file changed

+70
-42
lines changed

1 file changed

+70
-42
lines changed

src/java.base/share/classes/jdk/internal/classfile/impl/verifier/ParserVerifier.java

Lines changed: 70 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,9 @@
3434
import java.util.Collection;
3535
import java.util.HashSet;
3636
import java.util.List;
37-
import java.util.function.Consumer;
37+
import java.util.stream.Collectors;
3838
import java.util.function.Function;
3939
import java.util.function.ToIntFunction;
40-
import java.util.stream.Collectors;
4140

4241
import jdk.internal.classfile.impl.BoundAttribute;
4342
import jdk.internal.classfile.impl.Util;
@@ -65,50 +64,79 @@ List<VerifyError> verify() {
6564

6665
private void verifyConstantPool(List<VerifyError> errors) {
6766
for (var cpe : classModel.constantPool()) {
68-
Consumer<Runnable> check = c -> {
69-
try {
70-
c.run();
71-
} catch (VerifyError|Exception e) {
72-
errors.add(new VerifyError("%s at constant pool index %d in %s".formatted(e.getMessage(), cpe.index(), toString(classModel))));
73-
}
74-
};
75-
check.accept(switch (cpe) {
76-
case DoubleEntry de -> de::doubleValue;
77-
case FloatEntry fe -> fe::floatValue;
78-
case IntegerEntry ie -> ie::intValue;
79-
case LongEntry le -> le::longValue;
80-
case Utf8Entry ue -> ue::stringValue;
81-
case ConstantDynamicEntry cde -> cde::asSymbol;
82-
case InvokeDynamicEntry ide -> ide::asSymbol;
83-
case ClassEntry ce -> ce::asSymbol;
84-
case StringEntry se -> se::stringValue;
85-
case MethodHandleEntry mhe -> mhe::asSymbol;
86-
case MethodTypeEntry mte -> mte::asSymbol;
87-
case FieldRefEntry fre -> {
88-
check.accept(fre.owner()::asSymbol);
89-
check.accept(fre::typeSymbol);
90-
yield () -> verifyFieldName(fre.name().stringValue());
91-
}
92-
case InterfaceMethodRefEntry imre -> {
93-
check.accept(imre.owner()::asSymbol);
94-
check.accept(imre::typeSymbol);
95-
yield () -> verifyMethodName(imre.name().stringValue());
96-
}
97-
case MethodRefEntry mre -> {
98-
check.accept(mre.owner()::asSymbol);
99-
check.accept(mre::typeSymbol);
100-
yield () -> verifyMethodName(mre.name().stringValue());
101-
}
102-
case ModuleEntry me -> me::asSymbol;
103-
case NameAndTypeEntry nate -> {
104-
check.accept(nate.name()::stringValue);
105-
yield () -> nate.type().stringValue();
67+
try {
68+
switch (cpe) {
69+
case DoubleEntry de -> de.doubleValue();
70+
case FloatEntry fe -> fe.floatValue();
71+
case IntegerEntry ie -> ie.intValue();
72+
case LongEntry le -> le.longValue();
73+
case Utf8Entry ue -> ue.stringValue();
74+
case ConstantDynamicEntry cde -> cde.asSymbol();
75+
case InvokeDynamicEntry ide -> ide.asSymbol();
76+
case ClassEntry ce -> ce.asSymbol();
77+
case StringEntry se -> se.stringValue();
78+
case MethodHandleEntry mhe -> mhe.asSymbol();
79+
case MethodTypeEntry mte -> mte.asSymbol();
80+
case FieldRefEntry fre -> {
81+
try {
82+
fre.owner().asSymbol();
83+
} catch (VerifyError|Exception e) {
84+
errors.add(cpeVerifyError(cpe, e));
85+
}
86+
try {
87+
fre.typeSymbol();
88+
} catch (VerifyError|Exception e) {
89+
errors.add(cpeVerifyError(cpe, e));
90+
}
91+
verifyFieldName(fre.name().stringValue());
92+
}
93+
case InterfaceMethodRefEntry imre -> {
94+
try {
95+
imre.owner().asSymbol();
96+
} catch (VerifyError|Exception e) {
97+
errors.add(cpeVerifyError(cpe, e));
98+
}
99+
try {
100+
imre.typeSymbol();
101+
} catch (VerifyError|Exception e) {
102+
errors.add(cpeVerifyError(cpe, e));
103+
}
104+
verifyMethodName(imre.name().stringValue());
105+
}
106+
case MethodRefEntry mre -> {
107+
try {
108+
mre.owner().asSymbol();
109+
} catch (VerifyError|Exception e) {
110+
errors.add(cpeVerifyError(cpe, e));
111+
}
112+
try {
113+
mre.typeSymbol();
114+
} catch (VerifyError|Exception e) {
115+
errors.add(cpeVerifyError(cpe, e));
116+
}
117+
verifyMethodName(mre.name().stringValue());
118+
}
119+
case ModuleEntry me -> me.asSymbol();
120+
case NameAndTypeEntry nate -> {
121+
try {
122+
nate.name().stringValue();
123+
} catch (VerifyError|Exception e) {
124+
errors.add(cpeVerifyError(cpe, e));
125+
}
126+
nate.type().stringValue();
127+
}
128+
case PackageEntry pe -> pe.asSymbol();
106129
}
107-
case PackageEntry pe -> pe::asSymbol;
108-
});
130+
} catch (VerifyError|Exception e) {
131+
errors.add(cpeVerifyError(cpe, e));
132+
}
109133
}
110134
}
111135

136+
private VerifyError cpeVerifyError(final PoolEntry cpe, final Throwable e) {
137+
return new VerifyError("%s at constant pool index %d in %s".formatted(e.getMessage(), cpe.index(), toString(classModel)));
138+
}
139+
112140
private void verifyFieldName(String name) {
113141
if (name.length() == 0 || name.chars().anyMatch(ch -> switch(ch) {
114142
case '.', ';', '[', '/' -> true;

0 commit comments

Comments
 (0)