Skip to content

Commit ddd28b4

Browse files
committed
[JVMCI] add ResolvedJavaType#isHidden [GR-70158]
1 parent 93a16f0 commit ddd28b4

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
@@ -185,6 +185,11 @@ public ResolvedJavaType getComponentType() {
185185
return this.equals(componentType) ? null : componentType;
186186
}
187187

188+
@Override
189+
public boolean isHidden() {
190+
return (getMiscFlags() & config().jvmAccIsHiddenClass) != 0;
191+
}
192+
188193
@Override
189194
public List<JavaType> getPermittedSubclasses() {
190195
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
@@ -247,6 +247,15 @@ default ResolvedJavaType getElementalType() {
247247
@Override
248248
ResolvedJavaType getArrayClass();
249249

250+
/**
251+
* Returns {@code true} if and only if the underlying class is a hidden class.
252+
*
253+
* @return {@code true} if and only if this class is a hidden class
254+
*
255+
* @see Class#isHidden()
256+
*/
257+
boolean isHidden();
258+
250259
/**
251260
* Returns an unmodifiable list of {@link JavaType} objects representing the subclasses or
252261
* 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
@@ -61,10 +61,12 @@
6161
import static org.junit.Assert.assertTrue;
6262
import static org.junit.Assert.fail;
6363

64+
import java.io.ByteArrayOutputStream;
6465
import java.io.DataInputStream;
6566
import java.io.IOException;
6667
import java.io.InputStream;
6768
import java.lang.annotation.Annotation;
69+
import java.lang.invoke.MethodHandles;
6870
import java.lang.invoke.MethodHandles.Lookup;
6971
import java.lang.reflect.AccessibleObject;
7072
import java.lang.reflect.AnnotatedElement;
@@ -709,6 +711,36 @@ public void getArrayClassTest() {
709711
}
710712
}
711713

714+
static class HiddenPrototype {}
715+
716+
@Test
717+
public void isHiddenTest() throws IllegalAccessException {
718+
// non-hidden class
719+
assertFalse(TestResolvedJavaType.class.isHidden());
720+
assertFalse(metaAccess.lookupJavaType(TestResolvedJavaType.class).isHidden());
721+
// hidden class
722+
Lookup lookup = MethodHandles.lookup();
723+
byte[] bytes = getClassBytes(HiddenPrototype.class);
724+
Class<?> c = lookup.defineHiddenClass(bytes, true).lookupClass();
725+
assertTrue(c.isHidden());
726+
assertTrue(metaAccess.lookupJavaType(c).isHidden());
727+
}
728+
729+
static byte[] getClassBytes(Class<?> originalClass) {
730+
try (InputStream classFile = originalClass.getResourceAsStream("TestResolvedJavaType$HiddenPrototype.class")) {
731+
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
732+
int nRead;
733+
byte[] data = new byte[16384];
734+
735+
while ((nRead = classFile.read(data, 0, data.length)) != -1) {
736+
buffer.write(data, 0, nRead);
737+
}
738+
return buffer.toByteArray();
739+
} catch (IOException e) {
740+
throw new AssertionError(e);
741+
}
742+
}
743+
712744
private static sealed class SealedTestClass
713745
permits PermittedTestClass1, PermittedTestClass3 {
714746
}

0 commit comments

Comments
 (0)