@@ -207,11 +207,36 @@ void AOTArtifactFinder::add_aot_inited_class(InstanceKlass* ik) {
207207 }
208208}
209209
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+
210215void 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+
211222 bool created;
212223 _seen_classes->put_if_absent (ik, &created);
213224 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+
215240 if (CDSConfig::is_dumping_final_static_archive () && ik->is_shared_unregistered_class ()) {
216241 // The following are not appliable to unregistered classes
217242 return ;
@@ -229,7 +254,7 @@ void AOTArtifactFinder::add_cached_type_array_class(TypeArrayKlass* tak) {
229254 bool created;
230255 _seen_classes->put_if_absent (tak, &created);
231256 if (created) {
232- _all_cached_classes-> append (tak);
257+ append_to_all_cached_classes (tak);
233258 scan_oops_in_array_class (tak);
234259 }
235260}
0 commit comments