@@ -72,12 +72,13 @@ public class NativeImageAutoFeatureStep {
72
72
private static final MethodDescriptor RERUN_INITIALIZATION = ofMethod (
73
73
"org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport" ,
74
74
"rerunInitialization" , void .class , Class .class , String .class );
75
- private static final MethodDescriptor RESOURCES_REGISTRY_ADD_RESOURCES = ofMethod (
76
- "com.oracle.svm.core.configure.ResourcesRegistry" ,
77
- "addResources" , void .class , String .class );
78
- private static final MethodDescriptor RESOURCES_REGISTRY_IGNORE_RESOURCES = ofMethod (
79
- "com.oracle.svm.core.configure.ResourcesRegistry" ,
80
- "ignoreResources" , void .class , String .class );
75
+ private static final MethodDescriptor LOOKUP_METHOD = ofMethod (
76
+ "com.oracle.svm.util.ReflectionUtil" ,
77
+ "lookupMethod" , Method .class , Class .class , String .class , Class [].class );
78
+ private static final MethodDescriptor FOR_NAME = ofMethod (
79
+ Class .class , "forName" , Class .class , String .class , boolean .class , ClassLoader .class );
80
+ private static final MethodDescriptor INVOKE = ofMethod (
81
+ Method .class , "invoke" , Object .class , Object .class , Object [].class );
81
82
static final String RUNTIME_REFLECTION = RuntimeReflection .class .getName ();
82
83
static final String JNI_RUNTIME_ACCESS = "com.oracle.svm.core.jni.JNIRuntimeAccess" ;
83
84
static final String BEFORE_ANALYSIS_ACCESS = Feature .BeforeAnalysisAccess .class .getName ();
@@ -230,16 +231,63 @@ public void write(String s, byte[] bytes) {
230
231
ResultHandle resourcesRegistrySingleton = overallCatch .invokeStaticMethod (IMAGE_SINGLETONS_LOOKUP ,
231
232
overallCatch .loadClass ("com.oracle.svm.core.configure.ResourcesRegistry" ));
232
233
TryBlock tc = overallCatch .tryBlock ();
234
+
235
+ ResultHandle currentThread = tc .invokeStaticMethod (ofMethod (Thread .class , "currentThread" , Thread .class ));
236
+ ResultHandle tccl = tc .invokeVirtualMethod (ofMethod (Thread .class , "getContextClassLoader" , ClassLoader .class ),
237
+ currentThread );
238
+ AssignableResultHandle resourcesArgTypes = tc .createVariable (Class [].class );
239
+ AssignableResultHandle resourcesArgs = tc .createVariable (Object [].class );
240
+ AssignableResultHandle argsIndex = tc .createVariable (int .class );
241
+
242
+ BranchResult graalVm21_3Test = tc .ifGreaterEqualZero (
243
+ tc .invokeVirtualMethod (VERSION_COMPARE_TO ,
244
+ tc .invokeStaticMethod (VERSION_CURRENT ),
245
+ tc .marshalAsArray (int .class , tc .load (21 ), tc .load (3 ))));
246
+ /* GraalVM >= 21.3 */
247
+ BytecodeCreator greaterThan21_2 = graalVm21_3Test .trueBranch ();
248
+ ResultHandle argTypes = greaterThan21_2 .newArray (Class .class , greaterThan21_2 .load (2 ));
249
+ ResultHandle configurationConditionClass = greaterThan21_2 .invokeStaticMethod (FOR_NAME ,
250
+ greaterThan21_2 .load ("org.graalvm.nativeimage.impl.ConfigurationCondition" ),
251
+ greaterThan21_2 .load (false ), tccl );
252
+ greaterThan21_2 .writeArrayValue (argTypes , 0 , configurationConditionClass );
253
+ greaterThan21_2 .writeArrayValue (argTypes , 1 , greaterThan21_2 .loadClass (String .class ));
254
+ greaterThan21_2 .assign (resourcesArgTypes , argTypes );
255
+ ResultHandle args = greaterThan21_2 .newArray (Object .class , greaterThan21_2 .load (2 ));
256
+ ResultHandle alwaysTrueMethod = greaterThan21_2 .invokeStaticMethod (LOOKUP_METHOD ,
257
+ configurationConditionClass ,
258
+ greaterThan21_2 .load ("alwaysTrue" ),
259
+ greaterThan21_2 .newArray (Class .class , greaterThan21_2 .load (0 )));
260
+ ResultHandle alwaysTrueResult = greaterThan21_2 .invokeVirtualMethod (INVOKE ,
261
+ alwaysTrueMethod , greaterThan21_2 .loadNull (),
262
+ greaterThan21_2 .newArray (Object .class , greaterThan21_2 .load (0 )));
263
+ greaterThan21_2 .writeArrayValue (args , 0 , alwaysTrueResult );
264
+ greaterThan21_2 .assign (resourcesArgs , args );
265
+ greaterThan21_2 .assign (argsIndex , greaterThan21_2 .load (1 ));
266
+
267
+ /* GraalVM < 21.3 */
268
+ BytecodeCreator smallerThan21_3 = graalVm21_3Test .falseBranch ();
269
+ argTypes = smallerThan21_3 .newArray (Class .class , smallerThan21_3 .load (1 ));
270
+ smallerThan21_3 .writeArrayValue (argTypes , 0 , smallerThan21_3 .loadClass (String .class ));
271
+ smallerThan21_3 .assign (resourcesArgTypes , argTypes );
272
+ args = smallerThan21_3 .newArray (Object .class , smallerThan21_3 .load (1 ));
273
+ smallerThan21_3 .assign (resourcesArgs , args );
274
+ smallerThan21_3 .assign (argsIndex , smallerThan21_3 .load (0 ));
275
+
276
+ ResultHandle ignoreResourcesMethod = tc .invokeStaticMethod (LOOKUP_METHOD ,
277
+ tc .loadClass ("com.oracle.svm.core.configure.ResourcesRegistry" ),
278
+ tc .load ("ignoreResources" ), resourcesArgTypes );
279
+ ResultHandle addResourcesMethod = tc .invokeStaticMethod (LOOKUP_METHOD ,
280
+ tc .loadClass ("com.oracle.svm.core.configure.ResourcesRegistry" ),
281
+ tc .load ("addResources" ), resourcesArgTypes );
282
+
233
283
for (NativeImageResourcePatternsBuildItem resourcePatternsItem : resourcePatterns ) {
234
284
for (String pattern : resourcePatternsItem .getExcludePatterns ()) {
235
- tc .invokeInterfaceMethod ( RESOURCES_REGISTRY_IGNORE_RESOURCES , resourcesRegistrySingleton ,
236
- overallCatch . load ( pattern ) );
285
+ tc .writeArrayValue ( resourcesArgs , argsIndex , tc . load ( pattern ));
286
+ tc . invokeVirtualMethod ( INVOKE , ignoreResourcesMethod , resourcesRegistrySingleton , resourcesArgs );
237
287
}
238
288
for (String pattern : resourcePatternsItem .getIncludePatterns ()) {
239
- tc .invokeInterfaceMethod (
240
- RESOURCES_REGISTRY_ADD_RESOURCES ,
241
- resourcesRegistrySingleton ,
242
- tc .load (pattern ));
289
+ tc .writeArrayValue (resourcesArgs , argsIndex , tc .load (pattern ));
290
+ tc .invokeVirtualMethod (INVOKE , addResourcesMethod , resourcesRegistrySingleton , resourcesArgs );
243
291
}
244
292
}
245
293
CatchBlockCreator cc = tc .addCatch (Throwable .class );
@@ -538,39 +586,30 @@ private MethodDescriptor createRegisterSerializationForClassMethod(ClassCreator
538
586
ofMethod (Thread .class , "getContextClassLoader" , ClassLoader .class ),
539
587
currentThread );
540
588
541
- MethodDescriptor forNameMethodDescriptor = ofMethod (Class .class , "forName" , Class .class , String .class , boolean .class ,
542
- ClassLoader .class );
543
-
544
- MethodDescriptor lookupMethod = ofMethod ("com.oracle.svm.util.ReflectionUtil" , "lookupMethod" , Method .class ,
545
- Class .class , String .class ,
546
- Class [].class );
547
- MethodDescriptor invokeMethodDescriptor = ofMethod (Method .class , "invoke" , Object .class , Object .class ,
548
- Object [].class );
549
-
550
589
BranchResult graalVm21_3Test = tc .ifGreaterEqualZero (
551
590
tc .invokeVirtualMethod (VERSION_COMPARE_TO , tc .invokeStaticMethod (VERSION_CURRENT ),
552
591
tc .marshalAsArray (int .class , tc .load (21 ), tc .load (3 ))));
553
592
554
593
BytecodeCreator greaterThan21_3 = graalVm21_3Test .trueBranch ();
555
- ResultHandle runtimeSerializationClass = greaterThan21_3 .invokeStaticMethod (forNameMethodDescriptor ,
594
+ ResultHandle runtimeSerializationClass = greaterThan21_3 .invokeStaticMethod (FOR_NAME ,
556
595
greaterThan21_3 .load ("org.graalvm.nativeimage.hosted.RuntimeSerialization" ),
557
596
greaterThan21_3 .load (false ), tccl );
558
597
ResultHandle registerArgTypes = greaterThan21_3 .newArray (Class .class , greaterThan21_3 .load (1 ));
559
598
greaterThan21_3 .writeArrayValue (registerArgTypes , 0 , greaterThan21_3 .loadClass (Class [].class ));
560
- ResultHandle registerLookupMethod = greaterThan21_3 .invokeStaticMethod (lookupMethod , runtimeSerializationClass ,
599
+ ResultHandle registerLookupMethod = greaterThan21_3 .invokeStaticMethod (LOOKUP_METHOD , runtimeSerializationClass ,
561
600
greaterThan21_3 .load ("register" ), registerArgTypes );
562
601
ResultHandle registerArgs = greaterThan21_3 .newArray (Object .class , greaterThan21_3 .load (1 ));
563
602
ResultHandle classesToRegister = greaterThan21_3 .newArray (Class .class , greaterThan21_3 .load (1 ));
564
603
greaterThan21_3 .writeArrayValue (classesToRegister , 0 , clazz );
565
604
greaterThan21_3 .writeArrayValue (registerArgs , 0 , classesToRegister );
566
- greaterThan21_3 .invokeVirtualMethod (invokeMethodDescriptor , registerLookupMethod ,
605
+ greaterThan21_3 .invokeVirtualMethod (INVOKE , registerLookupMethod ,
567
606
greaterThan21_3 .loadNull (), registerArgs );
568
607
greaterThan21_3 .returnValue (null );
569
608
570
- ResultHandle serializationRegistryClass = tc .invokeStaticMethod (forNameMethodDescriptor ,
609
+ ResultHandle serializationRegistryClass = tc .invokeStaticMethod (FOR_NAME ,
571
610
tc .load ("com.oracle.svm.core.jdk.serialize.SerializationRegistry" ),
572
611
tc .load (false ), tccl );
573
- ResultHandle addReflectionsClass = tc .invokeStaticMethod (forNameMethodDescriptor ,
612
+ ResultHandle addReflectionsClass = tc .invokeStaticMethod (FOR_NAME ,
574
613
tc .load ("com.oracle.svm.reflect.serialize.hosted.SerializationFeature" ),
575
614
tc .load (false ), tccl );
576
615
@@ -581,39 +620,36 @@ private MethodDescriptor createRegisterSerializationForClassMethod(ClassCreator
581
620
ResultHandle addReflectionsLookupArgs = tc .newArray (Class .class , tc .load (2 ));
582
621
tc .writeArrayValue (addReflectionsLookupArgs , 0 , tc .loadClass (Class .class ));
583
622
tc .writeArrayValue (addReflectionsLookupArgs , 1 , tc .loadClass (Class .class ));
584
- ResultHandle addReflectionsLookupMethod = tc .invokeStaticMethod (lookupMethod , addReflectionsClass ,
623
+ ResultHandle addReflectionsLookupMethod = tc .invokeStaticMethod (LOOKUP_METHOD , addReflectionsClass ,
585
624
tc .load ("addReflections" ), addReflectionsLookupArgs );
586
625
587
626
ResultHandle reflectionFactory = tc .invokeStaticMethod (
588
627
ofMethod ("sun.reflect.ReflectionFactory" , "getReflectionFactory" , "sun.reflect.ReflectionFactory" ));
589
628
590
629
AssignableResultHandle newSerializationConstructor = tc .createVariable (Constructor .class );
591
630
592
- ResultHandle externalizableClass = tc .invokeStaticMethod (
593
- forNameMethodDescriptor ,
594
- tc .load ("java.io.Externalizable" ), tc .load (false ), tccl );
631
+ ResultHandle externalizableClass = tc .invokeStaticMethod (FOR_NAME , tc .load ("java.io.Externalizable" ), tc .load (false ),
632
+ tccl );
595
633
596
634
BranchResult isExternalizable = tc
597
635
.ifTrue (tc .invokeVirtualMethod (ofMethod (Class .class , "isAssignableFrom" , boolean .class , Class .class ),
598
636
externalizableClass , clazz ));
599
637
BytecodeCreator ifIsExternalizable = isExternalizable .trueBranch ();
600
638
601
639
ResultHandle array1 = ifIsExternalizable .newArray (Class .class , tc .load (1 ));
602
- ResultHandle classClass = ifIsExternalizable .invokeStaticMethod (
603
- forNameMethodDescriptor ,
640
+ ResultHandle classClass = ifIsExternalizable .invokeStaticMethod (FOR_NAME ,
604
641
ifIsExternalizable .load ("java.lang.Class" ), ifIsExternalizable .load (false ), tccl );
605
642
ifIsExternalizable .writeArrayValue (array1 , 0 , classClass );
606
643
607
- ResultHandle externalizableLookupMethod = ifIsExternalizable .invokeStaticMethod (
608
- lookupMethod ,
644
+ ResultHandle externalizableLookupMethod = ifIsExternalizable .invokeStaticMethod (LOOKUP_METHOD ,
609
645
ifIsExternalizable .loadClass (ObjectStreamClass .class ), ifIsExternalizable .load ("getExternalizableConstructor" ),
610
646
array1 );
611
647
612
648
ResultHandle array2 = ifIsExternalizable .newArray (Object .class , tc .load (1 ));
613
649
ifIsExternalizable .writeArrayValue (array2 , 0 , clazz );
614
650
615
651
ResultHandle externalizableConstructor = ifIsExternalizable .invokeVirtualMethod (
616
- invokeMethodDescriptor , externalizableLookupMethod , ifIsExternalizable .loadNull (), array2 );
652
+ INVOKE , externalizableLookupMethod , ifIsExternalizable .loadNull (), array2 );
617
653
618
654
ResultHandle externalizableConstructorClass = ifIsExternalizable .invokeVirtualMethod (
619
655
ofMethod (Constructor .class , "getDeclaringClass" , Class .class ),
@@ -622,7 +658,7 @@ private MethodDescriptor createRegisterSerializationForClassMethod(ClassCreator
622
658
ResultHandle addReflectionsArgs1 = ifIsExternalizable .newArray (Class .class , tc .load (2 ));
623
659
ifIsExternalizable .writeArrayValue (addReflectionsArgs1 , 0 , clazz );
624
660
ifIsExternalizable .writeArrayValue (addReflectionsArgs1 , 1 , externalizableConstructorClass );
625
- ifIsExternalizable .invokeVirtualMethod (invokeMethodDescriptor , addReflectionsLookupMethod ,
661
+ ifIsExternalizable .invokeVirtualMethod (INVOKE , addReflectionsLookupMethod ,
626
662
ifIsExternalizable .loadNull (), addReflectionsArgs1 );
627
663
628
664
ifIsExternalizable .returnValue (null );
@@ -655,11 +691,11 @@ private MethodDescriptor createRegisterSerializationForClassMethod(ClassCreator
655
691
newSerializationConstructor );
656
692
657
693
ResultHandle getConstructorAccessor = tc .invokeStaticMethod (
658
- lookupMethod , tc .loadClass (Constructor .class ), tc .load ("getConstructorAccessor" ),
694
+ LOOKUP_METHOD , tc .loadClass (Constructor .class ), tc .load ("getConstructorAccessor" ),
659
695
tc .newArray (Class .class , tc .load (0 )));
660
696
661
697
ResultHandle accessor = tc .invokeVirtualMethod (
662
- invokeMethodDescriptor , getConstructorAccessor , newSerializationConstructor ,
698
+ INVOKE , getConstructorAccessor , newSerializationConstructor ,
663
699
tc .newArray (Object .class , tc .load (0 )));
664
700
665
701
tc .invokeVirtualMethod (
@@ -669,7 +705,7 @@ private MethodDescriptor createRegisterSerializationForClassMethod(ClassCreator
669
705
ResultHandle addReflectionsArgs2 = tc .newArray (Class .class , tc .load (2 ));
670
706
tc .writeArrayValue (addReflectionsArgs2 , 0 , clazz );
671
707
tc .writeArrayValue (addReflectionsArgs2 , 1 , newSerializationConstructorClass );
672
- tc .invokeVirtualMethod (invokeMethodDescriptor , addReflectionsLookupMethod , tc .loadNull (), addReflectionsArgs2 );
708
+ tc .invokeVirtualMethod (INVOKE , addReflectionsLookupMethod , tc .loadNull (), addReflectionsArgs2 );
673
709
674
710
addSerializationForClass .returnValue (null );
675
711
0 commit comments