Mercurial > hg > graal-compiler
annotate src/share/vm/oops/klass.cpp @ 10185:d50cc62e94ff
8012715: G1: GraphKit accesses PtrQueue::_index as int but is size_t
Summary: In graphKit INT operations were generated to access PtrQueue::_index which has type size_t. This is 64 bit on 64-bit machines. No problems occur on little endian machines as long as the index fits into 32 bit, but on big endian machines the upper part is read, which is zero. This leads to unnecessary branches to the slow path in the runtime.
Reviewed-by: twisti, johnc
Contributed-by: Martin Doerr <martin.doerr@sap.com>
author | johnc |
---|---|
date | Wed, 24 Apr 2013 14:48:43 -0700 |
parents | 1fc4d4768b90 |
children | b9a918201d47 92ef81e2f571 |
rev | line source |
---|---|
0 | 1 /* |
7956 | 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1155
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1155
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1155
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
26 #include "classfile/javaClasses.hpp" |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
27 #include "classfile/dictionary.hpp" |
1972 | 28 #include "classfile/systemDictionary.hpp" |
29 #include "classfile/vmSymbols.hpp" | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
30 #include "gc_implementation/shared/markSweep.inline.hpp" |
1972 | 31 #include "gc_interface/collectedHeap.inline.hpp" |
7956 | 32 #include "memory/heapInspection.hpp" |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
33 #include "memory/metadataFactory.hpp" |
1972 | 34 #include "memory/oopFactory.hpp" |
35 #include "memory/resourceArea.hpp" | |
36 #include "oops/instanceKlass.hpp" | |
37 #include "oops/klass.inline.hpp" | |
38 #include "oops/oop.inline2.hpp" | |
39 #include "runtime/atomic.hpp" | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
40 #include "utilities/stack.hpp" |
8001
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
7185
diff
changeset
|
41 #include "utilities/macros.hpp" |
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
7185
diff
changeset
|
42 #if INCLUDE_ALL_GCS |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
43 #include "gc_implementation/parallelScavenge/psParallelCompact.hpp" |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
44 #include "gc_implementation/parallelScavenge/psPromotionManager.hpp" |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
45 #include "gc_implementation/parallelScavenge/psScavenge.hpp" |
8001
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
7185
diff
changeset
|
46 #endif // INCLUDE_ALL_GCS |
0 | 47 |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
48 void Klass::set_name(Symbol* n) { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
49 _name = n; |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
50 if (_name != NULL) _name->increment_refcount(); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
51 } |
0 | 52 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
53 bool Klass::is_subclass_of(Klass* k) const { |
0 | 54 // Run up the super chain and check |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
55 if (this == k) return true; |
0 | 56 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
57 Klass* t = const_cast<Klass*>(this)->super(); |
0 | 58 |
59 while (t != NULL) { | |
60 if (t == k) return true; | |
6983 | 61 t = t->super(); |
0 | 62 } |
63 return false; | |
64 } | |
65 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
66 bool Klass::search_secondary_supers(Klass* k) const { |
0 | 67 // Put some extra logic here out-of-line, before the search proper. |
68 // This cuts down the size of the inline method. | |
69 | |
70 // This is necessary, since I am never in my own secondary_super list. | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
71 if (this == k) |
0 | 72 return true; |
73 // Scan the array-of-objects for a match | |
74 int cnt = secondary_supers()->length(); | |
75 for (int i = 0; i < cnt; i++) { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
76 if (secondary_supers()->at(i) == k) { |
0 | 77 ((Klass*)this)->set_secondary_super_cache(k); |
78 return true; | |
79 } | |
80 } | |
81 return false; | |
82 } | |
83 | |
84 // Return self, except for abstract classes with exactly 1 | |
85 // implementor. Then return the 1 concrete implementation. | |
86 Klass *Klass::up_cast_abstract() { | |
87 Klass *r = this; | |
88 while( r->is_abstract() ) { // Receiver is abstract? | |
89 Klass *s = r->subklass(); // Check for exactly 1 subklass | |
90 if( !s || s->next_sibling() ) // Oops; wrong count; give up | |
91 return this; // Return 'this' as a no-progress flag | |
92 r = s; // Loop till find concrete class | |
93 } | |
94 return r; // Return the 1 concrete class | |
95 } | |
96 | |
605 | 97 // Find LCA in class hierarchy |
0 | 98 Klass *Klass::LCA( Klass *k2 ) { |
99 Klass *k1 = this; | |
100 while( 1 ) { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
101 if( k1->is_subtype_of(k2) ) return k2; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
102 if( k2->is_subtype_of(k1) ) return k1; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
103 k1 = k1->super(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
104 k2 = k2->super(); |
0 | 105 } |
106 } | |
107 | |
108 | |
109 void Klass::check_valid_for_instantiation(bool throwError, TRAPS) { | |
110 ResourceMark rm(THREAD); | |
111 THROW_MSG(throwError ? vmSymbols::java_lang_InstantiationError() | |
112 : vmSymbols::java_lang_InstantiationException(), external_name()); | |
113 } | |
114 | |
115 | |
116 void Klass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS) { | |
117 THROW(vmSymbols::java_lang_ArrayStoreException()); | |
118 } | |
119 | |
120 | |
121 void Klass::initialize(TRAPS) { | |
122 ShouldNotReachHere(); | |
123 } | |
124 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
125 bool Klass::compute_is_subtype_of(Klass* k) { |
0 | 126 assert(k->is_klass(), "argument must be a class"); |
127 return is_subclass_of(k); | |
128 } | |
129 | |
130 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
131 Method* Klass::uncached_lookup_method(Symbol* name, Symbol* signature) const { |
0 | 132 #ifdef ASSERT |
133 tty->print_cr("Error: uncached_lookup_method called on a klass oop." | |
134 " Likely error: reflection method does not correctly" | |
135 " wrap return value in a mirror object."); | |
136 #endif | |
137 ShouldNotReachHere(); | |
138 return NULL; | |
139 } | |
140 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
141 void* Klass::operator new(size_t size, ClassLoaderData* loader_data, size_t word_size, TRAPS) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
142 return Metaspace::allocate(loader_data, word_size, /*read_only*/false, |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
143 Metaspace::ClassType, CHECK_NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
144 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
145 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
146 Klass::Klass() { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
147 Klass* k = this; |
0 | 148 |
8712
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
149 // Preinitialize supertype information. |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
150 // A later call to initialize_supers() may update these settings: |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
151 set_super(NULL); |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
152 for (juint i = 0; i < Klass::primary_super_limit(); i++) { |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
153 _primary_supers[i] = NULL; |
0 | 154 } |
8712
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
155 set_secondary_supers(NULL); |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
156 set_secondary_super_cache(NULL); |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
157 _primary_supers[0] = k; |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
158 set_super_check_offset(in_bytes(primary_supers_offset())); |
0 | 159 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
160 set_java_mirror(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
161 set_modifier_flags(0); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
162 set_layout_helper(Klass::_lh_neutral_value); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
163 set_name(NULL); |
0 | 164 AccessFlags af; |
165 af.set_flags(0); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
166 set_access_flags(af); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
167 set_subklass(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
168 set_next_sibling(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
169 set_next_link(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
170 set_alloc_count(0); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
171 TRACE_SET_KLASS_TRACE_ID(this, 0); |
0 | 172 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
173 set_prototype_header(markOopDesc::prototype()); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
174 set_biased_lock_revocation_count(0); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
175 set_last_biased_lock_bulk_revocation_time(0); |
0 | 176 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
177 // The klass doesn't have any references at this point. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
178 clear_modified_oops(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
179 clear_accumulated_modified_oops(); |
0 | 180 } |
181 | |
182 jint Klass::array_layout_helper(BasicType etype) { | |
183 assert(etype >= T_BOOLEAN && etype <= T_OBJECT, "valid etype"); | |
184 // Note that T_ARRAY is not allowed here. | |
185 int hsize = arrayOopDesc::base_offset_in_bytes(etype); | |
29
d5fc211aea19
6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents:
0
diff
changeset
|
186 int esize = type2aelembytes(etype); |
0 | 187 bool isobj = (etype == T_OBJECT); |
188 int tag = isobj ? _lh_array_tag_obj_value : _lh_array_tag_type_value; | |
189 int lh = array_layout_helper(tag, hsize, etype, exact_log2(esize)); | |
190 | |
191 assert(lh < (int)_lh_neutral_value, "must look like an array layout"); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
192 assert(layout_helper_is_array(lh), "correct kind"); |
0 | 193 assert(layout_helper_is_objArray(lh) == isobj, "correct kind"); |
194 assert(layout_helper_is_typeArray(lh) == !isobj, "correct kind"); | |
195 assert(layout_helper_header_size(lh) == hsize, "correct decode"); | |
196 assert(layout_helper_element_type(lh) == etype, "correct decode"); | |
197 assert(1 << layout_helper_log2_element_size(lh) == esize, "correct decode"); | |
198 | |
199 return lh; | |
200 } | |
201 | |
202 bool Klass::can_be_primary_super_slow() const { | |
203 if (super() == NULL) | |
204 return true; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
205 else if (super()->super_depth() >= primary_super_limit()-1) |
0 | 206 return false; |
207 else | |
208 return true; | |
209 } | |
210 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
211 void Klass::initialize_supers(Klass* k, TRAPS) { |
0 | 212 if (FastSuperclassLimit == 0) { |
213 // None of the other machinery matters. | |
214 set_super(k); | |
215 return; | |
216 } | |
217 if (k == NULL) { | |
218 set_super(NULL); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
219 _primary_supers[0] = this; |
0 | 220 assert(super_depth() == 0, "Object must already be initialized properly"); |
1142 | 221 } else if (k != super() || k == SystemDictionary::Object_klass()) { |
222 assert(super() == NULL || super() == SystemDictionary::Object_klass(), | |
0 | 223 "initialize this only once to a non-trivial value"); |
224 set_super(k); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
225 Klass* sup = k; |
0 | 226 int sup_depth = sup->super_depth(); |
227 juint my_depth = MIN2(sup_depth + 1, (int)primary_super_limit()); | |
228 if (!can_be_primary_super_slow()) | |
229 my_depth = primary_super_limit(); | |
230 for (juint i = 0; i < my_depth; i++) { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
231 _primary_supers[i] = sup->_primary_supers[i]; |
0 | 232 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
233 Klass* *super_check_cell; |
0 | 234 if (my_depth < primary_super_limit()) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
235 _primary_supers[my_depth] = this; |
0 | 236 super_check_cell = &_primary_supers[my_depth]; |
237 } else { | |
238 // Overflow of the primary_supers array forces me to be secondary. | |
239 super_check_cell = &_secondary_super_cache; | |
240 } | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
241 set_super_check_offset((address)super_check_cell - (address) this); |
0 | 242 |
243 #ifdef ASSERT | |
244 { | |
245 juint j = super_depth(); | |
246 assert(j == my_depth, "computed accessor gets right answer"); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
247 Klass* t = this; |
6983 | 248 while (!t->can_be_primary_super()) { |
249 t = t->super(); | |
250 j = t->super_depth(); | |
0 | 251 } |
252 for (juint j1 = j+1; j1 < primary_super_limit(); j1++) { | |
253 assert(primary_super_of_depth(j1) == NULL, "super list padding"); | |
254 } | |
255 while (t != NULL) { | |
256 assert(primary_super_of_depth(j) == t, "super list initialization"); | |
6983 | 257 t = t->super(); |
0 | 258 --j; |
259 } | |
260 assert(j == (juint)-1, "correct depth count"); | |
261 } | |
262 #endif | |
263 } | |
264 | |
265 if (secondary_supers() == NULL) { | |
266 KlassHandle this_kh (THREAD, this); | |
267 | |
268 // Now compute the list of secondary supertypes. | |
269 // Secondaries can occasionally be on the super chain, | |
270 // if the inline "_primary_supers" array overflows. | |
271 int extras = 0; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
272 Klass* p; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
273 for (p = super(); !(p == NULL || p->can_be_primary_super()); p = p->super()) { |
0 | 274 ++extras; |
275 } | |
276 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
277 ResourceMark rm(THREAD); // need to reclaim GrowableArrays allocated below |
0 | 278 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
279 // Compute the "real" non-extra secondaries. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
280 GrowableArray<Klass*>* secondaries = compute_secondary_supers(extras); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
281 if (secondaries == NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
282 // secondary_supers set by compute_secondary_supers |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
283 return; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
284 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
285 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
286 GrowableArray<Klass*>* primaries = new GrowableArray<Klass*>(extras); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
287 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
288 for (p = this_kh->super(); !(p == NULL || p->can_be_primary_super()); p = p->super()) { |
0 | 289 int i; // Scan for overflow primaries being duplicates of 2nd'arys |
290 | |
291 // This happens frequently for very deeply nested arrays: the | |
292 // primary superclass chain overflows into the secondary. The | |
293 // secondary list contains the element_klass's secondaries with | |
294 // an extra array dimension added. If the element_klass's | |
295 // secondary list already contains some primary overflows, they | |
296 // (with the extra level of array-ness) will collide with the | |
297 // normal primary superclass overflows. | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
298 for( i = 0; i < secondaries->length(); i++ ) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
299 if( secondaries->at(i) == p ) |
0 | 300 break; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
301 } |
0 | 302 if( i < secondaries->length() ) |
303 continue; // It's a dup, don't put it in | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
304 primaries->push(p); |
0 | 305 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
306 // Combine the two arrays into a metadata object to pack the array. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
307 // The primaries are added in the reverse order, then the secondaries. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
308 int new_length = primaries->length() + secondaries->length(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
309 Array<Klass*>* s2 = MetadataFactory::new_array<Klass*>( |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
310 class_loader_data(), new_length, CHECK); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
311 int fill_p = primaries->length(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
312 for (int j = 0; j < fill_p; j++) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
313 s2->at_put(j, primaries->pop()); // add primaries in reverse order. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
314 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
315 for( int j = 0; j < secondaries->length(); j++ ) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
316 s2->at_put(j+fill_p, secondaries->at(j)); // add secondaries on the end. |
0 | 317 } |
318 | |
319 #ifdef ASSERT | |
320 // We must not copy any NULL placeholders left over from bootstrap. | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
321 for (int j = 0; j < s2->length(); j++) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
322 assert(s2->at(j) != NULL, "correct bootstrapping order"); |
0 | 323 } |
324 #endif | |
325 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
326 this_kh->set_secondary_supers(s2); |
0 | 327 } |
328 } | |
329 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
330 GrowableArray<Klass*>* Klass::compute_secondary_supers(int num_extra_slots) { |
0 | 331 assert(num_extra_slots == 0, "override for complex klasses"); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
332 set_secondary_supers(Universe::the_empty_klass_array()); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
333 return NULL; |
0 | 334 } |
335 | |
336 | |
337 Klass* Klass::subklass() const { | |
6983 | 338 return _subklass == NULL ? NULL : _subklass; |
0 | 339 } |
340 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
341 InstanceKlass* Klass::superklass() const { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
342 assert(super() == NULL || super()->oop_is_instance(), "must be instance klass"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
343 return _super == NULL ? NULL : InstanceKlass::cast(_super); |
0 | 344 } |
345 | |
346 Klass* Klass::next_sibling() const { | |
6983 | 347 return _next_sibling == NULL ? NULL : _next_sibling; |
0 | 348 } |
349 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
350 void Klass::set_subklass(Klass* s) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
351 assert(s != this, "sanity check"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
352 _subklass = s; |
0 | 353 } |
354 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
355 void Klass::set_next_sibling(Klass* s) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
356 assert(s != this, "sanity check"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
357 _next_sibling = s; |
0 | 358 } |
359 | |
360 void Klass::append_to_sibling_list() { | |
6867 | 361 debug_only(verify();) |
0 | 362 // add ourselves to superklass' subklass list |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
363 InstanceKlass* super = superklass(); |
0 | 364 if (super == NULL) return; // special case: class Object |
6867 | 365 assert((!super->is_interface() // interfaces cannot be supers |
0 | 366 && (super->superklass() == NULL || !is_interface())), |
367 "an interface can only be a subklass of Object"); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
368 Klass* prev_first_subklass = super->subklass_oop(); |
0 | 369 if (prev_first_subklass != NULL) { |
370 // set our sibling to be the superklass' previous first subklass | |
371 set_next_sibling(prev_first_subklass); | |
372 } | |
373 // make ourselves the superklass' first subklass | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
374 super->set_subklass(this); |
6867 | 375 debug_only(verify();) |
0 | 376 } |
377 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
378 bool Klass::is_loader_alive(BoolObjectClosure* is_alive) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
379 assert(is_metadata(), "p is not meta-data"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
380 assert(ClassLoaderDataGraph::contains((address)this), "is in the metaspace"); |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
381 |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
382 #ifdef ASSERT |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
383 // The class is alive iff the class loader is alive. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
384 oop loader = class_loader(); |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
385 bool loader_alive = (loader == NULL) || is_alive->do_object_b(loader); |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
386 #endif // ASSERT |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
387 |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
388 // The class is alive if it's mirror is alive (which should be marked if the |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
389 // loader is alive) unless it's an anoymous class. |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
390 bool mirror_alive = is_alive->do_object_b(java_mirror()); |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
391 assert(!mirror_alive || loader_alive, "loader must be alive if the mirror is" |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
392 " but not the other way around with anonymous classes"); |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
393 return mirror_alive; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
394 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
395 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
396 void Klass::clean_weak_klass_links(BoolObjectClosure* is_alive) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
397 if (!ClassUnloading) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
398 return; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
399 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
400 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
401 Klass* root = SystemDictionary::Object_klass(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
402 Stack<Klass*, mtGC> stack; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
403 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
404 stack.push(root); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
405 while (!stack.is_empty()) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
406 Klass* current = stack.pop(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
407 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
408 assert(current->is_loader_alive(is_alive), "just checking, this should be live"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
409 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
410 // Find and set the first alive subklass |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
411 Klass* sub = current->subklass_oop(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
412 while (sub != NULL && !sub->is_loader_alive(is_alive)) { |
0 | 413 #ifndef PRODUCT |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
414 if (TraceClassUnloading && WizardMode) { |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
415 ResourceMark rm; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
416 tty->print_cr("[Unlinking class (subclass) %s]", sub->external_name()); |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
417 } |
0 | 418 #endif |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
419 sub = sub->next_sibling_oop(); |
0 | 420 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
421 current->set_subklass(sub); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
422 if (sub != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
423 stack.push(sub); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
424 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
425 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
426 // Find and set the first alive sibling |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
427 Klass* sibling = current->next_sibling_oop(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
428 while (sibling != NULL && !sibling->is_loader_alive(is_alive)) { |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
429 if (TraceClassUnloading && WizardMode) { |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
430 ResourceMark rm; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
431 tty->print_cr("[Unlinking class (sibling) %s]", sibling->external_name()); |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
432 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
433 sibling = sibling->next_sibling_oop(); |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
434 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
435 current->set_next_sibling(sibling); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
436 if (sibling != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
437 stack.push(sibling); |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
438 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
439 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
440 // Clean the implementors list and method data. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
441 if (current->oop_is_instance()) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
442 InstanceKlass* ik = InstanceKlass::cast(current); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
443 ik->clean_implementors_list(is_alive); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
444 ik->clean_method_data(is_alive); |
0 | 445 } |
446 } | |
447 } | |
448 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
449 void Klass::klass_update_barrier_set(oop v) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
450 record_modified_oops(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
451 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
452 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
453 void Klass::klass_update_barrier_set_pre(void* p, oop v) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
454 // This barrier used by G1, where it's used remember the old oop values, |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
455 // so that we don't forget any objects that were live at the snapshot at |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
456 // the beginning. This function is only used when we write oops into |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
457 // Klasses. Since the Klasses are used as roots in G1, we don't have to |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
458 // do anything here. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
459 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
460 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
461 void Klass::klass_oop_store(oop* p, oop v) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
462 assert(!Universe::heap()->is_in_reserved((void*)p), "Should store pointer into metadata"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
463 assert(v == NULL || Universe::heap()->is_in_reserved((void*)v), "Should store pointer to an object"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
464 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
465 // do the store |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
466 if (always_do_update_barrier) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
467 klass_oop_store((volatile oop*)p, v); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
468 } else { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
469 klass_update_barrier_set_pre((void*)p, v); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
470 *p = v; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
471 klass_update_barrier_set(v); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
472 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
473 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
474 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
475 void Klass::klass_oop_store(volatile oop* p, oop v) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
476 assert(!Universe::heap()->is_in_reserved((void*)p), "Should store pointer into metadata"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
477 assert(v == NULL || Universe::heap()->is_in_reserved((void*)v), "Should store pointer to an object"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
478 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
479 klass_update_barrier_set_pre((void*)p, v); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
480 OrderAccess::release_store_ptr(p, v); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
481 klass_update_barrier_set(v); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
482 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
483 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
484 void Klass::oops_do(OopClosure* cl) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
485 cl->do_oop(&_java_mirror); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
486 } |
0 | 487 |
488 void Klass::remove_unshareable_info() { | |
8751
1fc4d4768b90
8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents:
8712
diff
changeset
|
489 if (!DumpSharedSpaces) { |
1fc4d4768b90
8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents:
8712
diff
changeset
|
490 // Clean up after OOM during class loading |
1fc4d4768b90
8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents:
8712
diff
changeset
|
491 if (class_loader_data() != NULL) { |
1fc4d4768b90
8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents:
8712
diff
changeset
|
492 class_loader_data()->remove_class(this); |
1fc4d4768b90
8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents:
8712
diff
changeset
|
493 } |
1fc4d4768b90
8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents:
8712
diff
changeset
|
494 } |
0 | 495 set_subklass(NULL); |
496 set_next_sibling(NULL); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
497 // Clear the java mirror |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
498 set_java_mirror(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
499 set_next_link(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
500 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
501 // Null out class_loader_data because we don't share that yet. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
502 set_class_loader_data(NULL); |
0 | 503 } |
504 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
505 void Klass::restore_unshareable_info(TRAPS) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
506 ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
507 // Restore class_loader_data to the null class loader data |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
508 set_class_loader_data(loader_data); |
0 | 509 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
510 // Add to null class loader list first before creating the mirror |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
511 // (same order as class file parsing) |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
512 loader_data->add_class(this); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
513 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
514 // Recreate the class mirror |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
515 java_lang_Class::create_mirror(this, CHECK); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
516 } |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
517 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
518 Klass* Klass::array_klass_or_null(int rank) { |
0 | 519 EXCEPTION_MARK; |
520 // No exception can be thrown by array_klass_impl when called with or_null == true. | |
521 // (In anycase, the execption mark will fail if it do so) | |
522 return array_klass_impl(true, rank, THREAD); | |
523 } | |
524 | |
525 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
526 Klass* Klass::array_klass_or_null() { |
0 | 527 EXCEPTION_MARK; |
528 // No exception can be thrown by array_klass_impl when called with or_null == true. | |
529 // (In anycase, the execption mark will fail if it do so) | |
530 return array_klass_impl(true, THREAD); | |
531 } | |
532 | |
533 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
534 Klass* Klass::array_klass_impl(bool or_null, int rank, TRAPS) { |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
535 fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass"); |
0 | 536 return NULL; |
537 } | |
538 | |
539 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
540 Klass* Klass::array_klass_impl(bool or_null, TRAPS) { |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
541 fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass"); |
0 | 542 return NULL; |
543 } | |
544 | |
545 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
546 void Klass::with_array_klasses_do(void f(Klass* k)) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
547 f(this); |
0 | 548 } |
549 | |
550 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
551 oop Klass::class_loader() const { return class_loader_data()->class_loader(); } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
552 |
0 | 553 const char* Klass::external_name() const { |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
554 if (oop_is_instance()) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
555 InstanceKlass* ik = (InstanceKlass*) this; |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
556 if (ik->is_anonymous()) { |
2416
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2177
diff
changeset
|
557 assert(EnableInvokeDynamic, ""); |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
558 intptr_t hash = 0; |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
559 if (ik->java_mirror() != NULL) { |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
560 // java_mirror might not be created yet, return 0 as hash. |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
561 hash = ik->java_mirror()->identity_hash(); |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
562 } |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
563 char hash_buf[40]; |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
564 sprintf(hash_buf, "/" UINTX_FORMAT, (uintx)hash); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
565 size_t hash_len = strlen(hash_buf); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
566 |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
567 size_t result_len = name()->utf8_length(); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
568 char* result = NEW_RESOURCE_ARRAY(char, result_len + hash_len + 1); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
569 name()->as_klass_external_name(result, (int) result_len + 1); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
570 assert(strlen(result) == result_len, ""); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
571 strcpy(result + result_len, hash_buf); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
572 assert(strlen(result) == result_len + hash_len, ""); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
573 return result; |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
574 } |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
575 } |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
605
diff
changeset
|
576 if (name() == NULL) return "<unknown>"; |
0 | 577 return name()->as_klass_external_name(); |
578 } | |
579 | |
580 | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
605
diff
changeset
|
581 const char* Klass::signature_name() const { |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
605
diff
changeset
|
582 if (name() == NULL) return "<unknown>"; |
0 | 583 return name()->as_C_string(); |
584 } | |
585 | |
586 // Unless overridden, modifier_flags is 0. | |
587 jint Klass::compute_modifier_flags(TRAPS) const { | |
588 return 0; | |
589 } | |
590 | |
591 int Klass::atomic_incr_biased_lock_revocation_count() { | |
592 return (int) Atomic::add(1, &_biased_lock_revocation_count); | |
593 } | |
594 | |
595 // Unless overridden, jvmti_class_status has no flags set. | |
596 jint Klass::jvmti_class_status() const { | |
597 return 0; | |
598 } | |
599 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
600 |
0 | 601 // Printing |
602 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
603 void Klass::print_on(outputStream* st) const { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
604 ResourceMark rm; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
605 // print title |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
606 st->print("%s", internal_name()); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
607 print_address_on(st); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
608 st->cr(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
609 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
610 |
0 | 611 void Klass::oop_print_on(oop obj, outputStream* st) { |
612 ResourceMark rm; | |
613 // print title | |
614 st->print_cr("%s ", internal_name()); | |
615 obj->print_address_on(st); | |
616 | |
617 if (WizardMode) { | |
618 // print header | |
619 obj->mark()->print_on(st); | |
620 } | |
621 | |
622 // print class | |
623 st->print(" - klass: "); | |
624 obj->klass()->print_value_on(st); | |
625 st->cr(); | |
626 } | |
627 | |
628 void Klass::oop_print_value_on(oop obj, outputStream* st) { | |
629 // print title | |
630 ResourceMark rm; // Cannot print in debug mode without this | |
631 st->print("%s", internal_name()); | |
632 obj->print_address_on(st); | |
633 } | |
634 | |
7956 | 635 #if INCLUDE_SERVICES |
636 // Size Statistics | |
637 void Klass::collect_statistics(KlassSizeStats *sz) const { | |
638 sz->_klass_bytes = sz->count(this); | |
639 sz->_mirror_bytes = sz->count(java_mirror()); | |
640 sz->_secondary_supers_bytes = sz->count_array(secondary_supers()); | |
641 | |
642 sz->_ro_bytes += sz->_secondary_supers_bytes; | |
643 sz->_rw_bytes += sz->_klass_bytes + sz->_mirror_bytes; | |
644 } | |
645 #endif // INCLUDE_SERVICES | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
646 |
0 | 647 // Verification |
648 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
649 void Klass::verify_on(outputStream* st) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
650 guarantee(!Universe::heap()->is_in_reserved(this), "Shouldn't be"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
651 guarantee(this->is_metadata(), "should be in metaspace"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
652 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
653 assert(ClassLoaderDataGraph::contains((address)this), "Should be"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
654 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
655 guarantee(this->is_klass(),"should be klass"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
656 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
657 if (super() != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
658 guarantee(super()->is_metadata(), "should be in metaspace"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
659 guarantee(super()->is_klass(), "should be klass"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
660 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
661 if (secondary_super_cache() != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
662 Klass* ko = secondary_super_cache(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
663 guarantee(ko->is_metadata(), "should be in metaspace"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
664 guarantee(ko->is_klass(), "should be klass"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
665 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
666 for ( uint i = 0; i < primary_super_limit(); i++ ) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
667 Klass* ko = _primary_supers[i]; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
668 if (ko != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
669 guarantee(ko->is_metadata(), "should be in metaspace"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
670 guarantee(ko->is_klass(), "should be klass"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
671 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
672 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
673 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
674 if (java_mirror() != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
675 guarantee(java_mirror()->is_oop(), "should be instance"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
676 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
677 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
678 |
0 | 679 void Klass::oop_verify_on(oop obj, outputStream* st) { |
680 guarantee(obj->is_oop(), "should be oop"); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
681 guarantee(obj->klass()->is_metadata(), "should not be in Java heap"); |
0 | 682 guarantee(obj->klass()->is_klass(), "klass field is not a klass"); |
683 } | |
684 | |
685 #ifndef PRODUCT | |
686 | |
687 void Klass::verify_vtable_index(int i) { | |
688 if (oop_is_instance()) { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
689 assert(i>=0 && i<((InstanceKlass*)this)->vtable_length()/vtableEntry::size(), "index out of bounds"); |
0 | 690 } else { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
691 assert(oop_is_array(), "Must be"); |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
692 assert(i>=0 && i<((ArrayKlass*)this)->vtable_length()/vtableEntry::size(), "index out of bounds"); |
0 | 693 } |
694 } | |
695 | |
696 #endif |