Mercurial > hg > truffle
annotate src/share/vm/oops/klass.cpp @ 17716:cdb71841f4bc
6498581: ThreadInterruptTest3 produces wrong output on Windows
Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set.
Reviewed-by: acorn, kvn
Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author | minqi |
---|---|
date | Wed, 26 Feb 2014 15:20:41 -0800 |
parents | 85318d1fe8fe |
children | 7f0e0366ec81 9428a0b94204 |
rev | line source |
---|---|
0 | 1 /* |
17674
85318d1fe8fe
8027146: Class loading verification failure if GC occurs in Universe::flush_dependents_on
coleenp
parents:
17663
diff
changeset
|
2 * Copyright (c) 1997, 2014, 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" | |
10405 | 40 #include "trace/traceMacros.hpp" |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
41 #include "utilities/stack.hpp" |
8001
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
7185
diff
changeset
|
42 #include "utilities/macros.hpp" |
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
7185
diff
changeset
|
43 #if INCLUDE_ALL_GCS |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
44 #include "gc_implementation/parallelScavenge/psParallelCompact.hpp" |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
45 #include "gc_implementation/parallelScavenge/psPromotionManager.hpp" |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
46 #include "gc_implementation/parallelScavenge/psScavenge.hpp" |
8001
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
7185
diff
changeset
|
47 #endif // INCLUDE_ALL_GCS |
0 | 48 |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
49 void Klass::set_name(Symbol* n) { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
50 _name = n; |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
51 if (_name != NULL) _name->increment_refcount(); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
52 } |
0 | 53 |
10265
92ef81e2f571
8003557: NPG: Klass* const k should be const Klass* k.
minqi
parents:
8751
diff
changeset
|
54 bool Klass::is_subclass_of(const Klass* k) const { |
0 | 55 // Run up the super chain and check |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
56 if (this == k) return true; |
0 | 57 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
58 Klass* t = const_cast<Klass*>(this)->super(); |
0 | 59 |
60 while (t != NULL) { | |
61 if (t == k) return true; | |
6983 | 62 t = t->super(); |
0 | 63 } |
64 return false; | |
65 } | |
66 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
67 bool Klass::search_secondary_supers(Klass* k) const { |
0 | 68 // Put some extra logic here out-of-line, before the search proper. |
69 // This cuts down the size of the inline method. | |
70 | |
71 // 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
|
72 if (this == k) |
0 | 73 return true; |
74 // Scan the array-of-objects for a match | |
75 int cnt = secondary_supers()->length(); | |
76 for (int i = 0; i < cnt; i++) { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
77 if (secondary_supers()->at(i) == k) { |
0 | 78 ((Klass*)this)->set_secondary_super_cache(k); |
79 return true; | |
80 } | |
81 } | |
82 return false; | |
83 } | |
84 | |
85 // Return self, except for abstract classes with exactly 1 | |
86 // implementor. Then return the 1 concrete implementation. | |
87 Klass *Klass::up_cast_abstract() { | |
88 Klass *r = this; | |
89 while( r->is_abstract() ) { // Receiver is abstract? | |
90 Klass *s = r->subklass(); // Check for exactly 1 subklass | |
91 if( !s || s->next_sibling() ) // Oops; wrong count; give up | |
92 return this; // Return 'this' as a no-progress flag | |
93 r = s; // Loop till find concrete class | |
94 } | |
95 return r; // Return the 1 concrete class | |
96 } | |
97 | |
605 | 98 // Find LCA in class hierarchy |
0 | 99 Klass *Klass::LCA( Klass *k2 ) { |
100 Klass *k1 = this; | |
101 while( 1 ) { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
102 if( k1->is_subtype_of(k2) ) return k2; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
103 if( k2->is_subtype_of(k1) ) return k1; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
104 k1 = k1->super(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
105 k2 = k2->super(); |
0 | 106 } |
107 } | |
108 | |
109 | |
110 void Klass::check_valid_for_instantiation(bool throwError, TRAPS) { | |
111 ResourceMark rm(THREAD); | |
112 THROW_MSG(throwError ? vmSymbols::java_lang_InstantiationError() | |
113 : vmSymbols::java_lang_InstantiationException(), external_name()); | |
114 } | |
115 | |
116 | |
117 void Klass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS) { | |
118 THROW(vmSymbols::java_lang_ArrayStoreException()); | |
119 } | |
120 | |
121 | |
122 void Klass::initialize(TRAPS) { | |
123 ShouldNotReachHere(); | |
124 } | |
125 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
126 bool Klass::compute_is_subtype_of(Klass* k) { |
0 | 127 assert(k->is_klass(), "argument must be a class"); |
128 return is_subclass_of(k); | |
129 } | |
130 | |
131 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
132 Method* Klass::uncached_lookup_method(Symbol* name, Symbol* signature) const { |
0 | 133 #ifdef ASSERT |
134 tty->print_cr("Error: uncached_lookup_method called on a klass oop." | |
135 " Likely error: reflection method does not correctly" | |
136 " wrap return value in a mirror object."); | |
137 #endif | |
138 ShouldNotReachHere(); | |
139 return NULL; | |
140 } | |
141 | |
12146
9758d9f36299
8021954: VM SIGSEGV during classloading on MacOS; hs_err_pid file produced
coleenp
parents:
11096
diff
changeset
|
142 void* Klass::operator new(size_t size, ClassLoaderData* loader_data, size_t word_size, TRAPS) throw() { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
143 return Metaspace::allocate(loader_data, word_size, /*read_only*/false, |
10376
a1ebd310d5c1
8014912: Restore PrintSharedSpaces functionality after NPG
iklam
parents:
10343
diff
changeset
|
144 MetaspaceObj::ClassType, CHECK_NULL); |
6725
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 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
147 Klass::Klass() { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
148 Klass* k = this; |
0 | 149 |
8712
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
150 // Preinitialize supertype information. |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
151 // 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
|
152 set_super(NULL); |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
153 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
|
154 _primary_supers[i] = NULL; |
0 | 155 } |
8712
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
156 set_secondary_supers(NULL); |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
157 set_secondary_super_cache(NULL); |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
158 _primary_supers[0] = k; |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8003
diff
changeset
|
159 set_super_check_offset(in_bytes(primary_supers_offset())); |
0 | 160 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
161 set_java_mirror(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
162 set_modifier_flags(0); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
163 set_layout_helper(Klass::_lh_neutral_value); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
164 set_name(NULL); |
0 | 165 AccessFlags af; |
166 af.set_flags(0); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
167 set_access_flags(af); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
168 set_subklass(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
169 set_next_sibling(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
170 set_next_link(NULL); |
10405 | 171 TRACE_INIT_ID(this); |
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) { |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
379 #ifdef ASSERT |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
380 // 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
|
381 oop loader = class_loader(); |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
382 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
|
383 #endif // ASSERT |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
384 |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
385 // 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
|
386 // 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
|
387 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
|
388 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
|
389 " 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
|
390 return mirror_alive; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
391 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
392 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
393 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
|
394 if (!ClassUnloading) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
395 return; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
396 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
397 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
398 Klass* root = SystemDictionary::Object_klass(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
399 Stack<Klass*, mtGC> stack; |
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 stack.push(root); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
402 while (!stack.is_empty()) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
403 Klass* current = stack.pop(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
404 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
405 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
|
406 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
407 // Find and set the first alive subklass |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
408 Klass* sub = current->subklass_oop(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
409 while (sub != NULL && !sub->is_loader_alive(is_alive)) { |
0 | 410 #ifndef PRODUCT |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
411 if (TraceClassUnloading && WizardMode) { |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
412 ResourceMark rm; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
413 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
|
414 } |
0 | 415 #endif |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
416 sub = sub->next_sibling_oop(); |
0 | 417 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
418 current->set_subklass(sub); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
419 if (sub != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
420 stack.push(sub); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
421 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
422 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
423 // Find and set the first alive sibling |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
424 Klass* sibling = current->next_sibling_oop(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
425 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
|
426 if (TraceClassUnloading && WizardMode) { |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
427 ResourceMark rm; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
428 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
|
429 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
430 sibling = sibling->next_sibling_oop(); |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
431 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
432 current->set_next_sibling(sibling); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
433 if (sibling != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
434 stack.push(sibling); |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
435 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
436 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
437 // Clean the implementors list and method data. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
438 if (current->oop_is_instance()) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
439 InstanceKlass* ik = InstanceKlass::cast(current); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
440 ik->clean_implementors_list(is_alive); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
441 ik->clean_method_data(is_alive); |
0 | 442 } |
443 } | |
444 } | |
445 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
446 void Klass::klass_update_barrier_set(oop v) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
447 record_modified_oops(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
448 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
449 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
450 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
|
451 // 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
|
452 // 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
|
453 // 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
|
454 // 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
|
455 // do anything here. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
456 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
457 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
458 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
|
459 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
|
460 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
|
461 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
462 // do the store |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
463 if (always_do_update_barrier) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
464 klass_oop_store((volatile oop*)p, v); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
465 } else { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
466 klass_update_barrier_set_pre((void*)p, v); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
467 *p = v; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
468 klass_update_barrier_set(v); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
469 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
470 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
471 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
472 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
|
473 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
|
474 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
|
475 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
476 klass_update_barrier_set_pre((void*)p, v); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
477 OrderAccess::release_store_ptr(p, v); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
478 klass_update_barrier_set(v); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
479 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
480 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
481 void Klass::oops_do(OopClosure* cl) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
482 cl->do_oop(&_java_mirror); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
483 } |
0 | 484 |
485 void Klass::remove_unshareable_info() { | |
8751
1fc4d4768b90
8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents:
8712
diff
changeset
|
486 if (!DumpSharedSpaces) { |
1fc4d4768b90
8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents:
8712
diff
changeset
|
487 // 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
|
488 if (class_loader_data() != NULL) { |
1fc4d4768b90
8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents:
8712
diff
changeset
|
489 class_loader_data()->remove_class(this); |
1fc4d4768b90
8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents:
8712
diff
changeset
|
490 } |
1fc4d4768b90
8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents:
8712
diff
changeset
|
491 } |
0 | 492 set_subklass(NULL); |
493 set_next_sibling(NULL); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
494 // Clear the java mirror |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
495 set_java_mirror(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
496 set_next_link(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
497 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
498 // 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
|
499 set_class_loader_data(NULL); |
0 | 500 } |
501 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
502 void Klass::restore_unshareable_info(TRAPS) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
503 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
|
504 // 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
|
505 set_class_loader_data(loader_data); |
0 | 506 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
507 // 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
|
508 // (same order as class file parsing) |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
509 loader_data->add_class(this); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
510 |
10343
6bd680e9ea35
8003421: NPG: Move oops out of InstanceKlass into mirror
coleenp
parents:
10265
diff
changeset
|
511 // Recreate the class mirror. The protection_domain is always null for |
6bd680e9ea35
8003421: NPG: Move oops out of InstanceKlass into mirror
coleenp
parents:
10265
diff
changeset
|
512 // boot loader, for now. |
6bd680e9ea35
8003421: NPG: Move oops out of InstanceKlass into mirror
coleenp
parents:
10265
diff
changeset
|
513 java_lang_Class::create_mirror(this, Handle(NULL), CHECK); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
514 } |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
515 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
516 Klass* Klass::array_klass_or_null(int rank) { |
0 | 517 EXCEPTION_MARK; |
518 // No exception can be thrown by array_klass_impl when called with or_null == true. | |
519 // (In anycase, the execption mark will fail if it do so) | |
520 return array_klass_impl(true, rank, THREAD); | |
521 } | |
522 | |
523 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
524 Klass* Klass::array_klass_or_null() { |
0 | 525 EXCEPTION_MARK; |
526 // No exception can be thrown by array_klass_impl when called with or_null == true. | |
527 // (In anycase, the execption mark will fail if it do so) | |
528 return array_klass_impl(true, THREAD); | |
529 } | |
530 | |
531 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
532 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
|
533 fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass"); |
0 | 534 return NULL; |
535 } | |
536 | |
537 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
538 Klass* Klass::array_klass_impl(bool or_null, TRAPS) { |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
539 fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass"); |
0 | 540 return NULL; |
541 } | |
542 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
543 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
|
544 |
0 | 545 const char* Klass::external_name() const { |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
546 if (oop_is_instance()) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
547 InstanceKlass* ik = (InstanceKlass*) this; |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
548 if (ik->is_anonymous()) { |
2416
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2177
diff
changeset
|
549 assert(EnableInvokeDynamic, ""); |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
550 intptr_t hash = 0; |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
551 if (ik->java_mirror() != NULL) { |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
552 // 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
|
553 hash = ik->java_mirror()->identity_hash(); |
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6983
diff
changeset
|
554 } |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
555 char hash_buf[40]; |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
556 sprintf(hash_buf, "/" UINTX_FORMAT, (uintx)hash); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
557 size_t hash_len = strlen(hash_buf); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
558 |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
559 size_t result_len = name()->utf8_length(); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
560 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
|
561 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
|
562 assert(strlen(result) == result_len, ""); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
563 strcpy(result + result_len, hash_buf); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
564 assert(strlen(result) == result_len + hash_len, ""); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
565 return result; |
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 } |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
605
diff
changeset
|
568 if (name() == NULL) return "<unknown>"; |
0 | 569 return name()->as_klass_external_name(); |
570 } | |
571 | |
572 | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
605
diff
changeset
|
573 const char* Klass::signature_name() const { |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
605
diff
changeset
|
574 if (name() == NULL) return "<unknown>"; |
0 | 575 return name()->as_C_string(); |
576 } | |
577 | |
578 // Unless overridden, modifier_flags is 0. | |
579 jint Klass::compute_modifier_flags(TRAPS) const { | |
580 return 0; | |
581 } | |
582 | |
583 int Klass::atomic_incr_biased_lock_revocation_count() { | |
584 return (int) Atomic::add(1, &_biased_lock_revocation_count); | |
585 } | |
586 | |
587 // Unless overridden, jvmti_class_status has no flags set. | |
588 jint Klass::jvmti_class_status() const { | |
589 return 0; | |
590 } | |
591 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
592 |
0 | 593 // Printing |
594 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
595 void Klass::print_on(outputStream* st) const { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
596 ResourceMark rm; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
597 // print title |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
598 st->print("%s", internal_name()); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
599 print_address_on(st); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
600 st->cr(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
601 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
602 |
0 | 603 void Klass::oop_print_on(oop obj, outputStream* st) { |
604 ResourceMark rm; | |
605 // print title | |
606 st->print_cr("%s ", internal_name()); | |
607 obj->print_address_on(st); | |
608 | |
609 if (WizardMode) { | |
610 // print header | |
611 obj->mark()->print_on(st); | |
612 } | |
613 | |
614 // print class | |
615 st->print(" - klass: "); | |
616 obj->klass()->print_value_on(st); | |
617 st->cr(); | |
618 } | |
619 | |
620 void Klass::oop_print_value_on(oop obj, outputStream* st) { | |
621 // print title | |
622 ResourceMark rm; // Cannot print in debug mode without this | |
623 st->print("%s", internal_name()); | |
624 obj->print_address_on(st); | |
625 } | |
626 | |
7956 | 627 #if INCLUDE_SERVICES |
628 // Size Statistics | |
629 void Klass::collect_statistics(KlassSizeStats *sz) const { | |
630 sz->_klass_bytes = sz->count(this); | |
631 sz->_mirror_bytes = sz->count(java_mirror()); | |
632 sz->_secondary_supers_bytes = sz->count_array(secondary_supers()); | |
633 | |
634 sz->_ro_bytes += sz->_secondary_supers_bytes; | |
635 sz->_rw_bytes += sz->_klass_bytes + sz->_mirror_bytes; | |
636 } | |
637 #endif // INCLUDE_SERVICES | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
638 |
0 | 639 // Verification |
640 | |
17674
85318d1fe8fe
8027146: Class loading verification failure if GC occurs in Universe::flush_dependents_on
coleenp
parents:
17663
diff
changeset
|
641 void Klass::verify_on(outputStream* st) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
642 |
11034 | 643 // This can be expensive, but it is worth checking that this klass is actually |
644 // in the CLD graph but not in production. | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
645 assert(ClassLoaderDataGraph::contains((address)this), "Should be"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
646 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
647 guarantee(this->is_klass(),"should be klass"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
648 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
649 if (super() != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
650 guarantee(super()->is_klass(), "should be klass"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
651 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
652 if (secondary_super_cache() != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
653 Klass* ko = secondary_super_cache(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
654 guarantee(ko->is_klass(), "should be klass"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
655 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
656 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
|
657 Klass* ko = _primary_supers[i]; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
658 if (ko != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
659 guarantee(ko->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 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
662 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
663 if (java_mirror() != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
664 guarantee(java_mirror()->is_oop(), "should be instance"); |
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 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
667 |
0 | 668 void Klass::oop_verify_on(oop obj, outputStream* st) { |
669 guarantee(obj->is_oop(), "should be oop"); | |
670 guarantee(obj->klass()->is_klass(), "klass field is not a klass"); | |
671 } | |
672 | |
673 #ifndef PRODUCT | |
674 | |
12264
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
675 bool Klass::verify_vtable_index(int i) { |
0 | 676 if (oop_is_instance()) { |
12264
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
677 int limit = ((InstanceKlass*)this)->vtable_length()/vtableEntry::size(); |
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
678 assert(i >= 0 && i < limit, err_msg("index %d out of bounds %d", i, limit)); |
0 | 679 } else { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
680 assert(oop_is_array(), "Must be"); |
12264
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
681 int limit = ((ArrayKlass*)this)->vtable_length()/vtableEntry::size(); |
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
682 assert(i >= 0 && i < limit, err_msg("index %d out of bounds %d", i, limit)); |
0 | 683 } |
12264
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
684 return true; |
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
685 } |
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
686 |
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
687 bool Klass::verify_itable_index(int i) { |
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
688 assert(oop_is_instance(), ""); |
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
689 int method_count = klassItable::method_count_for_interface(this); |
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
690 assert(i >= 0 && i < method_count, "index out of bounds"); |
b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents:
12146
diff
changeset
|
691 return true; |
0 | 692 } |
693 | |
694 #endif |