Skip to content

Commit 4217cdb

Browse files
committed
Switch to runtime initialization instead of rerun
They both have the same result starting with 23.1. Runtime initialization is public API while rerun is not, and will soon be deprecated and at some point removed in future releases. See oracle/graal#5013 (comment) and oracle/graal#8323
1 parent b063c22 commit 4217cdb

File tree

1 file changed

+32
-10
lines changed

1 file changed

+32
-10
lines changed

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

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import io.quarkus.deployment.builditem.nativeimage.RuntimeReinitializedClassBuildItem;
2121
import io.quarkus.deployment.builditem.nativeimage.UnsafeAccessedFieldBuildItem;
2222
import io.quarkus.deployment.pkg.NativeConfig;
23+
import io.quarkus.gizmo.AssignableResultHandle;
2324
import io.quarkus.gizmo.BranchResult;
2425
import io.quarkus.gizmo.BytecodeCreator;
2526
import io.quarkus.gizmo.CatchBlockCreator;
@@ -176,29 +177,50 @@ public void write(String s, byte[] bytes) {
176177
// hack in reinitialization of process info classes
177178
if (!runtimeReinitializedClassBuildItems.isEmpty()) {
178179
MethodCreator runtimeReinitializedClasses = file
179-
.getMethodCreator("runtimeReinitializedClasses", void.class)
180+
.getMethodCreator("runtimeReinitializedClasses", Class[].class)
180181
.setModifiers(Modifier.PRIVATE | Modifier.STATIC);
181182

182183
ResultHandle thisClass = runtimeReinitializedClasses.loadClassFromTCCL(GRAAL_FEATURE);
183184
ResultHandle cl = runtimeReinitializedClasses.invokeVirtualMethod(
184185
ofMethod(Class.class, "getClassLoader", ClassLoader.class),
185186
thisClass);
186-
ResultHandle quarkus = runtimeReinitializedClasses.load("Quarkus");
187-
ResultHandle imageSingleton = runtimeReinitializedClasses.invokeStaticMethod(IMAGE_SINGLETONS_LOOKUP,
188-
runtimeReinitializedClasses.loadClassFromTCCL(RUNTIME_CLASS_INITIALIZATION_SUPPORT));
189-
for (RuntimeReinitializedClassBuildItem runtimeReinitializedClass : runtimeReinitializedClassBuildItems) {
187+
ResultHandle classesArray = runtimeReinitializedClasses.newArray(Class.class,
188+
runtimeReinitializedClasses.load(runtimeReinitializedClassBuildItems.size()));
189+
for (int i = 0; i < runtimeReinitializedClassBuildItems.size(); i++) {
190190
TryBlock tc = runtimeReinitializedClasses.tryBlock();
191191
ResultHandle clazz = tc.invokeStaticMethod(
192192
ofMethod(Class.class, "forName", Class.class, String.class, boolean.class, ClassLoader.class),
193-
tc.load(runtimeReinitializedClass.getClassName()), tc.load(false), cl);
194-
tc.invokeInterfaceMethod(RERUN_INITIALIZATION, imageSingleton, clazz, quarkus);
195-
193+
tc.load(runtimeReinitializedClassBuildItems.get(i).getClassName()), tc.load(false), cl);
194+
tc.writeArrayValue(classesArray, i, clazz);
196195
CatchBlockCreator cc = tc.addCatch(Throwable.class);
197196
cc.invokeVirtualMethod(ofMethod(Throwable.class, "printStackTrace", void.class), cc.getCaughtException());
198197
}
199-
runtimeReinitializedClasses.returnVoid();
198+
runtimeReinitializedClasses.returnValue(classesArray);
200199

201-
overallCatch.invokeStaticMethod(runtimeReinitializedClasses.getMethodDescriptor());
200+
ResultHandle classes = overallCatch.invokeStaticMethod(runtimeReinitializedClasses.getMethodDescriptor());
201+
202+
ResultHandle graalVMVersion = overallCatch.invokeStaticMethod(GRAALVM_VERSION_GET_CURRENT);
203+
BranchResult graalVm23_1Test = overallCatch
204+
.ifGreaterEqualZero(overallCatch.invokeVirtualMethod(GRAALVM_VERSION_COMPARE_TO, graalVMVersion,
205+
overallCatch.marshalAsArray(int.class, overallCatch.load(23), overallCatch.load(1))));
206+
/* GraalVM >= 23.1 */
207+
try (BytecodeCreator greaterEqual23_1 = graalVm23_1Test.trueBranch()) {
208+
greaterEqual23_1.invokeStaticMethod(INITIALIZE_CLASSES_AT_RUN_TIME, classes);
209+
}
210+
/* GraalVM < 23.1 */
211+
try (BytecodeCreator less23_1 = graalVm23_1Test.falseBranch()) {
212+
ResultHandle quarkus = less23_1.load("Quarkus");
213+
ResultHandle imageSingleton = less23_1.invokeStaticMethod(IMAGE_SINGLETONS_LOOKUP,
214+
less23_1.loadClassFromTCCL(RUNTIME_CLASS_INITIALIZATION_SUPPORT));
215+
ResultHandle arraySize = less23_1.arrayLength(classes);
216+
AssignableResultHandle index = less23_1.createVariable(int.class);
217+
less23_1.assign(index, less23_1.load(0));
218+
try (BytecodeCreator loop = less23_1.whileLoop(c -> c.ifIntegerLessThan(index, arraySize)).block()) {
219+
loop.invokeInterfaceMethod(RERUN_INITIALIZATION, imageSingleton, loop.readArrayValue(classes, index),
220+
quarkus);
221+
loop.assign(index, loop.increment(index));
222+
}
223+
}
202224
}
203225

204226
// Ensure registration of fields being accessed through unsafe is done last to ensure that the class

0 commit comments

Comments
 (0)