< prev index next >

src/hotspot/share/cds/cdsEnumKlass.cpp

Print this page
*** 87,14 ***
    if (fd.field_type() != T_OBJECT && fd.field_type() != T_ARRAY) {
      guarantee(false, "static field %s::%s must be T_OBJECT or T_ARRAY",
                ik->external_name(), fd.name()->as_C_string());
    }
    oop oop_field = mirror->obj_field(fd.offset());
    if (oop_field == nullptr) {
      guarantee(false, "static field %s::%s must not be null",
                ik->external_name(), fd.name()->as_C_string());
!   } else if (oop_field->klass() != ik && oop_field->klass() != ik->array_klass_or_null()) {
      guarantee(false, "static field %s::%s is of the wrong type",
                ik->external_name(), fd.name()->as_C_string());
    }
    bool success = HeapShared::archive_reachable_objects_from(level, subgraph_info, oop_field);
    assert(success, "VM should have exited with unarchivable objects for _level > 1");
--- 87,17 ---
    if (fd.field_type() != T_OBJECT && fd.field_type() != T_ARRAY) {
      guarantee(false, "static field %s::%s must be T_OBJECT or T_ARRAY",
                ik->external_name(), fd.name()->as_C_string());
    }
    oop oop_field = mirror->obj_field(fd.offset());
+   // There should be no oops for ObjArrayKlass but InstanceKlass::array_klasses holds a list of ObjArrayKlass,
+   // therefore we need the super of the refined array klass.
+   Klass* oop_field_klass = oop_field->is_refined_objArray() ? oop_field->klass()->super() : oop_field->klass();
    if (oop_field == nullptr) {
      guarantee(false, "static field %s::%s must not be null",
                ik->external_name(), fd.name()->as_C_string());
!   } else if (oop_field_klass != ik && oop_field_klass != ik->array_klass_or_null()) {
      guarantee(false, "static field %s::%s is of the wrong type",
                ik->external_name(), fd.name()->as_C_string());
    }
    bool success = HeapShared::archive_reachable_objects_from(level, subgraph_info, oop_field);
    assert(success, "VM should have exited with unarchivable objects for _level > 1");
< prev index next >