Skip to content

Commit 527e5a0

Browse files
committed
Refactor: Reduce code duplication in runtime(re)initialization
1 parent e8072b1 commit 527e5a0

File tree

1 file changed

+12
-29
lines changed

1 file changed

+12
-29
lines changed

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

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public void write(String s, byte[] bytes) {
112112
}
113113
}
114114

115-
if (!runtimeInitializedClassBuildItems.isEmpty()) {
115+
if (!runtimeInitializedClassBuildItems.isEmpty() || !runtimeReinitializedClassBuildItems.isEmpty()) {
116116
// Class[] runtimeInitializedClasses()
117117
MethodCreator runtimeInitializedClasses = file
118118
.getMethodCreator("runtimeInitializedClasses", Class[].class)
@@ -123,7 +123,8 @@ public void write(String s, byte[] bytes) {
123123
ofMethod(Class.class, "getClassLoader", ClassLoader.class),
124124
thisClass);
125125
ResultHandle classesArray = runtimeInitializedClasses.newArray(Class.class,
126-
runtimeInitializedClasses.load(runtimeInitializedClassBuildItems.size()));
126+
runtimeInitializedClasses
127+
.load(runtimeInitializedClassBuildItems.size() + runtimeReinitializedClassBuildItems.size()));
127128
for (int i = 0; i < runtimeInitializedClassBuildItems.size(); i++) {
128129
TryBlock tc = runtimeInitializedClasses.tryBlock();
129130
ResultHandle clazz = tc.invokeStaticMethod(
@@ -133,6 +134,15 @@ public void write(String s, byte[] bytes) {
133134
CatchBlockCreator cc = tc.addCatch(Throwable.class);
134135
cc.invokeVirtualMethod(ofMethod(Throwable.class, "printStackTrace", void.class), cc.getCaughtException());
135136
}
137+
for (int i = 0; i < runtimeReinitializedClassBuildItems.size(); i++) {
138+
TryBlock tc = runtimeInitializedClasses.tryBlock();
139+
ResultHandle clazz = tc.invokeStaticMethod(
140+
ofMethod(Class.class, "forName", Class.class, String.class, boolean.class, ClassLoader.class),
141+
tc.load(runtimeReinitializedClassBuildItems.get(i).getClassName()), tc.load(false), cl);
142+
tc.writeArrayValue(classesArray, i, clazz);
143+
CatchBlockCreator cc = tc.addCatch(Throwable.class);
144+
cc.invokeVirtualMethod(ofMethod(Throwable.class, "printStackTrace", void.class), cc.getCaughtException());
145+
}
136146
runtimeInitializedClasses.returnValue(classesArray);
137147

138148
ResultHandle classes = overallCatch.invokeStaticMethod(runtimeInitializedClasses.getMethodDescriptor());
@@ -160,33 +170,6 @@ public void write(String s, byte[] bytes) {
160170
overallCatch.invokeStaticMethod(INITIALIZE_PACKAGES_AT_RUN_TIME, packages);
161171
}
162172

163-
// hack in reinitialization of process info classes
164-
if (!runtimeReinitializedClassBuildItems.isEmpty()) {
165-
MethodCreator runtimeReinitializedClasses = file
166-
.getMethodCreator("runtimeReinitializedClasses", Class[].class)
167-
.setModifiers(Modifier.PRIVATE | Modifier.STATIC);
168-
169-
ResultHandle thisClass = runtimeReinitializedClasses.loadClassFromTCCL(GRAAL_FEATURE);
170-
ResultHandle cl = runtimeReinitializedClasses.invokeVirtualMethod(
171-
ofMethod(Class.class, "getClassLoader", ClassLoader.class),
172-
thisClass);
173-
ResultHandle classesArray = runtimeReinitializedClasses.newArray(Class.class,
174-
runtimeReinitializedClasses.load(runtimeReinitializedClassBuildItems.size()));
175-
for (int i = 0; i < runtimeReinitializedClassBuildItems.size(); i++) {
176-
TryBlock tc = runtimeReinitializedClasses.tryBlock();
177-
ResultHandle clazz = tc.invokeStaticMethod(
178-
ofMethod(Class.class, "forName", Class.class, String.class, boolean.class, ClassLoader.class),
179-
tc.load(runtimeReinitializedClassBuildItems.get(i).getClassName()), tc.load(false), cl);
180-
tc.writeArrayValue(classesArray, i, clazz);
181-
CatchBlockCreator cc = tc.addCatch(Throwable.class);
182-
cc.invokeVirtualMethod(ofMethod(Throwable.class, "printStackTrace", void.class), cc.getCaughtException());
183-
}
184-
runtimeReinitializedClasses.returnValue(classesArray);
185-
186-
ResultHandle classes = overallCatch.invokeStaticMethod(runtimeReinitializedClasses.getMethodDescriptor());
187-
overallCatch.invokeStaticMethod(INITIALIZE_CLASSES_AT_RUN_TIME, classes);
188-
}
189-
190173
// Ensure registration of fields being accessed through unsafe is done last to ensure that the class
191174
// initialization configuration is done first. Registering the fields before configuring class initialization
192175
// may results in classes being marked for runtime initialization even if not explicitly requested.

0 commit comments

Comments
 (0)