2727import static org .graalvm .compiler .nodes .graphbuilderconf .InlineInvokePlugin .InlineInfo .createStandardInlineInfo ;
2828
2929import java .lang .invoke .MethodHandle ;
30+ import java .lang .invoke .VarHandle ;
3031import java .lang .reflect .Field ;
3132import java .lang .reflect .Method ;
3233import java .util .Arrays ;
9697import org .graalvm .compiler .phases .common .CanonicalizerPhase ;
9798import org .graalvm .compiler .phases .util .Providers ;
9899import org .graalvm .compiler .replacements .MethodHandlePlugin ;
99- import org .graalvm .compiler .serviceprovider .JavaVersionUtil ;
100100import org .graalvm .compiler .word .WordOperationPlugin ;
101101import org .graalvm .nativeimage .ImageSingletons ;
102102
160160 */
161161public class IntrinsifyMethodHandlesInvocationPlugin implements NodePlugin {
162162
163+ private static final Field varHandleVFormField ;
164+ private static final Method varFormInitMethod ;
165+
166+ static {
167+ varHandleVFormField = ReflectionUtil .lookupField (VarHandle .class , "vform" );
168+ try {
169+ Class <?> varFormClass = Class .forName ("java.lang.invoke.VarForm" );
170+ varFormInitMethod = ReflectionUtil .lookupMethod (varFormClass , "getMethodType_V" , int .class );
171+ } catch (ClassNotFoundException ex ) {
172+ throw VMError .shouldNotReachHere (ex );
173+ }
174+ }
175+
163176 public static class IntrinsificationRegistry extends IntrinsificationPluginRegistry {
164177 }
165178
@@ -174,14 +187,7 @@ public static class IntrinsificationRegistry extends IntrinsificationPluginRegis
174187 private final IntrinsificationRegistry intrinsificationRegistry ;
175188
176189 private final ResolvedJavaType methodHandleType ;
177-
178- private final Class <?> varHandleClass ;
179- private final Class <?> varHandleAccessModeClass ;
180190 private final ResolvedJavaType varHandleType ;
181- private final Field varHandleVFormField ;
182- private final Method varFormInitMethod ;
183- private final Method varHandleIsAccessModeSupportedMethod ;
184- private final Method varHandleAccessModeTypeMethod ;
185191
186192 public IntrinsifyMethodHandlesInvocationPlugin (ParsingReason reason , Providers providers , AnalysisUniverse aUniverse , HostedUniverse hUniverse ) {
187193 this .reason = reason ;
@@ -201,30 +207,8 @@ public IntrinsifyMethodHandlesInvocationPlugin(ParsingReason reason, Providers p
201207 intrinsificationRegistry = ImageSingletons .lookup (IntrinsificationRegistry .class );
202208 }
203209
204- methodHandleType = universeProviders .getMetaAccess ().lookupJavaType (java .lang .invoke .MethodHandle .class );
205-
206- if (JavaVersionUtil .JAVA_SPEC >= 11 ) {
207- try {
208- varHandleClass = Class .forName ("java.lang.invoke.VarHandle" );
209- varHandleAccessModeClass = Class .forName ("java.lang.invoke.VarHandle$AccessMode" );
210- varHandleType = universeProviders .getMetaAccess ().lookupJavaType (varHandleClass );
211- varHandleVFormField = ReflectionUtil .lookupField (varHandleClass , "vform" );
212- Class <?> varFormClass = Class .forName ("java.lang.invoke.VarForm" );
213- varFormInitMethod = ReflectionUtil .lookupMethod (varFormClass , "getMethodType_V" , int .class );
214- varHandleIsAccessModeSupportedMethod = ReflectionUtil .lookupMethod (varHandleClass , "isAccessModeSupported" , varHandleAccessModeClass );
215- varHandleAccessModeTypeMethod = ReflectionUtil .lookupMethod (varHandleClass , "accessModeType" , varHandleAccessModeClass );
216- } catch (ClassNotFoundException ex ) {
217- throw VMError .shouldNotReachHere (ex );
218- }
219- } else {
220- varHandleClass = null ;
221- varHandleAccessModeClass = null ;
222- varHandleType = null ;
223- varHandleVFormField = null ;
224- varFormInitMethod = null ;
225- varHandleIsAccessModeSupportedMethod = null ;
226- varHandleAccessModeTypeMethod = null ;
227- }
210+ methodHandleType = universeProviders .getMetaAccess ().lookupJavaType (MethodHandle .class );
211+ varHandleType = universeProviders .getMetaAccess ().lookupJavaType (VarHandle .class );
228212 }
229213
230214 @ Override
@@ -332,7 +316,7 @@ private boolean isVarHandleMethod(ResolvedJavaMethod method, ValueNode[] args) {
332316 * initialization has happened. We force initialization by invoking the method
333317 * VarHandle.vform.getMethodType_V(0).
334318 */
335- Object varHandle = SubstrateObjectConstant .asObject (args [0 ].asJavaConstant ());
319+ VarHandle varHandle = ( VarHandle ) SubstrateObjectConstant .asObject (args [0 ].asJavaConstant ());
336320 Object varForm = varHandleVFormField .get (varHandle );
337321 varFormInitMethod .invoke (varForm , 0 );
338322
@@ -342,17 +326,17 @@ private boolean isVarHandleMethod(ResolvedJavaMethod method, ValueNode[] args) {
342326 * method. Initializing all AccessMode enum values is easier than trying to extract
343327 * the actual AccessMode.
344328 */
345- for (Object accessMode : varHandleAccessModeClass . getEnumConstants ()) {
329+ for (VarHandle . AccessMode accessMode : VarHandle . AccessMode . values ()) {
346330 /*
347331 * Force initialization of the @Stable field VarHandle.vform.memberName_table.
348332 * Starting with JDK 17, this field is lazily initialized.
349333 */
350- varHandleIsAccessModeSupportedMethod . invoke ( varHandle , accessMode );
334+ varHandle . isAccessModeSupported ( accessMode );
351335 /*
352336 * Force initialization of the @Stable field
353337 * VarHandle.typesAndInvokers.methodType_table.
354338 */
355- varHandleAccessModeTypeMethod . invoke ( varHandle , accessMode );
339+ varHandle . accessModeType ( accessMode );
356340 }
357341 } catch (ReflectiveOperationException ex ) {
358342 throw VMError .shouldNotReachHere (ex );
0 commit comments