Mercurial > hg > truffle
comparison src/share/vm/oops/objArrayKlass.hpp @ 6725:da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author | coleenp |
---|---|
date | Sat, 01 Sep 2012 13:25:18 -0400 |
parents | b632e80fc9dc |
children | d8ce2825b193 |
comparison
equal
deleted
inserted
replaced
6724:36d1d483d5d6 | 6725:da91efe96a93 |
---|---|
23 */ | 23 */ |
24 | 24 |
25 #ifndef SHARE_VM_OOPS_OBJARRAYKLASS_HPP | 25 #ifndef SHARE_VM_OOPS_OBJARRAYKLASS_HPP |
26 #define SHARE_VM_OOPS_OBJARRAYKLASS_HPP | 26 #define SHARE_VM_OOPS_OBJARRAYKLASS_HPP |
27 | 27 |
28 #include "classfile/classLoaderData.hpp" | |
28 #include "memory/specialized_oop_closures.hpp" | 29 #include "memory/specialized_oop_closures.hpp" |
29 #include "oops/arrayKlass.hpp" | 30 #include "oops/arrayKlass.hpp" |
30 #include "oops/instanceKlass.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 klassOop _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 klassOop _bottom_klass; // The one-dimensional type (instanceKlass or typeArrayKlass) | 38 Klass* _bottom_klass; // The one-dimensional type (InstanceKlass or typeArrayKlass) |
39 | |
40 // Constructor | |
41 objArrayKlass(int n, KlassHandle element_klass, Symbol* name); | |
42 static objArrayKlass* allocate(ClassLoaderData* loader_data, int n, KlassHandle klass_handle, Symbol* name, TRAPS); | |
39 public: | 43 public: |
44 // For dummy objects | |
45 objArrayKlass() {} | |
46 | |
40 // Instance variables | 47 // Instance variables |
41 klassOop element_klass() const { return _element_klass; } | 48 Klass* element_klass() const { return _element_klass; } |
42 void set_element_klass(klassOop k) { oop_store_without_check((oop*) &_element_klass, (oop) k); } | 49 void set_element_klass(Klass* k) { _element_klass = k; } |
43 oop* element_klass_addr() { return (oop*)&_element_klass; } | 50 Klass** element_klass_addr() { return &_element_klass; } |
44 | 51 |
45 klassOop bottom_klass() const { return _bottom_klass; } | 52 Klass* bottom_klass() const { return _bottom_klass; } |
46 void set_bottom_klass(klassOop k) { oop_store_without_check((oop*) &_bottom_klass, (oop) k); } | 53 void set_bottom_klass(Klass* k) { _bottom_klass = k; } |
47 oop* bottom_klass_addr() { return (oop*)&_bottom_klass; } | 54 Klass** bottom_klass_addr() { return &_bottom_klass; } |
48 | 55 |
49 // Compiler/Interpreter offset | 56 // Compiler/Interpreter offset |
50 static ByteSize element_klass_offset() { return in_ByteSize(sizeof(klassOopDesc) + offset_of(objArrayKlass, _element_klass)); } | 57 static ByteSize element_klass_offset() { return in_ByteSize(offset_of(objArrayKlass, _element_klass)); } |
51 | 58 |
52 // Dispatched operation | 59 // Dispatched operation |
53 bool can_be_primary_super_slow() const; | 60 bool can_be_primary_super_slow() const; |
54 objArrayOop compute_secondary_supers(int num_extra_slots, TRAPS); | 61 GrowableArray<Klass*>* compute_secondary_supers(int num_extra_slots); |
55 bool compute_is_subtype_of(klassOop k); | 62 bool compute_is_subtype_of(Klass* k); |
56 bool oop_is_objArray_slow() const { return true; } | 63 bool oop_is_objArray_slow() const { return true; } |
57 int oop_size(oop obj) const; | 64 int oop_size(oop obj) const; |
58 int klass_oop_size() const { return object_size(); } | |
59 | 65 |
60 // Allocation | 66 // Allocation |
61 DEFINE_ALLOCATE_PERMANENT(objArrayKlass); | 67 static Klass* allocate_objArray_klass(ClassLoaderData* loader_data, |
68 int n, KlassHandle element_klass, TRAPS); | |
69 | |
62 objArrayOop allocate(int length, TRAPS); | 70 objArrayOop allocate(int length, TRAPS); |
63 oop multi_allocate(int rank, jint* sizes, TRAPS); | 71 oop multi_allocate(int rank, jint* sizes, TRAPS); |
64 | 72 |
65 // Copying | 73 // Copying |
66 void copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS); | 74 void copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS); |
67 | 75 |
68 // Compute protection domain | 76 // Compute protection domain |
69 oop protection_domain() { return Klass::cast(bottom_klass())->protection_domain(); } | 77 oop protection_domain() { return Klass::cast(bottom_klass())->protection_domain(); } |
70 // Compute class loader | |
71 oop class_loader() const { return Klass::cast(bottom_klass())->class_loader(); } | |
72 | 78 |
73 private: | 79 private: |
74 // Either oop or narrowOop depending on UseCompressedOops. | 80 // Either oop or narrowOop depending on UseCompressedOops. |
75 // must be called from within objArrayKlass.cpp | 81 // must be called from within objArrayKlass.cpp |
76 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, |
77 T* dst, int length, TRAPS); | 83 T* dst, int length, TRAPS); |
78 protected: | 84 protected: |
79 // Returns the objArrayKlass for n'th dimension. | 85 // Returns the objArrayKlass for n'th dimension. |
80 virtual klassOop array_klass_impl(bool or_null, int n, TRAPS); | 86 virtual Klass* array_klass_impl(bool or_null, int n, TRAPS); |
81 | 87 |
82 // Returns the array class with this class as element type. | 88 // Returns the array class with this class as element type. |
83 virtual klassOop array_klass_impl(bool or_null, TRAPS); | 89 virtual Klass* array_klass_impl(bool or_null, TRAPS); |
84 | 90 |
85 public: | 91 public: |
86 // Casting from klassOop | 92 // Casting from Klass* |
87 static objArrayKlass* cast(klassOop k) { | 93 static objArrayKlass* cast(Klass* k) { |
88 assert(k->klass_part()->oop_is_objArray_slow(), "cast to objArrayKlass"); | 94 assert(k->oop_is_objArray(), "cast to objArrayKlass"); |
89 return (objArrayKlass*) k->klass_part(); | 95 return (objArrayKlass*) k; |
90 } | 96 } |
91 | 97 |
92 // Sizing | 98 // Sizing |
93 static int header_size() { return oopDesc::header_size() + sizeof(objArrayKlass)/HeapWordSize; } | 99 static int header_size() { return sizeof(objArrayKlass)/HeapWordSize; } |
94 int object_size() const { return arrayKlass::object_size(header_size()); } | 100 int size() const { return arrayKlass::static_size(header_size()); } |
95 | 101 |
96 // Initialization (virtual from Klass) | 102 // Initialization (virtual from Klass) |
97 void initialize(TRAPS); | 103 void initialize(TRAPS); |
98 | 104 |
99 // Garbage collection | 105 // Garbage collection |
110 template <class T> inline void | 116 template <class T> inline void |
111 objarray_follow_contents(ParCompactionManager* cm, oop obj, int index); | 117 objarray_follow_contents(ParCompactionManager* cm, oop obj, int index); |
112 #endif // !SERIALGC | 118 #endif // !SERIALGC |
113 | 119 |
114 // Iterators | 120 // Iterators |
115 int oop_oop_iterate(oop obj, OopClosure* blk) { | 121 int oop_oop_iterate(oop obj, ExtendedOopClosure* blk) { |
116 return oop_oop_iterate_v(obj, blk); | 122 return oop_oop_iterate_v(obj, blk); |
117 } | 123 } |
118 int oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) { | 124 int oop_oop_iterate_m(oop obj, ExtendedOopClosure* blk, MemRegion mr) { |
119 return oop_oop_iterate_v_m(obj, blk, mr); | 125 return oop_oop_iterate_v_m(obj, blk, mr); |
120 } | 126 } |
121 #define ObjArrayKlass_OOP_OOP_ITERATE_DECL(OopClosureType, nv_suffix) \ | 127 #define ObjArrayKlass_OOP_OOP_ITERATE_DECL(OopClosureType, nv_suffix) \ |
122 int oop_oop_iterate##nv_suffix(oop obj, OopClosureType* blk); \ | 128 int oop_oop_iterate##nv_suffix(oop obj, OopClosureType* blk); \ |
123 int oop_oop_iterate##nv_suffix##_m(oop obj, OopClosureType* blk, \ | 129 int oop_oop_iterate##nv_suffix##_m(oop obj, OopClosureType* blk, \ |
129 ALL_OOP_OOP_ITERATE_CLOSURES_2(ObjArrayKlass_OOP_OOP_ITERATE_DECL) | 135 ALL_OOP_OOP_ITERATE_CLOSURES_2(ObjArrayKlass_OOP_OOP_ITERATE_DECL) |
130 | 136 |
131 // JVM support | 137 // JVM support |
132 jint compute_modifier_flags(TRAPS) const; | 138 jint compute_modifier_flags(TRAPS) const; |
133 | 139 |
134 private: | |
135 static klassOop array_klass_impl (objArrayKlassHandle this_oop, bool or_null, int n, TRAPS); | |
136 | |
137 public: | 140 public: |
138 // Printing | 141 // Printing |
142 void print_on(outputStream* st) const; | |
143 void print_value_on(outputStream* st) const; | |
144 | |
139 void oop_print_value_on(oop obj, outputStream* st); | 145 void oop_print_value_on(oop obj, outputStream* st); |
140 #ifndef PRODUCT | 146 #ifndef PRODUCT |
141 void oop_print_on (oop obj, outputStream* st); | 147 void oop_print_on (oop obj, outputStream* st); |
142 #endif //PRODUCT | 148 #endif //PRODUCT |
143 | 149 |
150 const char* internal_name() const; | |
151 | |
144 // Verification | 152 // Verification |
145 const char* internal_name() const; | 153 void verify_on(outputStream* st); |
154 | |
146 void oop_verify_on(oop obj, outputStream* st); | 155 void oop_verify_on(oop obj, outputStream* st); |
147 }; | 156 }; |
148 | 157 |
149 #endif // SHARE_VM_OOPS_OBJARRAYKLASS_HPP | 158 #endif // SHARE_VM_OOPS_OBJARRAYKLASS_HPP |