@@ -207,11 +207,36 @@ void AOTArtifactFinder::add_aot_inited_class(InstanceKlass* ik) {
207
207
}
208
208
}
209
209
210
+ void AOTArtifactFinder::append_to_all_cached_classes (Klass* k) {
211
+ precond (!SystemDictionaryShared::should_be_excluded (k));
212
+ _all_cached_classes->append (k);
213
+ }
214
+
210
215
void AOTArtifactFinder::add_cached_instance_class (InstanceKlass* ik) {
216
+ if (CDSConfig::is_dumping_dynamic_archive () && ik->is_shared ()) {
217
+ // This class is already included in the base archive. No need to cache
218
+ // it again in the dynamic archive.
219
+ return ;
220
+ }
221
+
211
222
bool created;
212
223
_seen_classes->put_if_absent (ik, &created);
213
224
if (created) {
214
- _all_cached_classes->append (ik);
225
+ append_to_all_cached_classes (ik);
226
+
227
+ // All super types must be added.
228
+ InstanceKlass* s = ik->java_super ();
229
+ if (s != nullptr ) {
230
+ add_cached_instance_class (s);
231
+ }
232
+
233
+ Array<InstanceKlass*>* interfaces = ik->local_interfaces ();
234
+ int len = interfaces->length ();
235
+ for (int i = 0 ; i < len; i++) {
236
+ InstanceKlass* intf = interfaces->at (i);
237
+ add_cached_instance_class (intf);
238
+ }
239
+
215
240
if (CDSConfig::is_dumping_final_static_archive () && ik->is_shared_unregistered_class ()) {
216
241
// The following are not appliable to unregistered classes
217
242
return ;
@@ -229,7 +254,7 @@ void AOTArtifactFinder::add_cached_type_array_class(TypeArrayKlass* tak) {
229
254
bool created;
230
255
_seen_classes->put_if_absent (tak, &created);
231
256
if (created) {
232
- _all_cached_classes-> append (tak);
257
+ append_to_all_cached_classes (tak);
233
258
scan_oops_in_array_class (tak);
234
259
}
235
260
}
0 commit comments