< prev index next >

src/hotspot/share/cds/dynamicArchive.cpp

Print this page
*** 364,10 ***
--- 364,13 ---
  
  void DynamicArchiveBuilder::gather_array_klasses() {
    for (int i = 0; i < klasses()->length(); i++) {
      if (klasses()->at(i)->is_objArray_klass()) {
        ObjArrayKlass* oak = ObjArrayKlass::cast(klasses()->at(i));
+       if (oak->is_refined_objArray_klass()) {
+         oak = ObjArrayKlass::cast(oak->super());
+       }
        Klass* elem = oak->element_klass();
        if (MetaspaceShared::is_shared_static(elem)) {
          // Only capture the array klass whose element_klass is in the static archive.
          // During run time, setup (see DynamicArchive::setup_array_klasses()) is needed
          // so that the element_klass can find its array klasses from the dynamic archive.

*** 434,18 ***
        ObjArrayKlass* oak = _dynamic_archive_array_klasses->at(i);
        assert(!oak->is_typeArray_klass(), "all type array classes must be in static archive");
  
        Klass* elm = oak->element_klass();
        assert(MetaspaceShared::is_shared_static((void*)elm), "must be");
! 
!       if (elm->is_instance_klass()) {
!         assert(InstanceKlass::cast(elm)->array_klasses() == nullptr, "must be");
!         InstanceKlass::cast(elm)->set_array_klasses(oak);
!       } else {
!         assert(elm->is_array_klass(), "sanity");
!         assert(ArrayKlass::cast(elm)->higher_dimension() == nullptr, "must be");
!         ArrayKlass::cast(elm)->set_higher_dimension(oak);
        }
      }
      log_debug(aot)("Total array klasses read from dynamic archive: %d", _dynamic_archive_array_klasses->length());
    }
  }
--- 437,20 ---
        ObjArrayKlass* oak = _dynamic_archive_array_klasses->at(i);
        assert(!oak->is_typeArray_klass(), "all type array classes must be in static archive");
  
        Klass* elm = oak->element_klass();
        assert(MetaspaceShared::is_shared_static((void*)elm), "must be");
!       // Higher dimension may have been set when doing setup on ObjArrayKlass
!       if (!oak->is_refined_objArray_klass()) {
!         if (elm->is_instance_klass()) {
!           assert(InstanceKlass::cast(elm)->array_klasses() == nullptr, "must be");
!           InstanceKlass::cast(elm)->set_array_klasses(oak);
!         } else {
!           assert(elm->is_array_klass(), "sanity");
!           assert(ArrayKlass::cast(elm)->higher_dimension() == nullptr, "must be");
+           ArrayKlass::cast(elm)->set_higher_dimension(oak);
+         }
        }
      }
      log_debug(aot)("Total array klasses read from dynamic archive: %d", _dynamic_archive_array_klasses->length());
    }
  }
< prev index next >