|
16 | 16 | import java.util.Map; |
17 | 17 | import java.util.Set; |
18 | 18 |
|
| 19 | +import org.graalvm.home.Version; |
19 | 20 | import org.graalvm.nativeimage.ImageSingletons; |
20 | 21 | import org.graalvm.nativeimage.hosted.Feature; |
21 | 22 | import org.graalvm.nativeimage.hosted.RuntimeClassInitialization; |
|
55 | 56 | public class NativeImageAutoFeatureStep { |
56 | 57 |
|
57 | 58 | private static final String GRAAL_AUTOFEATURE = "io/quarkus/runner/AutoFeature"; |
| 59 | + private static final MethodDescriptor VERSION_CURRENT = ofMethod(Version.class, "getCurrent", Version.class); |
| 60 | + private static final MethodDescriptor VERSION_COMPARE_TO = ofMethod(Version.class, "compareTo", int.class, int[].class); |
| 61 | + |
58 | 62 | private static final MethodDescriptor IMAGE_SINGLETONS_LOOKUP = ofMethod(ImageSingletons.class, "lookup", Object.class, |
59 | 63 | Class.class); |
60 | 64 | private static final MethodDescriptor BUILD_TIME_INITIALIZATION = ofMethod( |
@@ -380,10 +384,18 @@ public void write(String s, byte[] bytes) { |
380 | 384 | } |
381 | 385 | } |
382 | 386 | if (entry.getValue().fields) { |
383 | | - tc.invokeStaticMethod( |
| 387 | + BranchResult graalVm21Test = tc.ifGreaterEqualZero( |
| 388 | + tc.invokeVirtualMethod(VERSION_COMPARE_TO, |
| 389 | + tc.invokeStaticMethod(VERSION_CURRENT), |
| 390 | + tc.marshalAsArray(int.class, tc.load(21)))); |
| 391 | + graalVm21Test.trueBranch().invokeStaticMethod( |
384 | 392 | ofMethod(RUNTIME_REFLECTION, "register", void.class, |
385 | 393 | boolean.class, boolean.class, Field[].class), |
386 | 394 | tc.load(entry.getValue().finalFieldsWritable), tc.load(entry.getValue().serialization), fields); |
| 395 | + graalVm21Test.falseBranch().invokeStaticMethod( |
| 396 | + ofMethod(RUNTIME_REFLECTION, "register", void.class, |
| 397 | + boolean.class, Field[].class), |
| 398 | + tc.load(entry.getValue().finalFieldsWritable), fields); |
387 | 399 | } else if (!entry.getValue().fieldSet.isEmpty()) { |
388 | 400 | ResultHandle farray = tc.newArray(Field.class, tc.load(1)); |
389 | 401 | for (String field : entry.getValue().fieldSet) { |
@@ -476,22 +488,41 @@ public void write(String s, byte[] bytes) { |
476 | 488 | private MethodDescriptor createRegisterSerializationForClassMethod(ClassCreator file) { |
477 | 489 | //register serialization feature as requested |
478 | 490 | MethodCreator requiredFeatures = file.getMethodCreator("getRequiredFeatures", "java.util.List"); |
| 491 | + |
479 | 492 | TryBlock requiredCatch = requiredFeatures.tryBlock(); |
480 | 493 |
|
481 | | - ResultHandle serializationFeatureClass = requiredCatch |
| 494 | + // It's too early in the GraalVM build to use Version.getCurrent() |
| 495 | + BranchResult featuresGraalVm20Test = requiredCatch.ifTrue(requiredCatch |
| 496 | + .invokeVirtualMethod(ofMethod(String.class, "startsWith", boolean.class, String.class), |
| 497 | + requiredCatch.invokeStaticMethod( |
| 498 | + ofMethod(System.class, "getProperty", String.class, String.class), |
| 499 | + requiredCatch.load("org.graalvm.version")), |
| 500 | + requiredCatch.load("20."))); |
| 501 | + |
| 502 | + BytecodeCreator featuresIfGraalVM21Plus = featuresGraalVm20Test.falseBranch(); |
| 503 | + |
| 504 | + ResultHandle serializationFeatureClass = featuresIfGraalVM21Plus |
482 | 505 | .loadClass("com.oracle.svm.reflect.serialize.hosted.SerializationFeature"); |
483 | | - ResultHandle requiredFeaturesList = requiredCatch.invokeStaticMethod( |
| 506 | + featuresIfGraalVM21Plus.returnValue(featuresIfGraalVM21Plus.invokeStaticMethod( |
484 | 507 | ofMethod("java.util.Collections", "singletonList", List.class, Object.class), |
485 | | - serializationFeatureClass); |
| 508 | + serializationFeatureClass)); |
486 | 509 |
|
487 | | - requiredCatch.returnValue(requiredFeaturesList); |
| 510 | + BytecodeCreator featuresIfNotGraalVM21Plus = featuresGraalVm20Test.trueBranch(); |
| 511 | + featuresIfNotGraalVM21Plus |
| 512 | + .returnValue(featuresIfNotGraalVM21Plus |
| 513 | + .invokeStaticMethod(ofMethod("java.util.Collections", "emptyList", List.class))); |
488 | 514 |
|
489 | 515 | // method to register class for registration |
490 | 516 | MethodCreator addSerializationForClass = file.getMethodCreator("registerSerializationForClass", "V", Class.class); |
491 | 517 | addSerializationForClass.setModifiers(Modifier.PRIVATE | Modifier.STATIC); |
492 | 518 | ResultHandle clazz = addSerializationForClass.getMethodParam(0); |
493 | 519 |
|
494 | | - TryBlock tc = addSerializationForClass.tryBlock(); |
| 520 | + BranchResult graalVm21Test = addSerializationForClass.ifGreaterEqualZero( |
| 521 | + addSerializationForClass.invokeVirtualMethod(VERSION_COMPARE_TO, |
| 522 | + addSerializationForClass.invokeStaticMethod(VERSION_CURRENT), |
| 523 | + addSerializationForClass.marshalAsArray(int.class, addSerializationForClass.load(21)))); |
| 524 | + |
| 525 | + TryBlock tc = graalVm21Test.trueBranch().tryBlock(); |
495 | 526 |
|
496 | 527 | ResultHandle currentThread = tc |
497 | 528 | .invokeStaticMethod(ofMethod(Thread.class, "currentThread", Thread.class)); |
|
0 commit comments