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
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 */
3737import static org .junit .Assert .assertArrayEquals ;
3838import static org .junit .Assert .assertEquals ;
3939import static org .junit .Assert .assertFalse ;
40+ import static org .junit .Assert .assertNotEquals ;
41+ import static org .junit .Assert .assertNull ;
4042import static org .junit .Assert .assertTrue ;
4143
4244import java .io .ByteArrayOutputStream ;
4648import java .lang .annotation .Annotation ;
4749import java .lang .reflect .Field ;
4850import java .lang .reflect .Method ;
51+ import java .lang .reflect .Modifier ;
4952import java .util .Arrays ;
5053import java .util .HashSet ;
5154import java .util .Map ;
5457import org .junit .Assert ;
5558import 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 ;
5763import jdk .vm .ci .meta .ResolvedJavaField ;
5864import jdk .vm .ci .meta .ResolvedJavaMethod ;
5965import 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
226340class TypeWithUnresolvedFieldType {
0 commit comments