< prev index next >

src/hotspot/share/oops/klass.hpp

Print this page

 49 // a vtbl and does the C++ dispatch depending on the object's
 50 // actual type.  (See oop.inline.hpp for some of the forwarding code.)
 51 // ALL FUNCTIONS IMPLEMENTING THIS DISPATCH ARE PREFIXED WITH "oop_"!
 52 
 53 // Forward declarations.
 54 template <class T> class Array;
 55 template <class T> class GrowableArray;
 56 class ClassLoaderData;
 57 class fieldDescriptor;
 58 class klassVtable;
 59 class ModuleEntry;
 60 class PackageEntry;
 61 class vtableEntry;
 62 
 63 class Klass : public Metadata {
 64 
 65   friend class VMStructs;
 66   friend class JVMCIVMStructs;
 67  public:
 68   // Klass Kinds for all subclasses of Klass
 69   enum KlassKind : u2 {
 70     InstanceKlassKind,
 71     InstanceRefKlassKind,
 72     InstanceMirrorKlassKind,
 73     InstanceClassLoaderKlassKind,
 74     InstanceStackChunkKlassKind,
 75     TypeArrayKlassKind,
 76     ObjArrayKlassKind,
 77     UnknownKlassKind
 78   };
 79 
 80   static const uint KLASS_KIND_COUNT = ObjArrayKlassKind + 1;




 81  protected:
 82 
 83   // If you add a new field that points to any metaspace object, you
 84   // must add this field to Klass::metaspace_pointers_do().
 85 
 86   // note: put frequently-used fields together at start of klass structure
 87   // for better cache behavior (may not make much of a difference but sure won't hurt)
 88   enum { _primary_super_limit = 8 };
 89 
 90   // The "layout helper" is a combined descriptor of object layout.
 91   // For klasses which are neither instance nor array, the value is zero.
 92   //
 93   // For instances, layout helper is a positive number, the instance size.
 94   // This size is already passed through align_object_size and scaled to bytes.
 95   // The low order bit is set if instances of this class cannot be
 96   // allocated using the fastpath.
 97   //
 98   // For arrays, layout helper is a negative number, containing four
 99   // distinct bytes, as follows:
100   //    MSB:[tag, hsz, ebt, log2(esz)]:LSB
101   // where:
102   //    tag is 0x80 if the elements are oops, 0xC0 if non-oops
103   //    hsz is array header size in bytes (i.e., offset of first element)
104   //    ebt is the BasicType of the elements
105   //    esz is the element size in bytes
106   // This packed word is arranged so as to be quickly unpacked by the
107   // various fast paths that use the various subfields.
108   //
109   // The esz bits can be used directly by a SLL instruction, without masking.
110   //
111   // Note that the array-kind tag looks like 0x00 for instance klasses,
112   // since their length in bytes is always less than 24Mb.
113   //
114   // Final note:  This comes first, immediately after C++ vtable,
115   // because it is frequently queried.
116   jint _layout_helper;
117 
118   // Klass kind used to resolve the runtime type of the instance.
119   //  - Used to implement devirtualized oop closure dispatching.
120   //  - Various type checking in the JVM
121   const KlassKind _kind;
122 

185     // or classpath.
186     _is_generated_shared_class             = 1 << 5,
187     // archived mirror already initialized by AOT-cache assembly: no further need to call <clinit>
188     _has_aot_initialized_mirror            = 1 << 6,
189   };
190 #endif
191 
192   int _vtable_len;              // vtable length. This field may be read very often when we
193                                 // have lots of itable dispatches (e.g., lambdas and streams).
194                                 // Keep it away from the beginning of a Klass to avoid cacheline
195                                 // contention that may happen when a nearby object is modified.
196 
197   CDS_JAVA_HEAP_ONLY(int _archived_mirror_index;)
198 
199 public:
200 
201   JFR_ONLY(DEFINE_TRACE_ID_FIELD;)
202 
203 protected:
204 
205   Klass(KlassKind kind);
206   Klass();
207 
208  public:
209   int kind() { return _kind; }
210 
211   enum class DefaultsLookupMode { find, skip };
212   enum class OverpassLookupMode { find, skip };
213   enum class StaticLookupMode   { find, skip };
214   enum class PrivateLookupMode  { find, skip };
215 
216   virtual bool is_klass() const { return true; }
217 
218   // super() cannot be InstanceKlass* -- Java arrays are covariant, and _super is used
219   // to implement that. NB: the _super of "[Ljava/lang/Integer;" is "[Ljava/lang/Number;"
220   // If this is not what your code expects, you're probably looking for:
221   // - Klass::java_super() - if you have a Klass*
222   // - InstanceKlass::super() - if you have an InstanceKlass* ik, ik->super() returns InstanceKlass*.
223   Klass* super() const               { return _super; }
224   void set_super(Klass* k)           { _super = k; }
225 

433   static ByteSize layout_helper_offset()         { return byte_offset_of(Klass, _layout_helper); }
434   static ByteSize access_flags_offset()          { return byte_offset_of(Klass, _access_flags); }
435 #if INCLUDE_JVMCI
436   static ByteSize subklass_offset()              { return byte_offset_of(Klass, _subklass); }
437   static ByteSize next_sibling_offset()          { return byte_offset_of(Klass, _next_sibling); }
438 #endif
439   static ByteSize secondary_supers_bitmap_offset()
440                                                  { return byte_offset_of(Klass, _secondary_supers_bitmap); }
441   static ByteSize hash_slot_offset()             { return byte_offset_of(Klass, _hash_slot); }
442   static ByteSize misc_flags_offset()            { return byte_offset_of(Klass, _misc_flags._flags); }
443 
444   // Unpacking layout_helper:
445   static const int _lh_neutral_value           = 0;  // neutral non-array non-instance value
446   static const int _lh_instance_slow_path_bit  = 0x01;
447   static const int _lh_log2_element_size_shift = BitsPerByte*0;
448   static const int _lh_log2_element_size_mask  = BitsPerLong-1;
449   static const int _lh_element_type_shift      = BitsPerByte*1;
450   static const int _lh_element_type_mask       = right_n_bits(BitsPerByte);  // shifted mask
451   static const int _lh_header_size_shift       = BitsPerByte*2;
452   static const int _lh_header_size_mask        = right_n_bits(BitsPerByte);  // shifted mask
453   static const int _lh_array_tag_bits          = 2;
454   static const int _lh_array_tag_shift         = BitsPerInt - _lh_array_tag_bits;
455   static const int _lh_array_tag_obj_value     = ~0x01;   // 0x80000000 >> 30
456 
457   static const unsigned int _lh_array_tag_type_value = 0Xffffffff; // ~0x00,  // 0xC0000000 >> 30








458 
459   static int layout_helper_size_in_bytes(jint lh) {
460     assert(lh > (jint)_lh_neutral_value, "must be instance");
461     return (int) lh & ~_lh_instance_slow_path_bit;
462   }
463   static bool layout_helper_needs_slow_path(jint lh) {
464     assert(lh > (jint)_lh_neutral_value, "must be instance");
465     return (lh & _lh_instance_slow_path_bit) != 0;
466   }
467   static bool layout_helper_is_instance(jint lh) {
468     return (jint)lh > (jint)_lh_neutral_value;
469   }
470   static bool layout_helper_is_array(jint lh) {
471     return (jint)lh < (jint)_lh_neutral_value;
472   }
473   static bool layout_helper_is_typeArray(jint lh) {
474     // _lh_array_tag_type_value == (lh >> _lh_array_tag_shift);
475     return (juint)lh >= (juint)(_lh_array_tag_type_value << _lh_array_tag_shift);
476   }
477   static bool layout_helper_is_objArray(jint lh) {
478     // _lh_array_tag_obj_value == (lh >> _lh_array_tag_shift);
479     return (jint)lh < (jint)(_lh_array_tag_type_value << _lh_array_tag_shift);











480   }
481   static int layout_helper_header_size(jint lh) {
482     assert(lh < (jint)_lh_neutral_value, "must be array");
483     int hsize = (lh >> _lh_header_size_shift) & _lh_header_size_mask;
484     assert(hsize > 0 && hsize < (int)sizeof(oopDesc)*3, "sanity");
485     return hsize;
486   }
487   static BasicType layout_helper_element_type(jint lh) {
488     assert(lh < (jint)_lh_neutral_value, "must be array");
489     int btvalue = (lh >> _lh_element_type_shift) & _lh_element_type_mask;
490     assert(btvalue >= T_BOOLEAN && btvalue <= T_OBJECT, "sanity");
491     return (BasicType) btvalue;
492   }
493 
494   // Want a pattern to quickly diff against layout header in register
495   // find something less clever!
496   static int layout_helper_boolean_diffbit() {
497     jint zlh = array_layout_helper(T_BOOLEAN);
498     jint blh = array_layout_helper(T_BYTE);
499     assert(zlh != blh, "array layout helpers must differ");
500     int diffbit = 1;
501     while ((diffbit & (zlh ^ blh)) == 0 && (diffbit & zlh) == 0) {
502       diffbit <<= 1;
503       assert(diffbit != 0, "make sure T_BOOLEAN has a different bit than T_BYTE");
504     }
505     return diffbit;
506   }
507 
508   static int layout_helper_log2_element_size(jint lh) {
509     assert(lh < (jint)_lh_neutral_value, "must be array");
510     int l2esz = (lh >> _lh_log2_element_size_shift) & _lh_log2_element_size_mask;
511     assert(l2esz <= LogBytesPerLong,
512            "sanity. l2esz: 0x%x for lh: 0x%x", (uint)l2esz, (uint)lh);
513     return l2esz;
514   }
515   static jint array_layout_helper(jint tag, int hsize, BasicType etype, int log2_esize) {
516     return (tag        << _lh_array_tag_shift)

517       |    (hsize      << _lh_header_size_shift)
518       |    ((int)etype << _lh_element_type_shift)
519       |    (log2_esize << _lh_log2_element_size_shift);
520   }
521   static jint instance_layout_helper(jint size, bool slow_path_flag) {
522     return (size << LogBytesPerWord)
523       |    (slow_path_flag ? _lh_instance_slow_path_bit : 0);
524   }
525   static int layout_helper_to_size_helper(jint lh) {
526     assert(lh > (jint)_lh_neutral_value, "must be instance");
527     // Note that the following expression discards _lh_instance_slow_path_bit.
528     return lh >> LogBytesPerWord;
529   }
530   // Out-of-line version computes everything based on the etype:
531   static jint array_layout_helper(BasicType etype);
532 
533   // What is the maximum number of primary superclasses any klass can have?
534   static juint primary_super_limit()         { return _primary_super_limit; }
535 
536   // vtables

639   const char* external_name() const;
640   // Returns the name for a class (Resource allocated) as the class
641   // would appear in a signature.
642   // For arrays, this returns the name of the element with a leading '['.
643   // For classes, this returns the name with a leading 'L' and a trailing ';'
644   //     and the package separators as '/'.
645   virtual const char* signature_name() const;
646 
647   const char* joint_in_module_of_loader(const Klass* class2, bool include_parent_loader = false) const;
648   const char* class_in_module_of_loader(bool use_are = false, bool include_parent_loader = false) const;
649 
650   // Returns "interface", "abstract class" or "class".
651   const char* external_kind() const;
652 
653   // type testing operations
654 #ifdef ASSERT
655  protected:
656   virtual bool is_instance_klass_slow()     const { return false; }
657   virtual bool is_array_klass_slow()        const { return false; }
658   virtual bool is_objArray_klass_slow()     const { return false; }

659   virtual bool is_typeArray_klass_slow()    const { return false; }

660 #endif // ASSERT


661  public:
662 
663   // Fast non-virtual versions
664   #ifndef ASSERT
665   #define assert_same_query(xval, xcheck) xval
666   #else
667  private:
668   static bool assert_same_query(bool xval, bool xslow) {
669     assert(xval == xslow, "slow and fast queries agree");
670     return xval;
671   }
672  public:
673   #endif
674 
675   bool is_instance_klass()              const { return assert_same_query(_kind <= InstanceStackChunkKlassKind, is_instance_klass_slow()); }
676   // Other is anything that is not one of the more specialized kinds of InstanceKlass.
677   bool is_other_instance_klass()        const { return _kind == InstanceKlassKind; }
678   bool is_reference_instance_klass()    const { return _kind == InstanceRefKlassKind; }
679   bool is_mirror_instance_klass()       const { return _kind == InstanceMirrorKlassKind; }
680   bool is_class_loader_instance_klass() const { return _kind == InstanceClassLoaderKlassKind; }
681   bool is_array_klass()                 const { return assert_same_query( _kind >= TypeArrayKlassKind, is_array_klass_slow()); }
682   bool is_stack_chunk_instance_klass()  const { return _kind == InstanceStackChunkKlassKind; }
683   bool is_objArray_klass()              const { return assert_same_query( _kind == ObjArrayKlassKind,  is_objArray_klass_slow()); }


684   bool is_typeArray_klass()             const { return assert_same_query( _kind == TypeArrayKlassKind, is_typeArray_klass_slow()); }

685   #undef assert_same_query
686 


687   // Access flags
688   AccessFlags access_flags() const         { return _access_flags;  }
689   void set_access_flags(AccessFlags flags) { _access_flags = flags; }
690 
691   bool is_public() const                { return _access_flags.is_public(); }
692   bool is_final() const                 { return _access_flags.is_final(); }
693   bool is_interface() const             { return _access_flags.is_interface(); }
694   bool is_abstract() const              { return _access_flags.is_abstract(); }
695   bool is_super() const                 { return _access_flags.is_super(); }
696   bool is_synthetic() const             { return _access_flags.is_synthetic(); }

697   void set_is_synthetic()               { _access_flags.set_is_synthetic(); }
698   bool has_finalizer() const            { return _misc_flags.has_finalizer(); }
699   void set_has_finalizer()              { _misc_flags.set_has_finalizer(true); }
700   bool is_hidden() const                { return _misc_flags.is_hidden_class(); }
701   void set_is_hidden()                  { _misc_flags.set_is_hidden_class(true); }
702   bool is_value_based() const           { return _misc_flags.is_value_based_class(); }
703   void set_is_value_based()             { _misc_flags.set_is_value_based_class(true); }
704 
705   klass_flags_t misc_flags() const      { return _misc_flags.value(); }
706 
707   inline bool is_non_strong_hidden() const;
708 
709   bool is_cloneable() const;
710   void set_is_cloneable();
711 

712   inline markWord prototype_header() const;
713   inline void set_prototype_header(markWord header);
714   static ByteSize prototype_header_offset() { return in_ByteSize(offset_of(Klass, _prototype_header)); }

715 
716   JFR_ONLY(DEFINE_TRACE_ID_METHODS;)
717 
718   virtual void metaspace_pointers_do(MetaspaceClosure* iter);
719   virtual MetaspaceObj::Type type() const { return ClassType; }
720 
721   inline bool is_loader_alive() const;
722   inline bool is_loader_present_and_alive() const;
723 
724   void clean_subklass();
725 
726   // Clean out unnecessary weak klass links from the whole klass hierarchy.
727   static void clean_weak_klass_links(bool unloading_occurred, bool clean_alive_klasses = true);
728   // Clean out unnecessary weak klass links from the given InstanceKlass.
729   static void clean_weak_instanceklass_links(InstanceKlass* ik);
730 
731   // Return self, except for abstract classes with exactly 1
732   // implementor.  Then return the 1 concrete implementation.
733   Klass *up_cast_abstract();
734 

 49 // a vtbl and does the C++ dispatch depending on the object's
 50 // actual type.  (See oop.inline.hpp for some of the forwarding code.)
 51 // ALL FUNCTIONS IMPLEMENTING THIS DISPATCH ARE PREFIXED WITH "oop_"!
 52 
 53 // Forward declarations.
 54 template <class T> class Array;
 55 template <class T> class GrowableArray;
 56 class ClassLoaderData;
 57 class fieldDescriptor;
 58 class klassVtable;
 59 class ModuleEntry;
 60 class PackageEntry;
 61 class vtableEntry;
 62 
 63 class Klass : public Metadata {
 64 
 65   friend class VMStructs;
 66   friend class JVMCIVMStructs;
 67  public:
 68   // Klass Kinds for all subclasses of Klass
 69    enum KlassKind : u2
 70    {
 71      InstanceKlassKind,
 72      InlineKlassKind,
 73      InstanceRefKlassKind,
 74      InstanceMirrorKlassKind,
 75      InstanceClassLoaderKlassKind,
 76      InstanceStackChunkKlassKind,
 77      TypeArrayKlassKind,
 78      ObjArrayKlassKind,
 79      RefArrayKlassKind,
 80      FlatArrayKlassKind,
 81      UnknownKlassKind
 82    };
 83 
 84    static const uint KLASS_KIND_COUNT = FlatArrayKlassKind + 1;
 85  protected:
 86 
 87   // If you add a new field that points to any metaspace object, you
 88   // must add this field to Klass::metaspace_pointers_do().
 89 
 90   // note: put frequently-used fields together at start of klass structure
 91   // for better cache behavior (may not make much of a difference but sure won't hurt)
 92   enum { _primary_super_limit = 8 };
 93 
 94   // The "layout helper" is a combined descriptor of object layout.
 95   // For klasses which are neither instance nor array, the value is zero.
 96   //
 97   // For instances, layout helper is a positive number, the instance size.
 98   // This size is already passed through align_object_size and scaled to bytes.
 99   // The low order bit is set if instances of this class cannot be
100   // allocated using the fastpath.
101   //
102   // For arrays, layout helper is a negative number, containing four
103   // distinct bytes, as follows:
104   //    MSB:[tag, hsz, ebt, log2(esz)]:LSB
105   // where:
106   //    tag is 0x80 if the elements are oops, 0xC0 if non-oops, 0xA0 if value types
107   //    hsz is array header size in bytes (i.e., offset of first element)
108   //    ebt is the BasicType of the elements
109   //    esz is the element size in bytes
110   // This packed word is arranged so as to be quickly unpacked by the
111   // various fast paths that use the various subfields.
112   //
113   // The esz bits can be used directly by a SLL instruction, without masking.
114   //
115   // Note that the array-kind tag looks like 0x00 for instance klasses,
116   // since their length in bytes is always less than 24Mb.
117   //
118   // Final note:  This comes first, immediately after C++ vtable,
119   // because it is frequently queried.
120   jint _layout_helper;
121 
122   // Klass kind used to resolve the runtime type of the instance.
123   //  - Used to implement devirtualized oop closure dispatching.
124   //  - Various type checking in the JVM
125   const KlassKind _kind;
126 

189     // or classpath.
190     _is_generated_shared_class             = 1 << 5,
191     // archived mirror already initialized by AOT-cache assembly: no further need to call <clinit>
192     _has_aot_initialized_mirror            = 1 << 6,
193   };
194 #endif
195 
196   int _vtable_len;              // vtable length. This field may be read very often when we
197                                 // have lots of itable dispatches (e.g., lambdas and streams).
198                                 // Keep it away from the beginning of a Klass to avoid cacheline
199                                 // contention that may happen when a nearby object is modified.
200 
201   CDS_JAVA_HEAP_ONLY(int _archived_mirror_index;)
202 
203 public:
204 
205   JFR_ONLY(DEFINE_TRACE_ID_FIELD;)
206 
207 protected:
208 
209   Klass(KlassKind kind, markWord prototype_header = markWord::prototype());
210   Klass();
211 
212  public:
213   int kind() { return _kind; }
214 
215   enum class DefaultsLookupMode { find, skip };
216   enum class OverpassLookupMode { find, skip };
217   enum class StaticLookupMode   { find, skip };
218   enum class PrivateLookupMode  { find, skip };
219 
220   virtual bool is_klass() const { return true; }
221 
222   // super() cannot be InstanceKlass* -- Java arrays are covariant, and _super is used
223   // to implement that. NB: the _super of "[Ljava/lang/Integer;" is "[Ljava/lang/Number;"
224   // If this is not what your code expects, you're probably looking for:
225   // - Klass::java_super() - if you have a Klass*
226   // - InstanceKlass::super() - if you have an InstanceKlass* ik, ik->super() returns InstanceKlass*.
227   Klass* super() const               { return _super; }
228   void set_super(Klass* k)           { _super = k; }
229 

437   static ByteSize layout_helper_offset()         { return byte_offset_of(Klass, _layout_helper); }
438   static ByteSize access_flags_offset()          { return byte_offset_of(Klass, _access_flags); }
439 #if INCLUDE_JVMCI
440   static ByteSize subklass_offset()              { return byte_offset_of(Klass, _subklass); }
441   static ByteSize next_sibling_offset()          { return byte_offset_of(Klass, _next_sibling); }
442 #endif
443   static ByteSize secondary_supers_bitmap_offset()
444                                                  { return byte_offset_of(Klass, _secondary_supers_bitmap); }
445   static ByteSize hash_slot_offset()             { return byte_offset_of(Klass, _hash_slot); }
446   static ByteSize misc_flags_offset()            { return byte_offset_of(Klass, _misc_flags._flags); }
447 
448   // Unpacking layout_helper:
449   static const int _lh_neutral_value           = 0;  // neutral non-array non-instance value
450   static const int _lh_instance_slow_path_bit  = 0x01;
451   static const int _lh_log2_element_size_shift = BitsPerByte*0;
452   static const int _lh_log2_element_size_mask  = BitsPerLong-1;
453   static const int _lh_element_type_shift      = BitsPerByte*1;
454   static const int _lh_element_type_mask       = right_n_bits(BitsPerByte);  // shifted mask
455   static const int _lh_header_size_shift       = BitsPerByte*2;
456   static const int _lh_header_size_mask        = right_n_bits(BitsPerByte);  // shifted mask
457   static const int _lh_array_tag_bits          = 4;
458   static const int _lh_array_tag_shift         = BitsPerInt - _lh_array_tag_bits;

459 
460   static const unsigned int _lh_array_tag_type_value = 0Xfffffffc;
461   static const unsigned int _lh_array_tag_flat_value = 0Xfffffffa;
462   static const unsigned int _lh_array_tag_ref_value  = 0Xfffffff8;
463 
464   // null-free array flag bit under the array tag bits, shift one more to get array tag value
465   static const int _lh_null_free_shift = _lh_array_tag_shift - 1;
466   static const int _lh_null_free_mask  = 1;
467 
468   static const jint _lh_array_tag_flat_value_bit_inplace = (jint) (1 << (_lh_array_tag_shift + 1));
469 
470   static int layout_helper_size_in_bytes(jint lh) {
471     assert(lh > (jint)_lh_neutral_value, "must be instance");
472     return (int) lh & ~_lh_instance_slow_path_bit;
473   }
474   static bool layout_helper_needs_slow_path(jint lh) {
475     assert(lh > (jint)_lh_neutral_value, "must be instance");
476     return (lh & _lh_instance_slow_path_bit) != 0;
477   }
478   static bool layout_helper_is_instance(jint lh) {
479     return (jint)lh > (jint)_lh_neutral_value;
480   }
481   static bool layout_helper_is_array(jint lh) {
482     return (jint)lh < (jint)_lh_neutral_value;
483   }
484   static bool layout_helper_is_typeArray(jint lh) {
485     return (juint) _lh_array_tag_type_value == (juint)(lh >> _lh_array_tag_shift);

486   }
487   static bool layout_helper_is_refArray(jint lh) {
488     return (juint)_lh_array_tag_ref_value == (juint)(lh >> _lh_array_tag_shift);
489   }
490   static bool layout_helper_is_flatArray(jint lh) {
491     return (juint)_lh_array_tag_flat_value == (juint)(lh >> _lh_array_tag_shift);
492   }
493   static bool layout_helper_is_null_free(jint lh) {
494     assert(layout_helper_is_flatArray(lh) || layout_helper_is_refArray(lh), "must be array of inline types");
495     return ((lh >> _lh_null_free_shift) & _lh_null_free_mask);
496   }
497   static jint layout_helper_set_null_free(jint lh) {
498     lh |= (_lh_null_free_mask << _lh_null_free_shift);
499     assert(layout_helper_is_null_free(lh), "Bad encoding");
500     return lh;
501   }
502   static int layout_helper_header_size(jint lh) {
503     assert(lh < (jint)_lh_neutral_value, "must be array");
504     int hsize = (lh >> _lh_header_size_shift) & _lh_header_size_mask;
505     assert(hsize > 0 && hsize < (int)sizeof(oopDesc)*3, "sanity");
506     return hsize;
507   }
508   static BasicType layout_helper_element_type(jint lh) {
509     assert(lh < (jint)_lh_neutral_value, "must be array");
510     int btvalue = (lh >> _lh_element_type_shift) & _lh_element_type_mask;
511     assert((btvalue >= T_BOOLEAN && btvalue <= T_OBJECT) || btvalue == T_FLAT_ELEMENT, "sanity");
512     return (BasicType) btvalue;
513   }
514 
515   // Want a pattern to quickly diff against layout header in register
516   // find something less clever!
517   static int layout_helper_boolean_diffbit() {
518     jint zlh = array_layout_helper(T_BOOLEAN);
519     jint blh = array_layout_helper(T_BYTE);
520     assert(zlh != blh, "array layout helpers must differ");
521     int diffbit = 1;
522     while ((diffbit & (zlh ^ blh)) == 0 && (diffbit & zlh) == 0) {
523       diffbit <<= 1;
524       assert(diffbit != 0, "make sure T_BOOLEAN has a different bit than T_BYTE");
525     }
526     return diffbit;
527   }
528 
529   static int layout_helper_log2_element_size(jint lh) {
530     assert(lh < (jint)_lh_neutral_value, "must be array");
531     int l2esz = (lh >> _lh_log2_element_size_shift) & _lh_log2_element_size_mask;
532     assert(layout_helper_element_type(lh) == T_FLAT_ELEMENT || l2esz <= LogBytesPerLong,
533            "sanity. l2esz: 0x%x for lh: 0x%x", (uint)l2esz, (uint)lh);
534     return l2esz;
535   }
536   static jint array_layout_helper(jint tag, bool null_free, int hsize, BasicType etype, int log2_esize) {
537     return (tag        << _lh_array_tag_shift)
538       |    ((null_free ? 1 : 0) <<  _lh_null_free_shift)
539       |    (hsize      << _lh_header_size_shift)
540       |    ((int)etype << _lh_element_type_shift)
541       |    (log2_esize << _lh_log2_element_size_shift);
542   }
543   static jint instance_layout_helper(jint size, bool slow_path_flag) {
544     return (size << LogBytesPerWord)
545       |    (slow_path_flag ? _lh_instance_slow_path_bit : 0);
546   }
547   static int layout_helper_to_size_helper(jint lh) {
548     assert(lh > (jint)_lh_neutral_value, "must be instance");
549     // Note that the following expression discards _lh_instance_slow_path_bit.
550     return lh >> LogBytesPerWord;
551   }
552   // Out-of-line version computes everything based on the etype:
553   static jint array_layout_helper(BasicType etype);
554 
555   // What is the maximum number of primary superclasses any klass can have?
556   static juint primary_super_limit()         { return _primary_super_limit; }
557 
558   // vtables

661   const char* external_name() const;
662   // Returns the name for a class (Resource allocated) as the class
663   // would appear in a signature.
664   // For arrays, this returns the name of the element with a leading '['.
665   // For classes, this returns the name with a leading 'L' and a trailing ';'
666   //     and the package separators as '/'.
667   virtual const char* signature_name() const;
668 
669   const char* joint_in_module_of_loader(const Klass* class2, bool include_parent_loader = false) const;
670   const char* class_in_module_of_loader(bool use_are = false, bool include_parent_loader = false) const;
671 
672   // Returns "interface", "abstract class" or "class".
673   const char* external_kind() const;
674 
675   // type testing operations
676 #ifdef ASSERT
677  protected:
678   virtual bool is_instance_klass_slow()     const { return false; }
679   virtual bool is_array_klass_slow()        const { return false; }
680   virtual bool is_objArray_klass_slow()     const { return false; }
681   virtual bool is_refArray_klass_slow()     const { return false; }
682   virtual bool is_typeArray_klass_slow()    const { return false; }
683   virtual bool is_flatArray_klass_slow()    const { return false; }
684 #endif // ASSERT
685   // current implementation uses this method even in non debug builds
686   virtual bool is_inline_klass_slow()       const { return false; }
687  public:
688 
689   // Fast non-virtual versions
690   #ifndef ASSERT
691   #define assert_same_query(xval, xcheck) xval
692   #else
693  private:
694   static bool assert_same_query(bool xval, bool xslow) {
695     assert(xval == xslow, "slow and fast queries agree");
696     return xval;
697   }
698  public:
699   #endif
700 
701   bool is_instance_klass()              const { return assert_same_query(_kind <= InstanceStackChunkKlassKind, is_instance_klass_slow()); }
702   bool is_inline_klass()                const { return assert_same_query(_kind == InlineKlassKind, is_inline_klass_slow()); }

703   bool is_reference_instance_klass()    const { return _kind == InstanceRefKlassKind; }
704   bool is_mirror_instance_klass()       const { return _kind == InstanceMirrorKlassKind; }
705   bool is_class_loader_instance_klass() const { return _kind == InstanceClassLoaderKlassKind; }
706   bool is_array_klass()                 const { return assert_same_query( _kind >= TypeArrayKlassKind, is_array_klass_slow()); }
707   bool is_stack_chunk_instance_klass()  const { return _kind == InstanceStackChunkKlassKind; }
708   bool is_flatArray_klass()             const { return assert_same_query( _kind == FlatArrayKlassKind, is_flatArray_klass_slow()); }
709   bool is_objArray_klass()              const { return assert_same_query( _kind == ObjArrayKlassKind || _kind == RefArrayKlassKind || _kind == FlatArrayKlassKind,  is_objArray_klass_slow()); }
710   bool is_refArray_klass()              const { return assert_same_query( _kind == RefArrayKlassKind, is_refArray_klass_slow()); }
711   bool is_typeArray_klass()             const { return assert_same_query( _kind == TypeArrayKlassKind, is_typeArray_klass_slow()); }
712   bool is_refined_objArray_klass()      const { return is_refArray_klass() || is_flatArray_klass(); }
713   #undef assert_same_query
714 
715   inline bool is_null_free_array_klass() const { return !is_typeArray_klass() && layout_helper_is_null_free(layout_helper()); }
716 
717   // Access flags
718   AccessFlags access_flags() const         { return _access_flags;  }
719   void set_access_flags(AccessFlags flags) { _access_flags = flags; }
720 
721   bool is_public() const                { return _access_flags.is_public(); }
722   bool is_final() const                 { return _access_flags.is_final(); }
723   bool is_interface() const             { return _access_flags.is_interface(); }
724   bool is_abstract() const              { return _access_flags.is_abstract(); }

725   bool is_synthetic() const             { return _access_flags.is_synthetic(); }
726   bool is_identity_class() const        { assert(is_instance_klass(), "only for instanceKlass"); return _access_flags.is_identity_class(); }
727   void set_is_synthetic()               { _access_flags.set_is_synthetic(); }
728   bool has_finalizer() const            { return _misc_flags.has_finalizer(); }
729   void set_has_finalizer()              { _misc_flags.set_has_finalizer(true); }
730   bool is_hidden() const                { return _misc_flags.is_hidden_class(); }
731   void set_is_hidden()                  { _misc_flags.set_is_hidden_class(true); }
732   bool is_value_based() const           { return _misc_flags.is_value_based_class(); }
733   void set_is_value_based()             { _misc_flags.set_is_value_based_class(true); }
734 
735   klass_flags_t misc_flags() const      { return _misc_flags.value(); }
736 
737   inline bool is_non_strong_hidden() const;
738 
739   bool is_cloneable() const;
740   void set_is_cloneable();
741 
742   static inline markWord make_prototype_header(const Klass* kls, markWord prototype = markWord::prototype());
743   inline markWord prototype_header() const;
744   inline void set_prototype_header(markWord header);
745   static ByteSize prototype_header_offset() { return in_ByteSize(offset_of(Klass, _prototype_header)); }
746   inline void set_prototype_header_klass(narrowKlass klass);
747 
748   JFR_ONLY(DEFINE_TRACE_ID_METHODS;)
749 
750   virtual void metaspace_pointers_do(MetaspaceClosure* iter);
751   virtual MetaspaceObj::Type type() const { return ClassType; }
752 
753   inline bool is_loader_alive() const;
754   inline bool is_loader_present_and_alive() const;
755 
756   void clean_subklass();
757 
758   // Clean out unnecessary weak klass links from the whole klass hierarchy.
759   static void clean_weak_klass_links(bool unloading_occurred, bool clean_alive_klasses = true);
760   // Clean out unnecessary weak klass links from the given InstanceKlass.
761   static void clean_weak_instanceklass_links(InstanceKlass* ik);
762 
763   // Return self, except for abstract classes with exactly 1
764   // implementor.  Then return the 1 concrete implementation.
765   Klass *up_cast_abstract();
766 
< prev index next >