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 |