< 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 

 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 
< prev index next >