@@ -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