< prev index next >

src/hotspot/share/oops/arrayKlass.hpp

Print this page




  26 #define SHARE_OOPS_ARRAYKLASS_HPP
  27 
  28 #include "memory/universe.hpp"
  29 #include "oops/klass.hpp"
  30 
  31 class fieldDescriptor;
  32 class klassVtable;
  33 
  34 // ArrayKlass is the abstract baseclass for all array classes
  35 
  36 class ArrayKlass: public Klass {
  37   friend class VMStructs;
  38  private:
  39   // If you add a new field that points to any metaspace object, you
  40   // must add this field to ArrayKlass::metaspace_pointers_do().
  41   int      _dimension;         // This is n'th-dimensional array.
  42   Klass* volatile _higher_dimension;  // Refers the (n+1)'th-dimensional array (if present).
  43   Klass* volatile _lower_dimension;   // Refers the (n-1)'th-dimensional array (if present).
  44 
  45  protected:







  46   // Constructors
  47   // The constructor with the Symbol argument does the real array
  48   // initialization, the other is a dummy
  49   ArrayKlass(Symbol* name, KlassID id);
  50   ArrayKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for cds"); }
  51 



  52  public:







  53   // Testing operation
  54   DEBUG_ONLY(bool is_array_klass_slow() const { return true; })
  55 
  56   // Instance variables
  57   int dimension() const                 { return _dimension;      }
  58   void set_dimension(int dimension)     { _dimension = dimension; }
  59 
  60   Klass* higher_dimension() const     { return _higher_dimension; }
  61   inline Klass* higher_dimension_acquire() const; // load with acquire semantics
  62   void set_higher_dimension(Klass* k) { _higher_dimension = k; }
  63   inline void release_set_higher_dimension(Klass* k); // store with release semantics
  64 
  65   Klass* lower_dimension() const      { return _lower_dimension; }
  66   void set_lower_dimension(Klass* k)  { _lower_dimension = k; }
  67 
  68   // offset of first element, including any padding for the sake of alignment
  69   int  array_header_in_bytes() const    { return layout_helper_header_size(layout_helper()); }
  70   int  log2_element_size() const        { return layout_helper_log2_element_size(layout_helper()); }
  71   // type of elements (T_OBJECT for both oop arrays and array-arrays)
  72   BasicType element_type() const        { return layout_helper_element_type(layout_helper()); }




  26 #define SHARE_OOPS_ARRAYKLASS_HPP
  27 
  28 #include "memory/universe.hpp"
  29 #include "oops/klass.hpp"
  30 
  31 class fieldDescriptor;
  32 class klassVtable;
  33 
  34 // ArrayKlass is the abstract baseclass for all array classes
  35 
  36 class ArrayKlass: public Klass {
  37   friend class VMStructs;
  38  private:
  39   // If you add a new field that points to any metaspace object, you
  40   // must add this field to ArrayKlass::metaspace_pointers_do().
  41   int      _dimension;         // This is n'th-dimensional array.
  42   Klass* volatile _higher_dimension;  // Refers the (n+1)'th-dimensional array (if present).
  43   Klass* volatile _lower_dimension;   // Refers the (n-1)'th-dimensional array (if present).
  44 
  45  protected:
  46   Klass* _element_klass;            // The klass of the elements of this array type
  47                                     // The element type must be registered for both object arrays
  48                                     // (incl. object arrays with value type elements) and value type
  49                                     // arrays containing flattened value types. However, the element
  50                                     // type must not be registered for arrays of primitive types.
  51                                     // TODO: Update the class hierarchy so that element klass appears
  52                                     // only in array that contain non-primitive types.
  53   // Constructors
  54   // The constructor with the Symbol argument does the real array
  55   // initialization, the other is a dummy
  56   ArrayKlass(Symbol* name, KlassID id);
  57   ArrayKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for cds"); }
  58 
  59   // Create array_name for element klass, creates a permanent symbol, returns result
  60   static Symbol* create_element_klass_array_name(Klass* element_klass, TRAPS);
  61 
  62  public:
  63   // Instance variables
  64   virtual Klass* element_klass() const      { return _element_klass; }
  65   virtual void set_element_klass(Klass* k)  { _element_klass = k; }
  66 
  67   // Compiler/Interpreter offset
  68   static ByteSize element_klass_offset() { return in_ByteSize(offset_of(ArrayKlass, _element_klass)); }
  69 
  70   // Testing operation
  71   DEBUG_ONLY(bool is_array_klass_slow() const { return true; })
  72 
  73   // Instance variables
  74   int dimension() const                 { return _dimension;      }
  75   void set_dimension(int dimension)     { _dimension = dimension; }
  76 
  77   Klass* higher_dimension() const     { return _higher_dimension; }
  78   inline Klass* higher_dimension_acquire() const; // load with acquire semantics
  79   void set_higher_dimension(Klass* k) { _higher_dimension = k; }
  80   inline void release_set_higher_dimension(Klass* k); // store with release semantics
  81 
  82   Klass* lower_dimension() const      { return _lower_dimension; }
  83   void set_lower_dimension(Klass* k)  { _lower_dimension = k; }
  84 
  85   // offset of first element, including any padding for the sake of alignment
  86   int  array_header_in_bytes() const    { return layout_helper_header_size(layout_helper()); }
  87   int  log2_element_size() const        { return layout_helper_log2_element_size(layout_helper()); }
  88   // type of elements (T_OBJECT for both oop arrays and array-arrays)
  89   BasicType element_type() const        { return layout_helper_element_type(layout_helper()); }


< prev index next >