Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
WIP TEST: Switch to runtime initialization instead of rerun
Browse files Browse the repository at this point in the history
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
zakkak committed Jan 15, 2025

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent b063c22 commit eca848e
Showing 1 changed file with 26 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -176,29 +176,45 @@ public void write(String s, byte[] bytes) {
// hack in reinitialization of process info classes
if (!runtimeReinitializedClassBuildItems.isEmpty()) {
MethodCreator runtimeReinitializedClasses = file
.getMethodCreator("runtimeReinitializedClasses", void.class)
.getMethodCreator("runtimeReinitializedClasses", Class[].class)
.setModifiers(Modifier.PRIVATE | Modifier.STATIC);

ResultHandle thisClass = runtimeReinitializedClasses.loadClassFromTCCL(GRAAL_FEATURE);
ResultHandle cl = runtimeReinitializedClasses.invokeVirtualMethod(
ofMethod(Class.class, "getClassLoader", ClassLoader.class),
thisClass);
ResultHandle quarkus = runtimeReinitializedClasses.load("Quarkus");
ResultHandle imageSingleton = runtimeReinitializedClasses.invokeStaticMethod(IMAGE_SINGLETONS_LOOKUP,
runtimeReinitializedClasses.loadClassFromTCCL(RUNTIME_CLASS_INITIALIZATION_SUPPORT));
for (RuntimeReinitializedClassBuildItem runtimeReinitializedClass : runtimeReinitializedClassBuildItems) {
// ResultHandle quarkus = runtimeReinitializedClasses.load("Quarkus");
// ResultHandle imageSingleton = runtimeReinitializedClasses.invokeStaticMethod(IMAGE_SINGLETONS_LOOKUP,
// runtimeReinitializedClasses.loadClassFromTCCL(RUNTIME_CLASS_INITIALIZATION_SUPPORT));
// for (RuntimeReinitializedClassBuildItem runtimeReinitializedClass : runtimeReinitializedClassBuildItems) {
// TryBlock tc = runtimeReinitializedClasses.tryBlock();
// ResultHandle clazz = tc.invokeStaticMethod(
// ofMethod(Class.class, "forName", Class.class, String.class, boolean.class, ClassLoader.class),
// tc.load(runtimeReinitializedClass.getClassName()), tc.load(false), cl);
// tc.invokeInterfaceMethod(RERUN_INITIALIZATION, imageSingleton, clazz, quarkus);
//
// CatchBlockCreator cc = tc.addCatch(Throwable.class);
// cc.invokeVirtualMethod(ofMethod(Throwable.class, "printStackTrace", void.class), cc.getCaughtException());
// }
// runtimeReinitializedClasses.returnVoid();

// overallCatch.invokeStaticMethod(runtimeReinitializedClasses.getMethodDescriptor());

ResultHandle classesArray = runtimeReinitializedClasses.newArray(Class.class,
runtimeReinitializedClasses.load(runtimeInitializedClassBuildItems.size()));
for (int i = 0; i < runtimeReinitializedClassBuildItems.size(); i++) {
TryBlock tc = runtimeReinitializedClasses.tryBlock();
ResultHandle clazz = tc.invokeStaticMethod(
ofMethod(Class.class, "forName", Class.class, String.class, boolean.class, ClassLoader.class),
tc.load(runtimeReinitializedClass.getClassName()), tc.load(false), cl);
tc.invokeInterfaceMethod(RERUN_INITIALIZATION, imageSingleton, clazz, quarkus);

tc.load(runtimeReinitializedClassBuildItems.get(i).getClassName()), tc.load(false), cl);
tc.writeArrayValue(classesArray, i, clazz);
CatchBlockCreator cc = tc.addCatch(Throwable.class);
cc.invokeVirtualMethod(ofMethod(Throwable.class, "printStackTrace", void.class), cc.getCaughtException());
}
runtimeReinitializedClasses.returnVoid();
runtimeReinitializedClasses.returnValue(classesArray);

overallCatch.invokeStaticMethod(runtimeReinitializedClasses.getMethodDescriptor());
ResultHandle classes = overallCatch.invokeStaticMethod(runtimeReinitializedClasses.getMethodDescriptor());
overallCatch.invokeStaticMethod(INITIALIZE_CLASSES_AT_RUN_TIME, classes);
}

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

0 comments on commit eca848e

Please sign in to comment.