29 #include "oops/arrayKlass.hpp" 30 #include "oops/valueKlass.hpp" 31 #include "utilities/macros.hpp" 32 33 /** 34 * Array of values, gives a layout of typeArrayOop, but needs oops iterators 35 */ 36 class ValueArrayKlass : public ArrayKlass { 37 friend class VMStructs; 38 39 public: 40 static const KlassID ID = ValueArrayKlassID; 41 42 private: 43 // Constructor 44 ValueArrayKlass(Klass* element_klass, Symbol* name); 45 46 static ValueArrayKlass* allocate_klass(Klass* element_klass, Symbol* name, TRAPS); 47 protected: 48 // Returns the ArrayKlass for n'th dimension. 49 Klass* array_klass_impl(bool or_null, int n, TRAPS); 50 51 // Returns the array class with this class as element type. 52 Klass* array_klass_impl(bool or_null, TRAPS); 53 54 public: 55 56 ValueArrayKlass() {} 57 58 virtual ValueKlass* element_klass() const; 59 virtual void set_element_klass(Klass* k); 60 61 // Casting from Klass* 62 static ValueArrayKlass* cast(Klass* k) { 63 assert(k->is_valueArray_klass(), "cast to ValueArrayKlass"); 64 return (ValueArrayKlass*) k; 65 } 66 67 // klass allocation 68 static ValueArrayKlass* allocate_klass(Klass* element_klass, TRAPS); 69 70 void initialize(TRAPS); 71 72 ModuleEntry* module() const; 73 PackageEntry* package() const; 74 75 bool can_be_primary_super_slow() const; 76 GrowableArray<Klass*>* compute_secondary_supers(int num_extra_slots, 77 Array<InstanceKlass*>* transitive_interfaces); 78 79 int element_byte_size() const { return 1 << layout_helper_log2_element_size(_layout_helper); } 80 81 bool is_valueArray_klass_slow() const { return true; } 82 83 bool contains_oops() { 84 return element_klass()->contains_oops(); 85 } 86 87 bool is_atomic() { 88 return element_klass()->is_atomic(); | 29 #include "oops/arrayKlass.hpp" 30 #include "oops/valueKlass.hpp" 31 #include "utilities/macros.hpp" 32 33 /** 34 * Array of values, gives a layout of typeArrayOop, but needs oops iterators 35 */ 36 class ValueArrayKlass : public ArrayKlass { 37 friend class VMStructs; 38 39 public: 40 static const KlassID ID = ValueArrayKlassID; 41 42 private: 43 // Constructor 44 ValueArrayKlass(Klass* element_klass, Symbol* name); 45 46 static ValueArrayKlass* allocate_klass(Klass* element_klass, Symbol* name, TRAPS); 47 protected: 48 // Returns the ArrayKlass for n'th dimension. 49 Klass* array_klass_impl(ArrayStorageProperties storage_props, bool or_null, int n, TRAPS); 50 51 // Returns the array class with this class as element type. 52 Klass* array_klass_impl(ArrayStorageProperties storage_props, bool or_null, TRAPS); 53 54 public: 55 56 ValueArrayKlass() {} 57 58 // Properties of an LWorld (LW2) flattened array 59 ArrayStorageProperties storage_properties() { return ArrayStorageProperties::flattened_and_null_free; } 60 61 virtual ValueKlass* element_klass() const; 62 virtual void set_element_klass(Klass* k); 63 64 // Casting from Klass* 65 static ValueArrayKlass* cast(Klass* k) { 66 assert(k->is_valueArray_klass(), "cast to ValueArrayKlass"); 67 return (ValueArrayKlass*) k; 68 } 69 70 // klass allocation 71 static ValueArrayKlass* allocate_klass(ArrayStorageProperties storage_props, Klass* element_klass, TRAPS); 72 73 void initialize(TRAPS); 74 75 ModuleEntry* module() const; 76 PackageEntry* package() const; 77 78 bool can_be_primary_super_slow() const; 79 GrowableArray<Klass*>* compute_secondary_supers(int num_extra_slots, 80 Array<InstanceKlass*>* transitive_interfaces); 81 82 int element_byte_size() const { return 1 << layout_helper_log2_element_size(_layout_helper); } 83 84 bool is_valueArray_klass_slow() const { return true; } 85 86 bool contains_oops() { 87 return element_klass()->contains_oops(); 88 } 89 90 bool is_atomic() { 91 return element_klass()->is_atomic(); |