Skip to content

Commit d9c8ead

Browse files
committed
[GR-70158] JVMCI: add ResolvedJavaType#isHidden
PullRequest: labsjdk-ce/227
2 parents f69061d + ddd28b4 commit d9c8ead

File tree

5 files changed

+52
-0
lines changed

5 files changed

+52
-0
lines changed

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,11 @@ public ResolvedJavaType getComponentType() {
189189
return this.equals(componentType) ? null : componentType;
190190
}
191191

192+
@Override
193+
public boolean isHidden() {
194+
return (getMiscFlags() & config().jvmAccIsHiddenClass) != 0;
195+
}
196+
192197
@Override
193198
public List<JavaType> getPermittedSubclasses() {
194199
if (isArray() || isPrimitive()) {

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotResolvedPrimitiveType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ public ResolvedJavaType getElementalType() {
102102
return this;
103103
}
104104

105+
@Override
106+
public boolean isHidden() {
107+
return false;
108+
}
109+
105110
@Override
106111
public List<JavaType> getPermittedSubclasses() {
107112
return null;

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ static String getHostArchitectureName() {
116116
final int arrayJUShortDataOffset = getFieldOffset("Array<jushort>::_data", Integer.class);
117117
final int arrayJUShortLengthOffset = getFieldOffset("Array<jushort>::_length", Integer.class, "int");
118118

119+
final int jvmAccIsHiddenClass = getConstant("KlassFlags::_misc_is_hidden_class", Integer.class);
119120
final int jvmAccHasFinalizer = getConstant("KlassFlags::_misc_has_finalizer", Integer.class);
120121
final int jvmFieldFlagInternalShift = getConstant("FieldInfo::FieldFlags::_ff_injected", Integer.class);
121122
final int jvmFieldFlagStableShift = getConstant("FieldInfo::FieldFlags::_ff_stable", Integer.class);

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/ResolvedJavaType.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,15 @@ default ResolvedJavaType getElementalType() {
248248
@Override
249249
ResolvedJavaType getArrayClass();
250250

251+
/**
252+
* Returns {@code true} if and only if the underlying class is a hidden class.
253+
*
254+
* @return {@code true} if and only if this class is a hidden class
255+
*
256+
* @see Class#isHidden()
257+
*/
258+
boolean isHidden();
259+
251260
/**
252261
* Returns an unmodifiable list of {@link JavaType} objects representing the subclasses or
253262
* subinterfaces that are explicitly permitted to extend or implement this sealed class or

test/hotspot/jtreg/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,12 @@
5757
import org.junit.Assert;
5858
import org.junit.Test;
5959

60+
import java.io.ByteArrayOutputStream;
6061
import java.io.DataInputStream;
6162
import java.io.IOException;
6263
import java.io.InputStream;
6364
import java.lang.annotation.Annotation;
65+
import java.lang.invoke.MethodHandles;
6466
import java.lang.invoke.MethodHandles.Lookup;
6567
import java.lang.reflect.AccessibleObject;
6668
import java.lang.reflect.Constructor;
@@ -725,6 +727,36 @@ public void getArrayClassTest() {
725727
}
726728
}
727729

730+
static class HiddenPrototype {}
731+
732+
@Test
733+
public void isHiddenTest() throws IllegalAccessException {
734+
// non-hidden class
735+
assertFalse(TestResolvedJavaType.class.isHidden());
736+
assertFalse(metaAccess.lookupJavaType(TestResolvedJavaType.class).isHidden());
737+
// hidden class
738+
Lookup lookup = MethodHandles.lookup();
739+
byte[] bytes = getClassBytes(HiddenPrototype.class);
740+
Class<?> c = lookup.defineHiddenClass(bytes, true).lookupClass();
741+
assertTrue(c.isHidden());
742+
assertTrue(metaAccess.lookupJavaType(c).isHidden());
743+
}
744+
745+
static byte[] getClassBytes(Class<?> originalClass) {
746+
try (InputStream classFile = originalClass.getResourceAsStream("TestResolvedJavaType$HiddenPrototype.class")) {
747+
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
748+
int nRead;
749+
byte[] data = new byte[16384];
750+
751+
while ((nRead = classFile.read(data, 0, data.length)) != -1) {
752+
buffer.write(data, 0, nRead);
753+
}
754+
return buffer.toByteArray();
755+
} catch (IOException e) {
756+
throw new AssertionError(e);
757+
}
758+
}
759+
728760
private static sealed class SealedTestClass
729761
permits PermittedTestClass1, PermittedTestClass3 {
730762
}

0 commit comments

Comments
 (0)