< prev index next >

src/hotspot/share/cds/dynamicArchive.cpp

Print this page
*** 369,10 ***
--- 369,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 (AOTMetaspace::in_aot_cache_static_region(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.

*** 438,18 ***
    if (_dynamic_archive_array_klasses != nullptr) {
      for (int i = 0; i < _dynamic_archive_array_klasses->length(); i++) {
        ObjArrayKlass* oak = _dynamic_archive_array_klasses->at(i);
        Klass* elm = oak->element_klass();
        assert(AOTMetaspace::in_aot_cache_static_region((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());
    }
  }
--- 441,20 ---
    if (_dynamic_archive_array_klasses != nullptr) {
      for (int i = 0; i < _dynamic_archive_array_klasses->length(); i++) {
        ObjArrayKlass* oak = _dynamic_archive_array_klasses->at(i);
        Klass* elm = oak->element_klass();
        assert(AOTMetaspace::in_aot_cache_static_region((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 >