25 #ifndef SHARE_OOPS_ARRAYKLASS_HPP
26 #define SHARE_OOPS_ARRAYKLASS_HPP
27
28 #include "oops/klass.hpp"
29
30 class fieldDescriptor;
31 class klassVtable;
32
33 // ArrayKlass is the abstract baseclass for all array classes
34
35 class ArrayKlass: public Klass {
36 friend class VMStructs;
37 private:
38 // If you add a new field that points to any metaspace object, you
39 // must add this field to ArrayKlass::metaspace_pointers_do().
40 int _dimension; // This is n'th-dimensional array.
41 Klass* volatile _higher_dimension; // Refers the (n+1)'th-dimensional array (if present).
42 Klass* volatile _lower_dimension; // Refers the (n-1)'th-dimensional array (if present).
43
44 protected:
45 // Constructors
46 // The constructor with the Symbol argument does the real array
47 // initialization, the other is a dummy
48 ArrayKlass(Symbol* name, KlassKind kind);
49 ArrayKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for cds"); }
50
51 public:
52 // Testing operation
53 DEBUG_ONLY(bool is_array_klass_slow() const { return true; })
54
55 // Instance variables
56 int dimension() const { return _dimension; }
57 void set_dimension(int dimension) { _dimension = dimension; }
58
59 Klass* higher_dimension() const { return _higher_dimension; }
60 inline Klass* higher_dimension_acquire() const; // load with acquire semantics
61 void set_higher_dimension(Klass* k) { _higher_dimension = k; }
62 inline void release_set_higher_dimension(Klass* k); // store with release semantics
63
64 Klass* lower_dimension() const { return _lower_dimension; }
65 void set_lower_dimension(Klass* k) { _lower_dimension = k; }
66
67 // offset of first element, including any padding for the sake of alignment
68 int array_header_in_bytes() const { return layout_helper_header_size(layout_helper()); }
69 int log2_element_size() const { return layout_helper_log2_element_size(layout_helper()); }
70 // type of elements (T_OBJECT for both oop arrays and array-arrays)
71 BasicType element_type() const { return layout_helper_element_type(layout_helper()); }
82 Klass* find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const;
83
84 // Lookup operations
85 Method* uncached_lookup_method(const Symbol* name,
86 const Symbol* signature,
87 OverpassLookupMode overpass_mode,
88 PrivateLookupMode private_mode = PrivateLookupMode::find) const;
89
90 static ArrayKlass* cast(Klass* k) {
91 return const_cast<ArrayKlass*>(cast(const_cast<const Klass*>(k)));
92 }
93
94 static const ArrayKlass* cast(const Klass* k) {
95 assert(k->is_array_klass(), "cast to ArrayKlass");
96 return static_cast<const ArrayKlass*>(k);
97 }
98
99 GrowableArray<Klass*>* compute_secondary_supers(int num_extra_slots,
100 Array<InstanceKlass*>* transitive_interfaces);
101
102 // Sizing
103 static int static_size(int header_size);
104
105 virtual void metaspace_pointers_do(MetaspaceClosure* iter);
106
107 // Return a handle.
108 static void complete_create_array_klass(ArrayKlass* k, Klass* super_klass, ModuleEntry* module, TRAPS);
109
110
111 // jvm support
112 jint compute_modifier_flags() const;
113
114 // JVMTI support
115 jint jvmti_class_status() const;
116
117 #if INCLUDE_CDS
118 // CDS support - remove and restore oops from metadata. Oops are not shared.
119 virtual void remove_unshareable_info();
120 virtual void remove_java_mirror();
121 void restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS);
|
25 #ifndef SHARE_OOPS_ARRAYKLASS_HPP
26 #define SHARE_OOPS_ARRAYKLASS_HPP
27
28 #include "oops/klass.hpp"
29
30 class fieldDescriptor;
31 class klassVtable;
32
33 // ArrayKlass is the abstract baseclass for all array classes
34
35 class ArrayKlass: public Klass {
36 friend class VMStructs;
37 private:
38 // If you add a new field that points to any metaspace object, you
39 // must add this field to ArrayKlass::metaspace_pointers_do().
40 int _dimension; // This is n'th-dimensional array.
41 Klass* volatile _higher_dimension; // Refers the (n+1)'th-dimensional array (if present).
42 Klass* volatile _lower_dimension; // Refers the (n-1)'th-dimensional array (if present).
43
44 protected:
45 Klass* _element_klass; // The klass of the elements of this array type
46 // The element type must be registered for both object arrays
47 // (incl. object arrays with value type elements) and value type
48 // arrays containing flattened value types. However, the element
49 // type must not be registered for arrays of primitive types.
50 // TODO: Update the class hierarchy so that element klass appears
51 // only in array that contain non-primitive types.
52 // Constructors
53 // The constructor with the Symbol argument does the real array
54 // initialization, the other is a dummy
55 ArrayKlass(Symbol* name, KlassKind kind);
56 ArrayKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for cds"); }
57
58 // Create array_name for element klass
59 static Symbol* create_element_klass_array_name(Klass* element_klass, bool qdesc, TRAPS);
60
61 public:
62 // Instance variables
63 virtual Klass* element_klass() const { return _element_klass; }
64 virtual void set_element_klass(Klass* k) { _element_klass = k; }
65
66 // Compiler/Interpreter offset
67 static ByteSize element_klass_offset() { return in_ByteSize(offset_of(ArrayKlass, _element_klass)); }
68
69 // Are loads and stores to this concrete array type atomic?
70 // Note that Object[] is naturally atomic, but its subtypes may not be.
71 virtual bool element_access_is_atomic() { return true; }
72
73 // Testing operation
74 DEBUG_ONLY(bool is_array_klass_slow() const { return true; })
75
76 // Instance variables
77 int dimension() const { return _dimension; }
78 void set_dimension(int dimension) { _dimension = dimension; }
79
80 Klass* higher_dimension() const { return _higher_dimension; }
81 inline Klass* higher_dimension_acquire() const; // load with acquire semantics
82 void set_higher_dimension(Klass* k) { _higher_dimension = k; }
83 inline void release_set_higher_dimension(Klass* k); // store with release semantics
84
85 Klass* lower_dimension() const { return _lower_dimension; }
86 void set_lower_dimension(Klass* k) { _lower_dimension = k; }
87
88 // offset of first element, including any padding for the sake of alignment
89 int array_header_in_bytes() const { return layout_helper_header_size(layout_helper()); }
90 int log2_element_size() const { return layout_helper_log2_element_size(layout_helper()); }
91 // type of elements (T_OBJECT for both oop arrays and array-arrays)
92 BasicType element_type() const { return layout_helper_element_type(layout_helper()); }
103 Klass* find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const;
104
105 // Lookup operations
106 Method* uncached_lookup_method(const Symbol* name,
107 const Symbol* signature,
108 OverpassLookupMode overpass_mode,
109 PrivateLookupMode private_mode = PrivateLookupMode::find) const;
110
111 static ArrayKlass* cast(Klass* k) {
112 return const_cast<ArrayKlass*>(cast(const_cast<const Klass*>(k)));
113 }
114
115 static const ArrayKlass* cast(const Klass* k) {
116 assert(k->is_array_klass(), "cast to ArrayKlass");
117 return static_cast<const ArrayKlass*>(k);
118 }
119
120 GrowableArray<Klass*>* compute_secondary_supers(int num_extra_slots,
121 Array<InstanceKlass*>* transitive_interfaces);
122
123 oop component_mirror() const;
124
125 // Sizing
126 static int static_size(int header_size);
127
128 virtual void metaspace_pointers_do(MetaspaceClosure* iter);
129
130 // Return a handle.
131 static void complete_create_array_klass(ArrayKlass* k, Klass* super_klass, ModuleEntry* module, TRAPS);
132
133
134 // jvm support
135 jint compute_modifier_flags() const;
136
137 // JVMTI support
138 jint jvmti_class_status() const;
139
140 #if INCLUDE_CDS
141 // CDS support - remove and restore oops from metadata. Oops are not shared.
142 virtual void remove_unshareable_info();
143 virtual void remove_java_mirror();
144 void restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS);
|