Skip to content

Commit 469daa1

Browse files
committed
Restore compatibility with Mandrel 20.3
1 parent ea4f950 commit 469daa1

File tree

2 files changed

+45
-6
lines changed

2 files changed

+45
-6
lines changed

core/deployment/src/main/java/io/quarkus/deployment/steps/NativeImageAutoFeatureStep.java

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.Map;
1717
import java.util.Set;
1818

19+
import org.graalvm.home.Version;
1920
import org.graalvm.nativeimage.ImageSingletons;
2021
import org.graalvm.nativeimage.hosted.Feature;
2122
import org.graalvm.nativeimage.hosted.RuntimeClassInitialization;
@@ -55,6 +56,9 @@
5556
public class NativeImageAutoFeatureStep {
5657

5758
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+
5862
private static final MethodDescriptor IMAGE_SINGLETONS_LOOKUP = ofMethod(ImageSingletons.class, "lookup", Object.class,
5963
Class.class);
6064
private static final MethodDescriptor BUILD_TIME_INITIALIZATION = ofMethod(
@@ -380,10 +384,18 @@ public void write(String s, byte[] bytes) {
380384
}
381385
}
382386
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(
384392
ofMethod(RUNTIME_REFLECTION, "register", void.class,
385393
boolean.class, boolean.class, Field[].class),
386394
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);
387399
} else if (!entry.getValue().fieldSet.isEmpty()) {
388400
ResultHandle farray = tc.newArray(Field.class, tc.load(1));
389401
for (String field : entry.getValue().fieldSet) {
@@ -476,22 +488,41 @@ public void write(String s, byte[] bytes) {
476488
private MethodDescriptor createRegisterSerializationForClassMethod(ClassCreator file) {
477489
//register serialization feature as requested
478490
MethodCreator requiredFeatures = file.getMethodCreator("getRequiredFeatures", "java.util.List");
491+
479492
TryBlock requiredCatch = requiredFeatures.tryBlock();
480493

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
482505
.loadClass("com.oracle.svm.reflect.serialize.hosted.SerializationFeature");
483-
ResultHandle requiredFeaturesList = requiredCatch.invokeStaticMethod(
506+
featuresIfGraalVM21Plus.returnValue(featuresIfGraalVM21Plus.invokeStaticMethod(
484507
ofMethod("java.util.Collections", "singletonList", List.class, Object.class),
485-
serializationFeatureClass);
508+
serializationFeatureClass));
486509

487-
requiredCatch.returnValue(requiredFeaturesList);
510+
BytecodeCreator featuresIfNotGraalVM21Plus = featuresGraalVm20Test.trueBranch();
511+
featuresIfNotGraalVM21Plus
512+
.returnValue(featuresIfNotGraalVM21Plus
513+
.invokeStaticMethod(ofMethod("java.util.Collections", "emptyList", List.class)));
488514

489515
// method to register class for registration
490516
MethodCreator addSerializationForClass = file.getMethodCreator("registerSerializationForClass", "V", Class.class);
491517
addSerializationForClass.setModifiers(Modifier.PRIVATE | Modifier.STATIC);
492518
ResultHandle clazz = addSerializationForClass.getMethodParam(0);
493519

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();
495526

496527
ResultHandle currentThread = tc
497528
.invokeStaticMethod(ofMethod(Thread.class, "currentThread", Thread.class));

integration-tests/main/src/main/java/io/quarkus/it/corestuff/SerializationTestEndpoint.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import javax.servlet.http.HttpServletRequest;
1313
import javax.servlet.http.HttpServletResponse;
1414

15+
import org.graalvm.home.Version;
16+
1517
import io.quarkus.it.corestuff.serialization.ExternalizablePerson;
1618
import io.quarkus.it.corestuff.serialization.Person;
1719
import io.quarkus.it.corestuff.serialization.SomeSerializationObject;
@@ -28,6 +30,12 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IO
2830
}
2931

3032
private void reflectiveSetterInvoke(HttpServletResponse resp) throws IOException {
33+
// we don't test serialization for GraalVM < 21 as they don't support it
34+
if (Version.getCurrent().compareTo(21) < 0) {
35+
resp.getWriter().write("OK");
36+
return;
37+
}
38+
3139
try {
3240
SomeSerializationObject instance = new SomeSerializationObject();
3341
instance.setPerson(new Person("Sheldon"));

0 commit comments

Comments
 (0)