Skip to content

Commit 76f0456

Browse files
committed
8296958: [JVMCI] add API for retrieving ConstantValue attributes
Reviewed-by: adinn Backport-of: 4ce4f384d720ab66ffde898c48d95a58039b0080
1 parent 9ad9228 commit 76f0456

File tree

1 file changed

+120
-6
lines changed

1 file changed

+120
-6
lines changed

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

Lines changed: 120 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -25,9 +25,9 @@
2525
* @test
2626
* @requires vm.jvmci
2727
* @library ../../../../../
28-
* @ignore 8249621
2928
* @modules jdk.internal.vm.ci/jdk.vm.ci.meta
3029
* jdk.internal.vm.ci/jdk.vm.ci.runtime
30+
* jdk.internal.vm.ci/jdk.vm.ci.common
3131
* java.base/jdk.internal.misc
3232
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:-UseJVMCICompiler jdk.vm.ci.runtime.test.TestResolvedJavaField
3333
*/
@@ -37,6 +37,8 @@
3737
import static org.junit.Assert.assertArrayEquals;
3838
import static org.junit.Assert.assertEquals;
3939
import static org.junit.Assert.assertFalse;
40+
import static org.junit.Assert.assertNotEquals;
41+
import static org.junit.Assert.assertNull;
4042
import static org.junit.Assert.assertTrue;
4143

4244
import java.io.ByteArrayOutputStream;
@@ -46,6 +48,7 @@
4648
import java.lang.annotation.Annotation;
4749
import java.lang.reflect.Field;
4850
import java.lang.reflect.Method;
51+
import java.lang.reflect.Modifier;
4952
import java.util.Arrays;
5053
import java.util.HashSet;
5154
import java.util.Map;
@@ -54,6 +57,9 @@
5457
import org.junit.Assert;
5558
import org.junit.Test;
5659

60+
import jdk.vm.ci.common.JVMCIError;
61+
import jdk.vm.ci.meta.ConstantReflectionProvider;
62+
import jdk.vm.ci.meta.JavaConstant;
5763
import jdk.vm.ci.meta.ResolvedJavaField;
5864
import jdk.vm.ci.meta.ResolvedJavaMethod;
5965
import jdk.vm.ci.meta.ResolvedJavaType;
@@ -106,6 +112,54 @@ public void getAnnotationTest() {
106112
}
107113
}
108114

115+
@Test
116+
public void getDeclaringClassTest() {
117+
for (Map.Entry<Field, ResolvedJavaField> e : fields.entrySet()) {
118+
ResolvedJavaField field = e.getValue();
119+
ResolvedJavaType actual = field.getDeclaringClass();
120+
ResolvedJavaType expect = metaAccess.lookupJavaType(e.getKey().getDeclaringClass());
121+
assertEquals(field.toString(), expect, actual);
122+
}
123+
}
124+
125+
@Test
126+
public void getOffsetTest() {
127+
for (Map.Entry<Field, ResolvedJavaField> e : fields.entrySet()) {
128+
Field javaField = e.getKey();
129+
ResolvedJavaField field = e.getValue();
130+
int actual = field.getOffset();
131+
long expect = field.isStatic() ? unsafe.staticFieldOffset(javaField) : unsafe.objectFieldOffset(javaField);
132+
assertEquals(field.toString(), expect, actual);
133+
}
134+
}
135+
136+
@Test
137+
public void isFinalTest() {
138+
for (Map.Entry<Field, ResolvedJavaField> e : fields.entrySet()) {
139+
ResolvedJavaField field = e.getValue();
140+
boolean actual = field.isFinal();
141+
boolean expect = Modifier.isFinal(e.getKey().getModifiers());
142+
assertEquals(field.toString(), expect, actual);
143+
}
144+
}
145+
146+
@Test
147+
public void isInternalTest() {
148+
for (Class<?> c : classes) {
149+
ResolvedJavaType type = metaAccess.lookupJavaType(c);
150+
for (ResolvedJavaField field : type.getInstanceFields(false)) {
151+
if (field.isInternal()) {
152+
try {
153+
c.getDeclaredField(field.getName());
154+
throw new AssertionError("got reflection object for internal field: " + field);
155+
} catch (NoSuchFieldException e) {
156+
// expected
157+
}
158+
}
159+
}
160+
}
161+
}
162+
109163
private Method findTestMethod(Method apiMethod) {
110164
String testName = apiMethod.getName() + "Test";
111165
for (Method m : getClass().getDeclaredMethods()) {
@@ -118,10 +172,6 @@ private Method findTestMethod(Method apiMethod) {
118172

119173
// @formatter:off
120174
private static final String[] untestedApiMethods = {
121-
"getDeclaringClass",
122-
"getOffset",
123-
"isInternal",
124-
"isFinal"
125175
};
126176
// @formatter:on
127177

@@ -221,6 +271,70 @@ public void testGetType() throws ClassNotFoundException {
221271
field.getAnnotations();
222272
}
223273
}
274+
275+
@Test
276+
public void getConstantValueTest() {
277+
ConstantReflectionProvider cr = constantReflection;
278+
Map<String, JavaConstant> expects = Map.of(
279+
"INT", JavaConstant.forInt(42),
280+
"SHORT", JavaConstant.forInt(43),
281+
"CHAR", JavaConstant.forInt(44),
282+
"BYTE", JavaConstant.forInt(45),
283+
"FLOAT", JavaConstant.forFloat(46.46F),
284+
"LONG", JavaConstant.forLong(47L),
285+
"DOUBLE", JavaConstant.forDouble(48.48D));
286+
ResolvedJavaType type = metaAccess.lookupJavaType(FieldsWithConstantValueAttributes.class);
287+
for (ResolvedJavaField field : type.getStaticFields()) {
288+
JavaConstant actual = field.getConstantValue();
289+
String name = field.getName();
290+
if (name.endsWith("2")) {
291+
assertNull(field.toString(), actual);
292+
} else if (name.equals("STRING")) {
293+
JavaConstant expect = cr.forString("STRING_VALUE");
294+
assertEquals(field.toString(), expect, actual);
295+
296+
// String ConstantValues are interned so should not
297+
// be identical to a newly allocated String
298+
expect = cr.forString(new String("STRING_VALUE"));
299+
assertNotEquals(field.toString(), expect, actual);
300+
} else {
301+
JavaConstant expect = expects.get(name);
302+
assertEquals(field.toString(), expect, actual);
303+
}
304+
}
305+
}
306+
}
307+
308+
class FieldsWithConstantValueAttributes {
309+
public static final String STRING = "STRING_VALUE";
310+
public static final int INT = 42;
311+
public static final short SHORT = 43;
312+
public static final char CHAR = 44;
313+
public static final byte BYTE = 45;
314+
public static final float FLOAT = 46.46F;
315+
public static final long LONG = 47L;
316+
public static final double DOUBLE = 48.48D;
317+
318+
public static final String STRING2;
319+
public static final int INT2;
320+
public static final short SHORT2;
321+
public static final char CHAR2;
322+
public static final byte BYTE2;
323+
public static final float FLOAT2;
324+
public static final long LONG2;
325+
public static final double DOUBLE2;
326+
327+
static {
328+
JVMCIError.shouldNotReachHere("should not be initialized");
329+
STRING2 = STRING;
330+
INT2 = INT;
331+
SHORT2 = SHORT;
332+
BYTE2 = BYTE;
333+
CHAR2 = CHAR;
334+
FLOAT2 = FLOAT;
335+
LONG2 = LONG;
336+
DOUBLE2 = DOUBLE;
337+
}
224338
}
225339

226340
class TypeWithUnresolvedFieldType {

0 commit comments

Comments
 (0)