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()); } |