hotspot/src/share/vm/oops/objArrayKlass.hpp
changeset 13952 e3cf184080bc
parent 13728 882756847a04
child 14488 ab48109f7d1b
equal deleted inserted replaced
13918:b01a48301e67 13952:e3cf184080bc
    27 
    27 
    28 #include "classfile/classLoaderData.hpp"
    28 #include "classfile/classLoaderData.hpp"
    29 #include "memory/specialized_oop_closures.hpp"
    29 #include "memory/specialized_oop_closures.hpp"
    30 #include "oops/arrayKlass.hpp"
    30 #include "oops/arrayKlass.hpp"
    31 
    31 
    32 // objArrayKlass is the klass for objArrays
    32 // ObjArrayKlass is the klass for objArrays
    33 
    33 
    34 class objArrayKlass : public arrayKlass {
    34 class ObjArrayKlass : public ArrayKlass {
    35   friend class VMStructs;
    35   friend class VMStructs;
    36  private:
    36  private:
    37   Klass* _element_klass;            // The klass of the elements of this array type
    37   Klass* _element_klass;            // The klass of the elements of this array type
    38   Klass* _bottom_klass;             // The one-dimensional type (InstanceKlass or typeArrayKlass)
    38   Klass* _bottom_klass;             // The one-dimensional type (InstanceKlass or TypeArrayKlass)
    39 
    39 
    40   // Constructor
    40   // Constructor
    41   objArrayKlass(int n, KlassHandle element_klass, Symbol* name);
    41   ObjArrayKlass(int n, KlassHandle element_klass, Symbol* name);
    42   static objArrayKlass* allocate(ClassLoaderData* loader_data, int n, KlassHandle klass_handle, Symbol* name, TRAPS);
    42   static ObjArrayKlass* allocate(ClassLoaderData* loader_data, int n, KlassHandle klass_handle, Symbol* name, TRAPS);
    43  public:
    43  public:
    44   // For dummy objects
    44   // For dummy objects
    45   objArrayKlass() {}
    45   ObjArrayKlass() {}
    46 
    46 
    47   // Instance variables
    47   // Instance variables
    48   Klass* element_klass() const      { return _element_klass; }
    48   Klass* element_klass() const      { return _element_klass; }
    49   void set_element_klass(Klass* k)  { _element_klass = k; }
    49   void set_element_klass(Klass* k)  { _element_klass = k; }
    50   Klass** element_klass_addr()      { return &_element_klass; }
    50   Klass** element_klass_addr()      { return &_element_klass; }
    52   Klass* bottom_klass() const       { return _bottom_klass; }
    52   Klass* bottom_klass() const       { return _bottom_klass; }
    53   void set_bottom_klass(Klass* k)   { _bottom_klass = k; }
    53   void set_bottom_klass(Klass* k)   { _bottom_klass = k; }
    54   Klass** bottom_klass_addr()       { return &_bottom_klass; }
    54   Klass** bottom_klass_addr()       { return &_bottom_klass; }
    55 
    55 
    56   // Compiler/Interpreter offset
    56   // Compiler/Interpreter offset
    57   static ByteSize element_klass_offset() { return in_ByteSize(offset_of(objArrayKlass, _element_klass)); }
    57   static ByteSize element_klass_offset() { return in_ByteSize(offset_of(ObjArrayKlass, _element_klass)); }
    58 
    58 
    59   // Dispatched operation
    59   // Dispatched operation
    60   bool can_be_primary_super_slow() const;
    60   bool can_be_primary_super_slow() const;
    61   GrowableArray<Klass*>* compute_secondary_supers(int num_extra_slots);
    61   GrowableArray<Klass*>* compute_secondary_supers(int num_extra_slots);
    62   bool compute_is_subtype_of(Klass* k);
    62   bool compute_is_subtype_of(Klass* k);
    76   // Compute protection domain
    76   // Compute protection domain
    77   oop protection_domain() { return Klass::cast(bottom_klass())->protection_domain(); }
    77   oop protection_domain() { return Klass::cast(bottom_klass())->protection_domain(); }
    78 
    78 
    79  private:
    79  private:
    80   // Either oop or narrowOop depending on UseCompressedOops.
    80   // Either oop or narrowOop depending on UseCompressedOops.
    81   // must be called from within objArrayKlass.cpp
    81   // must be called from within ObjArrayKlass.cpp
    82   template <class T> void do_copy(arrayOop s, T* src, arrayOop d,
    82   template <class T> void do_copy(arrayOop s, T* src, arrayOop d,
    83                                   T* dst, int length, TRAPS);
    83                                   T* dst, int length, TRAPS);
    84  protected:
    84  protected:
    85   // Returns the objArrayKlass for n'th dimension.
    85   // Returns the ObjArrayKlass for n'th dimension.
    86   virtual Klass* array_klass_impl(bool or_null, int n, TRAPS);
    86   virtual Klass* array_klass_impl(bool or_null, int n, TRAPS);
    87 
    87 
    88   // Returns the array class with this class as element type.
    88   // Returns the array class with this class as element type.
    89   virtual Klass* array_klass_impl(bool or_null, TRAPS);
    89   virtual Klass* array_klass_impl(bool or_null, TRAPS);
    90 
    90 
    91  public:
    91  public:
    92   // Casting from Klass*
    92   // Casting from Klass*
    93   static objArrayKlass* cast(Klass* k) {
    93   static ObjArrayKlass* cast(Klass* k) {
    94     assert(k->oop_is_objArray(), "cast to objArrayKlass");
    94     assert(k->oop_is_objArray(), "cast to ObjArrayKlass");
    95     return (objArrayKlass*) k;
    95     return (ObjArrayKlass*) k;
    96   }
    96   }
    97 
    97 
    98   // Sizing
    98   // Sizing
    99   static int header_size()                { return sizeof(objArrayKlass)/HeapWordSize; }
    99   static int header_size()                { return sizeof(ObjArrayKlass)/HeapWordSize; }
   100   int size() const                        { return arrayKlass::static_size(header_size()); }
   100   int size() const                        { return ArrayKlass::static_size(header_size()); }
   101 
   101 
   102   // Initialization (virtual from Klass)
   102   // Initialization (virtual from Klass)
   103   void initialize(TRAPS);
   103   void initialize(TRAPS);
   104 
   104 
   105   // Garbage collection
   105   // Garbage collection