mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +02:00
8336585: BoundAttribute.readEntryList not type-safe
Reviewed-by: asotona
This commit is contained in:
parent
b44632aa15
commit
902c2afb67
2 changed files with 57 additions and 22 deletions
|
@ -25,12 +25,6 @@
|
|||
|
||||
package jdk.internal.classfile.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
|
||||
import java.lang.classfile.*;
|
||||
import java.lang.classfile.attribute.*;
|
||||
import java.lang.classfile.constantpool.ClassEntry;
|
||||
|
@ -40,7 +34,14 @@ import java.lang.classfile.constantpool.LoadableConstantEntry;
|
|||
import java.lang.classfile.constantpool.ModuleEntry;
|
||||
import java.lang.classfile.constantpool.NameAndTypeEntry;
|
||||
import java.lang.classfile.constantpool.PackageEntry;
|
||||
import java.lang.classfile.constantpool.PoolEntry;
|
||||
import java.lang.classfile.constantpool.Utf8Entry;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
|
||||
import jdk.internal.access.SharedSecrets;
|
||||
|
||||
import static java.lang.classfile.Attributes.*;
|
||||
|
@ -116,13 +117,13 @@ public abstract sealed class BoundAttribute<T extends Attribute<T>>
|
|||
return String.format("Attribute[name=%s]", mapper.name());
|
||||
}
|
||||
|
||||
<E> List<E> readEntryList(int p) {
|
||||
<E extends PoolEntry> List<E> readEntryList(int p, Class<E> type) {
|
||||
int cnt = classReader.readU2(p);
|
||||
p += 2;
|
||||
var entries = new Object[cnt];
|
||||
int end = p + (cnt * 2);
|
||||
for (int i = 0; p < end; i++, p += 2) {
|
||||
entries[i] = classReader.readEntry(p);
|
||||
entries[i] = classReader.readEntry(p, type);
|
||||
}
|
||||
return SharedSecrets.getJavaUtilCollectionAccess().listFromTrustedArray(entries);
|
||||
}
|
||||
|
@ -549,7 +550,7 @@ public abstract sealed class BoundAttribute<T extends Attribute<T>>
|
|||
@Override
|
||||
public List<ClassEntry> exceptions() {
|
||||
if (exceptions == null) {
|
||||
exceptions = readEntryList(payloadStart);
|
||||
exceptions = readEntryList(payloadStart, ClassEntry.class);
|
||||
}
|
||||
return exceptions;
|
||||
}
|
||||
|
@ -645,7 +646,7 @@ public abstract sealed class BoundAttribute<T extends Attribute<T>>
|
|||
PackageEntry pe = classReader.readEntry(p, PackageEntry.class);
|
||||
int exportFlags = classReader.readU2(p + 2);
|
||||
p += 4;
|
||||
List<ModuleEntry> exportsTo = readEntryList(p);
|
||||
List<ModuleEntry> exportsTo = readEntryList(p, ModuleEntry.class);
|
||||
p += 2 + exportsTo.size() * 2;
|
||||
elements[i] = ModuleExportInfo.of(pe, exportFlags, exportsTo);
|
||||
}
|
||||
|
@ -660,7 +661,7 @@ public abstract sealed class BoundAttribute<T extends Attribute<T>>
|
|||
PackageEntry po = classReader.readEntry(p, PackageEntry.class);
|
||||
int opensFlags = classReader.readU2(p + 2);
|
||||
p += 4;
|
||||
List<ModuleEntry> opensTo = readEntryList(p);
|
||||
List<ModuleEntry> opensTo = readEntryList(p, ModuleEntry.class);
|
||||
p += 2 + opensTo.size() * 2;
|
||||
elements[i] = ModuleOpenInfo.of(po, opensFlags, opensTo);
|
||||
}
|
||||
|
@ -668,7 +669,7 @@ public abstract sealed class BoundAttribute<T extends Attribute<T>>
|
|||
}
|
||||
|
||||
{
|
||||
uses = readEntryList(p);
|
||||
uses = readEntryList(p, ClassEntry.class);
|
||||
p += 2 + uses.size() * 2;
|
||||
int cnt = classReader.readU2(p);
|
||||
p += 2;
|
||||
|
@ -677,7 +678,7 @@ public abstract sealed class BoundAttribute<T extends Attribute<T>>
|
|||
for (int i = 0; i < cnt; i++) {
|
||||
ClassEntry c = classReader.readEntry(p, ClassEntry.class);
|
||||
p += 2;
|
||||
List<ClassEntry> providesWith = readEntryList(p);
|
||||
List<ClassEntry> providesWith = readEntryList(p, ClassEntry.class);
|
||||
p += 2 + providesWith.size() * 2;
|
||||
elements[i] = ModuleProvideInfo.of(c, providesWith);
|
||||
}
|
||||
|
@ -697,7 +698,7 @@ public abstract sealed class BoundAttribute<T extends Attribute<T>>
|
|||
@Override
|
||||
public List<PackageEntry> packages() {
|
||||
if (packages == null) {
|
||||
packages = readEntryList(payloadStart);
|
||||
packages = readEntryList(payloadStart, PackageEntry.class);
|
||||
}
|
||||
return packages;
|
||||
}
|
||||
|
@ -715,7 +716,7 @@ public abstract sealed class BoundAttribute<T extends Attribute<T>>
|
|||
@Override
|
||||
public List<ClassEntry> nestMembers() {
|
||||
if (members == null) {
|
||||
members = readEntryList(payloadStart);
|
||||
members = readEntryList(payloadStart, ClassEntry.class);
|
||||
}
|
||||
return members;
|
||||
}
|
||||
|
@ -744,7 +745,7 @@ public abstract sealed class BoundAttribute<T extends Attribute<T>>
|
|||
int p = payloadStart + 2;
|
||||
for (int i = 0; i < size; ++i) {
|
||||
final var handle = classReader.readEntry(p, AbstractPoolEntry.MethodHandleEntryImpl.class);
|
||||
final List<LoadableConstantEntry> args = readEntryList(p + 2);
|
||||
final List<LoadableConstantEntry> args = readEntryList(p + 2, LoadableConstantEntry.class);
|
||||
p += 4 + args.size() * 2;
|
||||
int hash = BootstrapMethodEntryImpl.computeHashCode(handle, args);
|
||||
bs[i] = new BootstrapMethodEntryImpl(classReader, i, hash, handle, args);
|
||||
|
@ -924,7 +925,7 @@ public abstract sealed class BoundAttribute<T extends Attribute<T>>
|
|||
@Override
|
||||
public List<ClassEntry> permittedSubclasses() {
|
||||
if (permittedSubclasses == null) {
|
||||
permittedSubclasses = readEntryList(payloadStart);
|
||||
permittedSubclasses = readEntryList(payloadStart, ClassEntry.class);
|
||||
}
|
||||
return permittedSubclasses;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue