< prev index next >

src/hotspot/share/oops/klass.cpp

Print this page

 253   tty->print_cr("Error: find_field called on a klass oop."
 254                 " Likely error: reflection method does not correctly"
 255                 " wrap return value in a mirror object.");
 256 #endif
 257   ShouldNotReachHere();
 258   return nullptr;
 259 }
 260 
 261 Method* Klass::uncached_lookup_method(const Symbol* name, const Symbol* signature,
 262                                       OverpassLookupMode overpass_mode,
 263                                       PrivateLookupMode private_mode) const {
 264 #ifdef ASSERT
 265   tty->print_cr("Error: uncached_lookup_method called on a klass oop."
 266                 " Likely error: reflection method does not correctly"
 267                 " wrap return value in a mirror object.");
 268 #endif
 269   ShouldNotReachHere();
 270   return nullptr;
 271 }
 272 
 273 static markWord make_prototype(const Klass* kls) {
 274   markWord prototype = markWord::prototype();
 275 #ifdef _LP64
 276   if (UseCompactObjectHeaders) {
 277     // With compact object headers, the narrow Klass ID is part of the mark word.
 278     // We therefore seed the mark word with the narrow Klass ID.
 279     precond(CompressedKlassPointers::is_encodable(kls));
 280     const narrowKlass nk = CompressedKlassPointers::encode(const_cast<Klass*>(kls));
 281     prototype = prototype.set_narrow_klass(nk);
 282   }
 283 #endif
 284   return prototype;
 285 }
 286 
 287 void* Klass::operator new(size_t size, ClassLoaderData* loader_data, size_t word_size, TRAPS) throw() {
 288   return Metaspace::allocate(loader_data, word_size, MetaspaceObj::ClassType, THREAD);
 289 }
 290 
 291 Klass::Klass() : _kind(UnknownKlassKind) {
 292   assert(CDSConfig::is_dumping_static_archive() || CDSConfig::is_using_archive(), "only for cds");
 293 }
 294 
 295 // "Normal" instantiation is preceded by a MetaspaceObj allocation
 296 // which zeros out memory - calloc equivalent.
 297 // The constructor is also used from CppVtableCloner,
 298 // which doesn't zero out the memory before calling the constructor.
 299 Klass::Klass(KlassKind kind) : _kind(kind),
 300                                _prototype_header(make_prototype(this)),
 301                                _shared_class_path_index(-1) {

 302   CDS_ONLY(_aot_class_flags = 0;)
 303   CDS_JAVA_HEAP_ONLY(_archived_mirror_index = -1;)
 304   _primary_supers[0] = this;
 305   set_super_check_offset(in_bytes(primary_supers_offset()));
 306 }
 307 
 308 jint Klass::array_layout_helper(BasicType etype) {
 309   assert(etype >= T_BOOLEAN && etype <= T_OBJECT, "valid etype");
 310   // Note that T_ARRAY is not allowed here.
 311   int  hsize = arrayOopDesc::base_offset_in_bytes(etype);
 312   int  esize = type2aelembytes(etype);
 313   bool isobj = (etype == T_OBJECT);
 314   int  tag   =  isobj ? _lh_array_tag_obj_value : _lh_array_tag_type_value;
 315   int lh = array_layout_helper(tag, hsize, etype, exact_log2(esize));
 316 
 317   assert(lh < (int)_lh_neutral_value, "must look like an array layout");
 318   assert(layout_helper_is_array(lh), "correct kind");
 319   assert(layout_helper_is_objArray(lh) == isobj, "correct kind");
 320   assert(layout_helper_is_typeArray(lh) == !isobj, "correct kind");
 321   assert(layout_helper_header_size(lh) == hsize, "correct decode");
 322   assert(layout_helper_element_type(lh) == etype, "correct decode");
 323   assert(1 << layout_helper_log2_element_size(lh) == esize, "correct decode");
 324 
 325   return lh;
 326 }
 327 
 328 int Klass::modifier_flags() const {
 329   int mods = java_lang_Class::modifiers(java_mirror());
 330   assert(mods == compute_modifier_flags(), "should be same");
 331   return mods;
 332 }
 333 
 334 bool Klass::can_be_primary_super_slow() const {
 335   if (super() == nullptr)
 336     return true;
 337   else if (super()->super_depth() >= primary_super_limit()-1)
 338     return false;
 339   else

1012 void Klass::print_on(outputStream* st) const {
1013   ResourceMark rm;
1014   // print title
1015   st->print("%s", internal_name());
1016   print_address_on(st);
1017   st->cr();
1018 }
1019 
1020 #define BULLET  " - "
1021 
1022 // Caller needs ResourceMark
1023 void Klass::oop_print_on(oop obj, outputStream* st) {
1024   // print title
1025   st->print_cr("%s ", internal_name());
1026   obj->print_address_on(st);
1027 
1028   if (WizardMode) {
1029      // print header
1030      obj->mark().print_on(st);
1031      st->cr();
1032      if (UseCompactObjectHeaders) {
1033        st->print(BULLET"prototype_header: " INTPTR_FORMAT, _prototype_header.value());
1034        st->cr();
1035      }
1036   }
1037 
1038   // print class
1039   st->print(BULLET"klass: ");
1040   obj->klass()->print_value_on(st);
1041   st->print(BULLET"flags: "); _misc_flags.print_on(st); st->cr();
1042   st->cr();
1043 }
1044 
1045 void Klass::oop_print_value_on(oop obj, outputStream* st) {
1046   // print title
1047   ResourceMark rm;              // Cannot print in debug mode without this
1048   st->print("%s", internal_name());
1049   obj->print_address_on(st);
1050 }
1051 
1052 // Verification
1053 
1054 void Klass::verify_on(outputStream* st) {
1055 

1067     Klass* ko = secondary_super_cache();
1068     guarantee(ko->is_klass(), "should be klass");
1069   }
1070   for ( uint i = 0; i < primary_super_limit(); i++ ) {
1071     Klass* ko = _primary_supers[i];
1072     if (ko != nullptr) {
1073       guarantee(ko->is_klass(), "should be klass");
1074     }
1075   }
1076 
1077   if (java_mirror_no_keepalive() != nullptr) {
1078     guarantee(java_lang_Class::is_instance(java_mirror_no_keepalive()), "should be instance");
1079   }
1080 }
1081 
1082 void Klass::oop_verify_on(oop obj, outputStream* st) {
1083   guarantee(oopDesc::is_oop(obj),  "should be oop");
1084   guarantee(obj->klass()->is_klass(), "klass field is not a klass");
1085 }
1086 


































1087 // Note: this function is called with an address that may or may not be a Klass.
1088 // The point is not to assert it is but to check if it could be.
1089 bool Klass::is_valid(Klass* k) {
1090   if (!is_aligned(k, sizeof(MetaWord))) return false;
1091   if ((size_t)k < os::min_page_size()) return false;
1092 
1093   if (!os::is_readable_range(k, k + 1)) return false;
1094   if (!Metaspace::contains(k)) return false;
1095 
1096   if (!Symbol::is_valid(k->name())) return false;
1097   return ClassLoaderDataGraph::is_valid(k->class_loader_data());
1098 }
1099 
1100 Method* Klass::method_at_vtable(int index)  {
1101 #ifndef PRODUCT
1102   assert(index >= 0, "valid vtable index");
1103   if (DebugVtables) {
1104     verify_vtable_index(index);
1105   }
1106 #endif

 253   tty->print_cr("Error: find_field called on a klass oop."
 254                 " Likely error: reflection method does not correctly"
 255                 " wrap return value in a mirror object.");
 256 #endif
 257   ShouldNotReachHere();
 258   return nullptr;
 259 }
 260 
 261 Method* Klass::uncached_lookup_method(const Symbol* name, const Symbol* signature,
 262                                       OverpassLookupMode overpass_mode,
 263                                       PrivateLookupMode private_mode) const {
 264 #ifdef ASSERT
 265   tty->print_cr("Error: uncached_lookup_method called on a klass oop."
 266                 " Likely error: reflection method does not correctly"
 267                 " wrap return value in a mirror object.");
 268 #endif
 269   ShouldNotReachHere();
 270   return nullptr;
 271 }
 272 














 273 void* Klass::operator new(size_t size, ClassLoaderData* loader_data, size_t word_size, TRAPS) throw() {
 274   return Metaspace::allocate(loader_data, word_size, MetaspaceObj::ClassType, THREAD);
 275 }
 276 
 277 Klass::Klass() : _kind(UnknownKlassKind) {
 278   assert(CDSConfig::is_dumping_static_archive() || CDSConfig::is_using_archive(), "only for cds");
 279 }
 280 
 281 // "Normal" instantiation is preceded by a MetaspaceObj allocation
 282 // which zeros out memory - calloc equivalent.
 283 // The constructor is also used from CppVtableCloner,
 284 // which doesn't zero out the memory before calling the constructor.
 285 Klass::Klass(KlassKind kind, markWord prototype_header) : _kind(kind),

 286                                _shared_class_path_index(-1) {
 287   set_prototype_header(make_prototype_header(this, prototype_header));
 288   CDS_ONLY(_aot_class_flags = 0;)
 289   CDS_JAVA_HEAP_ONLY(_archived_mirror_index = -1;)
 290   _primary_supers[0] = this;
 291   set_super_check_offset(in_bytes(primary_supers_offset()));
 292 }
 293 
 294 jint Klass::array_layout_helper(BasicType etype) {
 295   assert(etype >= T_BOOLEAN && etype <= T_OBJECT, "valid etype");
 296   // Note that T_ARRAY is not allowed here.
 297   int  hsize = arrayOopDesc::base_offset_in_bytes(etype);
 298   int  esize = type2aelembytes(etype);
 299   bool isobj = (etype == T_OBJECT);
 300   int  tag   =  isobj ? _lh_array_tag_ref_value : _lh_array_tag_type_value;
 301   int lh = array_layout_helper(tag, false, hsize, etype, exact_log2(esize));
 302 
 303   assert(lh < (int)_lh_neutral_value, "must look like an array layout");
 304   assert(layout_helper_is_array(lh), "correct kind");
 305   assert(layout_helper_is_refArray(lh) == isobj, "correct kind");
 306   assert(layout_helper_is_typeArray(lh) == !isobj, "correct kind");
 307   assert(layout_helper_header_size(lh) == hsize, "correct decode");
 308   assert(layout_helper_element_type(lh) == etype, "correct decode");
 309   assert(1 << layout_helper_log2_element_size(lh) == esize, "correct decode");
 310 
 311   return lh;
 312 }
 313 
 314 int Klass::modifier_flags() const {
 315   int mods = java_lang_Class::modifiers(java_mirror());
 316   assert(mods == compute_modifier_flags(), "should be same");
 317   return mods;
 318 }
 319 
 320 bool Klass::can_be_primary_super_slow() const {
 321   if (super() == nullptr)
 322     return true;
 323   else if (super()->super_depth() >= primary_super_limit()-1)
 324     return false;
 325   else

 998 void Klass::print_on(outputStream* st) const {
 999   ResourceMark rm;
1000   // print title
1001   st->print("%s", internal_name());
1002   print_address_on(st);
1003   st->cr();
1004 }
1005 
1006 #define BULLET  " - "
1007 
1008 // Caller needs ResourceMark
1009 void Klass::oop_print_on(oop obj, outputStream* st) {
1010   // print title
1011   st->print_cr("%s ", internal_name());
1012   obj->print_address_on(st);
1013 
1014   if (WizardMode) {
1015      // print header
1016      obj->mark().print_on(st);
1017      st->cr();
1018      st->print(BULLET"prototype_header: " INTPTR_FORMAT, _prototype_header.value());
1019      st->cr();


1020   }
1021 
1022   // print class
1023   st->print(BULLET"klass: ");
1024   obj->klass()->print_value_on(st);
1025   st->print(BULLET"flags: "); _misc_flags.print_on(st); st->cr();
1026   st->cr();
1027 }
1028 
1029 void Klass::oop_print_value_on(oop obj, outputStream* st) {
1030   // print title
1031   ResourceMark rm;              // Cannot print in debug mode without this
1032   st->print("%s", internal_name());
1033   obj->print_address_on(st);
1034 }
1035 
1036 // Verification
1037 
1038 void Klass::verify_on(outputStream* st) {
1039 

1051     Klass* ko = secondary_super_cache();
1052     guarantee(ko->is_klass(), "should be klass");
1053   }
1054   for ( uint i = 0; i < primary_super_limit(); i++ ) {
1055     Klass* ko = _primary_supers[i];
1056     if (ko != nullptr) {
1057       guarantee(ko->is_klass(), "should be klass");
1058     }
1059   }
1060 
1061   if (java_mirror_no_keepalive() != nullptr) {
1062     guarantee(java_lang_Class::is_instance(java_mirror_no_keepalive()), "should be instance");
1063   }
1064 }
1065 
1066 void Klass::oop_verify_on(oop obj, outputStream* st) {
1067   guarantee(oopDesc::is_oop(obj),  "should be oop");
1068   guarantee(obj->klass()->is_klass(), "klass field is not a klass");
1069 }
1070 
1071 #ifdef ASSERT
1072 void Klass::validate_array_description(const ArrayDescription& ad) {
1073   if (is_identity_class() || is_array_klass() || is_interface() ||
1074       (is_instance_klass() && InstanceKlass::cast(this)->access_flags().is_abstract())) {
1075     assert(ad._layout_kind == LayoutKind::REFERENCE, "Cannot support flattening");
1076     assert(ad._kind == KlassKind::RefArrayKlassKind, "Must be a reference array");
1077   } else {
1078     assert(is_inline_klass(), "Must be");
1079     InlineKlass* ik = InlineKlass::cast(this);
1080     switch(ad._layout_kind) {
1081       case LayoutKind::BUFFERED:
1082         fatal("Invalid layout for an array");
1083         break;
1084       case LayoutKind::NULL_FREE_ATOMIC_FLAT:
1085         assert(ik->has_null_free_atomic_layout(), "Sanity check");
1086         break;
1087       case LayoutKind::NULL_FREE_NON_ATOMIC_FLAT:
1088         assert(ik->has_null_free_non_atomic_layout(), "Sanity check");
1089         break;
1090       case LayoutKind::NULLABLE_ATOMIC_FLAT:
1091         assert(ik->has_nullable_atomic_layout(), "Sanity check");
1092         break;
1093       case LayoutKind::NULLABLE_NON_ATOMIC_FLAT:
1094         assert(ik->has_nullable_non_atomic_layout(), "Sanity check)");
1095         break;
1096       case LayoutKind::REFERENCE:
1097         break;
1098       default:
1099         ShouldNotReachHere();
1100     }
1101   }
1102 }
1103 #endif // ASSERT
1104 
1105 // Note: this function is called with an address that may or may not be a Klass.
1106 // The point is not to assert it is but to check if it could be.
1107 bool Klass::is_valid(Klass* k) {
1108   if (!is_aligned(k, sizeof(MetaWord))) return false;
1109   if ((size_t)k < os::min_page_size()) return false;
1110 
1111   if (!os::is_readable_range(k, k + 1)) return false;
1112   if (!Metaspace::contains(k)) return false;
1113 
1114   if (!Symbol::is_valid(k->name())) return false;
1115   return ClassLoaderDataGraph::is_valid(k->class_loader_data());
1116 }
1117 
1118 Method* Klass::method_at_vtable(int index)  {
1119 #ifndef PRODUCT
1120   assert(index >= 0, "valid vtable index");
1121   if (DebugVtables) {
1122     verify_vtable_index(index);
1123   }
1124 #endif
< prev index next >