Mercurial > hg > truffle
annotate src/share/vm/oops/instanceKlassKlass.cpp @ 6027:8a2e5a6a19a4
7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
Summary: Removed the HeapRegion::_top_at_conc_mark_count field. It is no longer needed as a result of the changes for 6888336 and 7127706. Refactored the closures that finalize and verify the liveness counting data so that common functionality was placed into a base class.
Reviewed-by: brutisso, tonyp
author | johnc |
---|---|
date | Wed, 25 Apr 2012 10:23:12 -0700 |
parents | 49036505ab5f |
children | 8bafad97cd26 |
rev | line source |
---|---|
0 | 1 /* |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
2 * Copyright (c) 1997, 2012, 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:
1490
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1490
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:
1490
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "classfile/javaClasses.hpp" | |
27 #include "classfile/systemDictionary.hpp" | |
28 #include "gc_implementation/shared/markSweep.inline.hpp" | |
29 #include "gc_interface/collectedHeap.inline.hpp" | |
30 #include "interpreter/oopMapCache.hpp" | |
31 #include "memory/gcLocker.hpp" | |
32 #include "oops/constantPoolOop.hpp" | |
33 #include "oops/instanceKlass.hpp" | |
2376
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2227
diff
changeset
|
34 #include "oops/instanceMirrorKlass.hpp" |
1972 | 35 #include "oops/instanceKlassKlass.hpp" |
36 #include "oops/instanceRefKlass.hpp" | |
37 #include "oops/objArrayKlassKlass.hpp" | |
38 #include "oops/objArrayOop.hpp" | |
39 #include "oops/oop.inline.hpp" | |
40 #include "oops/oop.inline2.hpp" | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
41 #include "oops/symbol.hpp" |
1972 | 42 #include "oops/typeArrayOop.hpp" |
43 #include "prims/jvmtiExport.hpp" | |
44 #include "runtime/fieldDescriptor.hpp" | |
45 #ifndef SERIALGC | |
46 #include "gc_implementation/parNew/parOopClosures.inline.hpp" | |
47 #include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp" | |
48 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp" | |
49 #include "memory/cardTableRS.hpp" | |
50 #include "oops/oop.pcgc.inline.hpp" | |
51 #endif | |
0 | 52 |
53 klassOop instanceKlassKlass::create_klass(TRAPS) { | |
54 instanceKlassKlass o; | |
55 KlassHandle h_this_klass(THREAD, Universe::klassKlassObj()); | |
56 KlassHandle k = base_create_klass(h_this_klass, header_size(), o.vtbl_value(), CHECK_NULL); | |
57 // Make sure size calculation is right | |
58 assert(k()->size() == align_object_size(header_size()), "wrong size for object"); | |
59 java_lang_Class::create_mirror(k, CHECK_NULL); // Allocate mirror | |
60 return k(); | |
61 } | |
62 | |
63 int instanceKlassKlass::oop_size(oop obj) const { | |
64 assert(obj->is_klass(), "must be klass"); | |
65 return instanceKlass::cast(klassOop(obj))->object_size(); | |
66 } | |
67 | |
68 bool instanceKlassKlass::oop_is_parsable(oop obj) const { | |
69 assert(obj->is_klass(), "must be klass"); | |
70 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
71 return (!ik->null_vtbl()) && ik->object_is_parsable(); | |
72 } | |
73 | |
74 void instanceKlassKlass::iterate_c_heap_oops(instanceKlass* ik, | |
75 OopClosure* closure) { | |
76 if (ik->oop_map_cache() != NULL) { | |
77 ik->oop_map_cache()->oop_iterate(closure); | |
78 } | |
79 | |
80 if (ik->jni_ids() != NULL) { | |
81 ik->jni_ids()->oops_do(closure); | |
82 } | |
83 } | |
84 | |
85 void instanceKlassKlass::oop_follow_contents(oop obj) { | |
86 assert(obj->is_klass(),"must be a klass"); | |
87 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); | |
88 | |
89 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
90 { | |
91 HandleMark hm; | |
92 ik->vtable()->oop_follow_contents(); | |
93 ik->itable()->oop_follow_contents(); | |
94 } | |
95 | |
96 MarkSweep::mark_and_push(ik->adr_array_klasses()); | |
97 MarkSweep::mark_and_push(ik->adr_methods()); | |
98 MarkSweep::mark_and_push(ik->adr_method_ordering()); | |
99 MarkSweep::mark_and_push(ik->adr_local_interfaces()); | |
100 MarkSweep::mark_and_push(ik->adr_transitive_interfaces()); | |
101 MarkSweep::mark_and_push(ik->adr_fields()); | |
102 MarkSweep::mark_and_push(ik->adr_constants()); | |
103 MarkSweep::mark_and_push(ik->adr_class_loader()); | |
104 MarkSweep::mark_and_push(ik->adr_inner_classes()); | |
105 MarkSweep::mark_and_push(ik->adr_protection_domain()); | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
106 MarkSweep::mark_and_push(ik->adr_host_klass()); |
0 | 107 MarkSweep::mark_and_push(ik->adr_signers()); |
108 MarkSweep::mark_and_push(ik->adr_class_annotations()); | |
109 MarkSweep::mark_and_push(ik->adr_fields_annotations()); | |
110 MarkSweep::mark_and_push(ik->adr_methods_annotations()); | |
111 MarkSweep::mark_and_push(ik->adr_methods_parameter_annotations()); | |
112 MarkSweep::mark_and_push(ik->adr_methods_default_annotations()); | |
113 | |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
114 // We do not follow adr_implementor() here. It is followed later |
0 | 115 // in instanceKlass::follow_weak_klass_links() |
116 | |
117 klassKlass::oop_follow_contents(obj); | |
118 | |
119 iterate_c_heap_oops(ik, &MarkSweep::mark_and_push_closure); | |
120 } | |
121 | |
122 #ifndef SERIALGC | |
123 void instanceKlassKlass::oop_follow_contents(ParCompactionManager* cm, | |
124 oop obj) { | |
125 assert(obj->is_klass(),"must be a klass"); | |
126 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); | |
127 | |
128 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
129 ik->vtable()->oop_follow_contents(cm); | |
130 ik->itable()->oop_follow_contents(cm); | |
131 | |
132 PSParallelCompact::mark_and_push(cm, ik->adr_array_klasses()); | |
133 PSParallelCompact::mark_and_push(cm, ik->adr_methods()); | |
134 PSParallelCompact::mark_and_push(cm, ik->adr_method_ordering()); | |
135 PSParallelCompact::mark_and_push(cm, ik->adr_local_interfaces()); | |
136 PSParallelCompact::mark_and_push(cm, ik->adr_transitive_interfaces()); | |
137 PSParallelCompact::mark_and_push(cm, ik->adr_fields()); | |
138 PSParallelCompact::mark_and_push(cm, ik->adr_constants()); | |
139 PSParallelCompact::mark_and_push(cm, ik->adr_class_loader()); | |
140 PSParallelCompact::mark_and_push(cm, ik->adr_inner_classes()); | |
141 PSParallelCompact::mark_and_push(cm, ik->adr_protection_domain()); | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
142 PSParallelCompact::mark_and_push(cm, ik->adr_host_klass()); |
0 | 143 PSParallelCompact::mark_and_push(cm, ik->adr_signers()); |
144 PSParallelCompact::mark_and_push(cm, ik->adr_class_annotations()); | |
145 PSParallelCompact::mark_and_push(cm, ik->adr_fields_annotations()); | |
146 PSParallelCompact::mark_and_push(cm, ik->adr_methods_annotations()); | |
147 PSParallelCompact::mark_and_push(cm, ik->adr_methods_parameter_annotations()); | |
148 PSParallelCompact::mark_and_push(cm, ik->adr_methods_default_annotations()); | |
149 | |
150 // We do not follow adr_implementor() here. It is followed later | |
151 // in instanceKlass::follow_weak_klass_links() | |
152 | |
153 klassKlass::oop_follow_contents(cm, obj); | |
154 | |
155 PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm); | |
156 iterate_c_heap_oops(ik, &mark_and_push_closure); | |
157 } | |
158 #endif // SERIALGC | |
159 | |
160 int instanceKlassKlass::oop_oop_iterate(oop obj, OopClosure* blk) { | |
161 assert(obj->is_klass(),"must be a klass"); | |
162 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); | |
163 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
164 // Get size before changing pointers. | |
165 // Don't call size() or oop_size() since that is a virtual call. | |
166 int size = ik->object_size(); | |
167 | |
168 ik->vtable()->oop_oop_iterate(blk); | |
169 ik->itable()->oop_oop_iterate(blk); | |
170 | |
171 blk->do_oop(ik->adr_array_klasses()); | |
172 blk->do_oop(ik->adr_methods()); | |
173 blk->do_oop(ik->adr_method_ordering()); | |
174 blk->do_oop(ik->adr_local_interfaces()); | |
175 blk->do_oop(ik->adr_transitive_interfaces()); | |
176 blk->do_oop(ik->adr_fields()); | |
177 blk->do_oop(ik->adr_constants()); | |
178 blk->do_oop(ik->adr_class_loader()); | |
179 blk->do_oop(ik->adr_protection_domain()); | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
180 blk->do_oop(ik->adr_host_klass()); |
0 | 181 blk->do_oop(ik->adr_signers()); |
182 blk->do_oop(ik->adr_inner_classes()); | |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
183 if (ik->is_interface()) { |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
184 blk->do_oop(ik->adr_implementor()); |
0 | 185 } |
186 blk->do_oop(ik->adr_class_annotations()); | |
187 blk->do_oop(ik->adr_fields_annotations()); | |
188 blk->do_oop(ik->adr_methods_annotations()); | |
189 blk->do_oop(ik->adr_methods_parameter_annotations()); | |
190 blk->do_oop(ik->adr_methods_default_annotations()); | |
191 | |
192 klassKlass::oop_oop_iterate(obj, blk); | |
193 | |
194 if(ik->oop_map_cache() != NULL) ik->oop_map_cache()->oop_iterate(blk); | |
195 return size; | |
196 } | |
197 | |
198 int instanceKlassKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, | |
199 MemRegion mr) { | |
200 assert(obj->is_klass(),"must be a klass"); | |
201 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); | |
202 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
203 // Get size before changing pointers. | |
204 // Don't call size() or oop_size() since that is a virtual call. | |
205 int size = ik->object_size(); | |
206 | |
207 ik->vtable()->oop_oop_iterate_m(blk, mr); | |
208 ik->itable()->oop_oop_iterate_m(blk, mr); | |
209 | |
210 oop* adr; | |
211 adr = ik->adr_array_klasses(); | |
212 if (mr.contains(adr)) blk->do_oop(adr); | |
213 adr = ik->adr_methods(); | |
214 if (mr.contains(adr)) blk->do_oop(adr); | |
215 adr = ik->adr_method_ordering(); | |
216 if (mr.contains(adr)) blk->do_oop(adr); | |
217 adr = ik->adr_local_interfaces(); | |
218 if (mr.contains(adr)) blk->do_oop(adr); | |
219 adr = ik->adr_transitive_interfaces(); | |
220 if (mr.contains(adr)) blk->do_oop(adr); | |
221 adr = ik->adr_fields(); | |
222 if (mr.contains(adr)) blk->do_oop(adr); | |
223 adr = ik->adr_constants(); | |
224 if (mr.contains(adr)) blk->do_oop(adr); | |
225 adr = ik->adr_class_loader(); | |
226 if (mr.contains(adr)) blk->do_oop(adr); | |
227 adr = ik->adr_protection_domain(); | |
228 if (mr.contains(adr)) blk->do_oop(adr); | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
229 adr = ik->adr_host_klass(); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
230 if (mr.contains(adr)) blk->do_oop(adr); |
0 | 231 adr = ik->adr_signers(); |
232 if (mr.contains(adr)) blk->do_oop(adr); | |
233 adr = ik->adr_inner_classes(); | |
234 if (mr.contains(adr)) blk->do_oop(adr); | |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
235 if (ik->is_interface()) { |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
236 adr = ik->adr_implementor(); |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
237 if (mr.contains(adr)) blk->do_oop(adr); |
0 | 238 } |
239 adr = ik->adr_class_annotations(); | |
240 if (mr.contains(adr)) blk->do_oop(adr); | |
241 adr = ik->adr_fields_annotations(); | |
242 if (mr.contains(adr)) blk->do_oop(adr); | |
243 adr = ik->adr_methods_annotations(); | |
244 if (mr.contains(adr)) blk->do_oop(adr); | |
245 adr = ik->adr_methods_parameter_annotations(); | |
246 if (mr.contains(adr)) blk->do_oop(adr); | |
247 adr = ik->adr_methods_default_annotations(); | |
248 if (mr.contains(adr)) blk->do_oop(adr); | |
249 | |
250 klassKlass::oop_oop_iterate_m(obj, blk, mr); | |
251 | |
252 if(ik->oop_map_cache() != NULL) ik->oop_map_cache()->oop_iterate(blk, mr); | |
253 return size; | |
254 } | |
255 | |
256 int instanceKlassKlass::oop_adjust_pointers(oop obj) { | |
257 assert(obj->is_klass(),"must be a klass"); | |
258 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); | |
259 | |
260 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
261 ik->vtable()->oop_adjust_pointers(); | |
262 ik->itable()->oop_adjust_pointers(); | |
263 | |
264 MarkSweep::adjust_pointer(ik->adr_array_klasses()); | |
265 MarkSweep::adjust_pointer(ik->adr_methods()); | |
266 MarkSweep::adjust_pointer(ik->adr_method_ordering()); | |
267 MarkSweep::adjust_pointer(ik->adr_local_interfaces()); | |
268 MarkSweep::adjust_pointer(ik->adr_transitive_interfaces()); | |
269 MarkSweep::adjust_pointer(ik->adr_fields()); | |
270 MarkSweep::adjust_pointer(ik->adr_constants()); | |
271 MarkSweep::adjust_pointer(ik->adr_class_loader()); | |
272 MarkSweep::adjust_pointer(ik->adr_protection_domain()); | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
273 MarkSweep::adjust_pointer(ik->adr_host_klass()); |
0 | 274 MarkSweep::adjust_pointer(ik->adr_signers()); |
275 MarkSweep::adjust_pointer(ik->adr_inner_classes()); | |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
276 if (ik->is_interface()) { |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
277 MarkSweep::adjust_pointer(ik->adr_implementor()); |
0 | 278 } |
279 MarkSweep::adjust_pointer(ik->adr_class_annotations()); | |
280 MarkSweep::adjust_pointer(ik->adr_fields_annotations()); | |
281 MarkSweep::adjust_pointer(ik->adr_methods_annotations()); | |
282 MarkSweep::adjust_pointer(ik->adr_methods_parameter_annotations()); | |
283 MarkSweep::adjust_pointer(ik->adr_methods_default_annotations()); | |
284 | |
285 iterate_c_heap_oops(ik, &MarkSweep::adjust_root_pointer_closure); | |
286 | |
287 return klassKlass::oop_adjust_pointers(obj); | |
288 } | |
289 | |
290 #ifndef SERIALGC | |
291 void instanceKlassKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { | |
292 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
293 | |
294 oop* loader_addr = ik->adr_class_loader(); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
295 if (PSScavenge::should_scavenge(loader_addr)) { |
0 | 296 pm->claim_or_forward_depth(loader_addr); |
297 } | |
298 | |
299 oop* pd_addr = ik->adr_protection_domain(); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
300 if (PSScavenge::should_scavenge(pd_addr)) { |
0 | 301 pm->claim_or_forward_depth(pd_addr); |
302 } | |
303 | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
304 oop* hk_addr = ik->adr_host_klass(); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
305 if (PSScavenge::should_scavenge(hk_addr)) { |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
306 pm->claim_or_forward_depth(hk_addr); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
307 } |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
308 |
0 | 309 oop* sg_addr = ik->adr_signers(); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
310 if (PSScavenge::should_scavenge(sg_addr)) { |
0 | 311 pm->claim_or_forward_depth(sg_addr); |
312 } | |
313 | |
1706
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1552
diff
changeset
|
314 klassKlass::oop_push_contents(pm, obj); |
0 | 315 } |
316 | |
317 int instanceKlassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { | |
318 assert(obj->is_klass(),"must be a klass"); | |
319 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), | |
320 "must be instance klass"); | |
321 | |
322 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
323 ik->vtable()->oop_update_pointers(cm); | |
324 ik->itable()->oop_update_pointers(cm); | |
325 | |
326 oop* const beg_oop = ik->oop_block_beg(); | |
327 oop* const end_oop = ik->oop_block_end(); | |
328 for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) { | |
329 PSParallelCompact::adjust_pointer(cur_oop); | |
330 } | |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
331 if (ik->is_interface()) { |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
332 PSParallelCompact::adjust_pointer(ik->adr_implementor()); |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
333 } |
0 | 334 |
335 OopClosure* closure = PSParallelCompact::adjust_root_pointer_closure(); | |
336 iterate_c_heap_oops(ik, closure); | |
337 | |
338 klassKlass::oop_update_pointers(cm, obj); | |
339 return ik->object_size(); | |
340 } | |
341 | |
342 #endif // SERIALGC | |
343 | |
938 | 344 klassOop |
2376
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2227
diff
changeset
|
345 instanceKlassKlass::allocate_instance_klass(Symbol* name, int vtable_len, int itable_len, |
938 | 346 int static_field_size, |
939
9eebd3ac74cf
6845368: large objects cause a crash or unexpected exception
jcoomes
parents:
938
diff
changeset
|
347 unsigned nonstatic_oop_map_count, |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
348 AccessFlags access_flags, |
938 | 349 ReferenceType rt, TRAPS) { |
0 | 350 |
938 | 351 const int nonstatic_oop_map_size = |
352 instanceKlass::nonstatic_oop_map_size(nonstatic_oop_map_count); | |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
353 int size = align_object_offset(vtable_len) + align_object_offset(itable_len); |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
354 if (access_flags.is_interface()) { |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
355 size += align_object_offset(nonstatic_oop_map_size) + (int)sizeof(klassOop)/HeapWordSize; |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
356 } else { |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
357 size += nonstatic_oop_map_size; |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
358 } |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
359 size = instanceKlass::object_size(size); |
0 | 360 |
361 // Allocation | |
362 KlassHandle h_this_klass(THREAD, as_klassOop()); | |
363 KlassHandle k; | |
364 if (rt == REF_NONE) { | |
2376
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2227
diff
changeset
|
365 if (name != vmSymbols::java_lang_Class()) { |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2227
diff
changeset
|
366 // regular klass |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2227
diff
changeset
|
367 instanceKlass o; |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2227
diff
changeset
|
368 k = base_create_klass(h_this_klass, size, o.vtbl_value(), CHECK_NULL); |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2227
diff
changeset
|
369 } else { |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2227
diff
changeset
|
370 // Class |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2227
diff
changeset
|
371 instanceMirrorKlass o; |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2227
diff
changeset
|
372 k = base_create_klass(h_this_klass, size, o.vtbl_value(), CHECK_NULL); |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2227
diff
changeset
|
373 } |
0 | 374 } else { |
375 // reference klass | |
376 instanceRefKlass o; | |
377 k = base_create_klass(h_this_klass, size, o.vtbl_value(), CHECK_NULL); | |
378 } | |
379 { | |
380 No_Safepoint_Verifier no_safepoint; // until k becomes parsable | |
381 instanceKlass* ik = (instanceKlass*) k()->klass_part(); | |
382 assert(!k()->is_parsable(), "not expecting parsability yet."); | |
383 | |
384 // The sizes of these these three variables are used for determining the | |
385 // size of the instanceKlassOop. It is critical that these are set to the right | |
386 // sizes before the first GC, i.e., when we allocate the mirror. | |
387 ik->set_vtable_length(vtable_len); | |
388 ik->set_itable_length(itable_len); | |
389 ik->set_static_field_size(static_field_size); | |
390 ik->set_nonstatic_oop_map_size(nonstatic_oop_map_size); | |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
391 ik->set_access_flags(access_flags); |
0 | 392 assert(k()->size() == size, "wrong size for object"); |
393 | |
394 ik->set_array_klasses(NULL); | |
395 ik->set_methods(NULL); | |
396 ik->set_method_ordering(NULL); | |
397 ik->set_local_interfaces(NULL); | |
398 ik->set_transitive_interfaces(NULL); | |
399 ik->init_implementor(); | |
3938 | 400 ik->set_fields(NULL, 0); |
0 | 401 ik->set_constants(NULL); |
402 ik->set_class_loader(NULL); | |
403 ik->set_protection_domain(NULL); | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
404 ik->set_host_klass(NULL); |
0 | 405 ik->set_signers(NULL); |
406 ik->set_source_file_name(NULL); | |
407 ik->set_source_debug_extension(NULL); | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
408 ik->set_source_debug_extension(NULL); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
409 ik->set_array_name(NULL); |
0 | 410 ik->set_inner_classes(NULL); |
2376
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2227
diff
changeset
|
411 ik->set_static_oop_field_count(0); |
0 | 412 ik->set_nonstatic_field_size(0); |
4772
8f8b94305aff
7129240: backout fix for 7102776 until 7128770 is resolved
dcubed
parents:
4737
diff
changeset
|
413 ik->set_is_marked_dependent(false); |
0 | 414 ik->set_init_state(instanceKlass::allocated); |
415 ik->set_init_thread(NULL); | |
416 ik->set_reference_type(rt); | |
417 ik->set_oop_map_cache(NULL); | |
418 ik->set_jni_ids(NULL); | |
419 ik->set_osr_nmethods_head(NULL); | |
420 ik->set_breakpoints(NULL); | |
421 ik->init_previous_versions(); | |
422 ik->set_generic_signature(NULL); | |
423 ik->release_set_methods_jmethod_ids(NULL); | |
424 ik->release_set_methods_cached_itable_indices(NULL); | |
425 ik->set_class_annotations(NULL); | |
426 ik->set_fields_annotations(NULL); | |
427 ik->set_methods_annotations(NULL); | |
428 ik->set_methods_parameter_annotations(NULL); | |
429 ik->set_methods_default_annotations(NULL); | |
430 ik->set_jvmti_cached_class_field_map(NULL); | |
431 ik->set_initial_method_idnum(0); | |
432 assert(k()->is_parsable(), "should be parsable here."); | |
433 | |
434 // initialize the non-header words to zero | |
435 intptr_t* p = (intptr_t*)k(); | |
436 for (int index = instanceKlass::header_size(); index < size; index++) { | |
437 p[index] = NULL_WORD; | |
438 } | |
439 | |
440 // To get verify to work - must be set to partial loaded before first GC point. | |
441 k()->set_partially_loaded(); | |
442 } | |
443 return k(); | |
444 } | |
445 | |
446 | |
447 | |
448 #ifndef PRODUCT | |
449 | |
450 // Printing | |
451 | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
452 #define BULLET " - " |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
453 |
0 | 454 static const char* state_names[] = { |
455 "unparseable_by_gc", "allocated", "loaded", "linked", "being_initialized", "fully_initialized", "initialization_error" | |
456 }; | |
457 | |
458 | |
459 void instanceKlassKlass::oop_print_on(oop obj, outputStream* st) { | |
460 assert(obj->is_klass(), "must be klass"); | |
461 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
462 klassKlass::oop_print_on(obj, st); | |
463 | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
464 st->print(BULLET"instance size: %d", ik->size_helper()); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
465 st->print(BULLET"klass size: %d", ik->object_size()); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
466 st->print(BULLET"access: "); ik->access_flags().print_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
467 st->print(BULLET"state: "); st->print_cr(state_names[ik->_init_state]); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
468 st->print(BULLET"name: "); ik->name()->print_value_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
469 st->print(BULLET"super: "); ik->super()->print_value_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
470 st->print(BULLET"sub: "); |
0 | 471 Klass* sub = ik->subklass(); |
472 int n; | |
473 for (n = 0; sub != NULL; n++, sub = sub->next_sibling()) { | |
474 if (n < MaxSubklassPrintSize) { | |
475 sub->as_klassOop()->print_value_on(st); | |
476 st->print(" "); | |
477 } | |
478 } | |
479 if (n >= MaxSubklassPrintSize) st->print("(%d more klasses...)", n - MaxSubklassPrintSize); | |
480 st->cr(); | |
481 | |
482 if (ik->is_interface()) { | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
483 st->print_cr(BULLET"nof implementors: %d", ik->nof_implementors()); |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
484 if (ik->nof_implementors() == 1) { |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
485 st->print_cr(BULLET"implementor: "); |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
486 st->print(" "); |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
487 ik->implementor()->print_value_on(st); |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
488 st->cr(); |
0 | 489 } |
490 } | |
491 | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
492 st->print(BULLET"arrays: "); ik->array_klasses()->print_value_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
493 st->print(BULLET"methods: "); ik->methods()->print_value_on(st); st->cr(); |
0 | 494 if (Verbose) { |
495 objArrayOop methods = ik->methods(); | |
496 for(int i = 0; i < methods->length(); i++) { | |
497 tty->print("%d : ", i); methods->obj_at(i)->print_value(); tty->cr(); | |
498 } | |
499 } | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
500 st->print(BULLET"method ordering: "); ik->method_ordering()->print_value_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
501 st->print(BULLET"local interfaces: "); ik->local_interfaces()->print_value_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
502 st->print(BULLET"trans. interfaces: "); ik->transitive_interfaces()->print_value_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
503 st->print(BULLET"constants: "); ik->constants()->print_value_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
504 st->print(BULLET"class loader: "); ik->class_loader()->print_value_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
505 st->print(BULLET"protection domain: "); ik->protection_domain()->print_value_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
506 st->print(BULLET"host class: "); ik->host_klass()->print_value_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
507 st->print(BULLET"signers: "); ik->signers()->print_value_on(st); st->cr(); |
0 | 508 if (ik->source_file_name() != NULL) { |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
509 st->print(BULLET"source file: "); |
0 | 510 ik->source_file_name()->print_value_on(st); |
511 st->cr(); | |
512 } | |
513 if (ik->source_debug_extension() != NULL) { | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
514 st->print(BULLET"source debug extension: "); |
0 | 515 ik->source_debug_extension()->print_value_on(st); |
516 st->cr(); | |
517 } | |
518 | |
519 { | |
520 ResourceMark rm; | |
521 // PreviousVersionInfo objects returned via PreviousVersionWalker | |
522 // contain a GrowableArray of handles. We have to clean up the | |
523 // GrowableArray _after_ the PreviousVersionWalker destructor | |
524 // has destroyed the handles. | |
525 { | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
526 bool have_pv = false; |
0 | 527 PreviousVersionWalker pvw(ik); |
528 for (PreviousVersionInfo * pv_info = pvw.next_previous_version(); | |
529 pv_info != NULL; pv_info = pvw.next_previous_version()) { | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
530 if (!have_pv) |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
531 st->print(BULLET"previous version: "); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
532 have_pv = true; |
0 | 533 pv_info->prev_constant_pool_handle()()->print_value_on(st); |
534 } | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
535 if (have_pv) st->cr(); |
0 | 536 } // pvw is cleaned up |
537 } // rm is cleaned up | |
538 | |
539 if (ik->generic_signature() != NULL) { | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
540 st->print(BULLET"generic signature: "); |
0 | 541 ik->generic_signature()->print_value_on(st); |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
542 st->cr(); |
0 | 543 } |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
544 st->print(BULLET"inner classes: "); ik->inner_classes()->print_value_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
545 st->print(BULLET"java mirror: "); ik->java_mirror()->print_value_on(st); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
546 st->print(BULLET"vtable length %d (start addr: " INTPTR_FORMAT ")", ik->vtable_length(), ik->start_of_vtable()); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
547 st->print(BULLET"itable length %d (start addr: " INTPTR_FORMAT ")", ik->itable_length(), ik->start_of_itable()); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
548 st->print_cr(BULLET"---- static fields (%d words):", ik->static_field_size()); |
0 | 549 FieldPrinter print_static_field(st); |
550 ik->do_local_static_fields(&print_static_field); | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
551 st->print_cr(BULLET"---- non-static fields (%d words):", ik->nonstatic_field_size()); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
552 FieldPrinter print_nonstatic_field(st); |
0 | 553 ik->do_nonstatic_fields(&print_nonstatic_field); |
554 | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
555 st->print(BULLET"non-static oop maps: "); |
0 | 556 OopMapBlock* map = ik->start_of_nonstatic_oop_maps(); |
938 | 557 OopMapBlock* end_map = map + ik->nonstatic_oop_map_count(); |
0 | 558 while (map < end_map) { |
938 | 559 st->print("%d-%d ", map->offset(), map->offset() + heapOopSize*(map->count() - 1)); |
0 | 560 map++; |
561 } | |
562 st->cr(); | |
563 } | |
564 | |
1155
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
1059
diff
changeset
|
565 #endif //PRODUCT |
0 | 566 |
567 void instanceKlassKlass::oop_print_value_on(oop obj, outputStream* st) { | |
568 assert(obj->is_klass(), "must be klass"); | |
569 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
570 ik->name()->print_value_on(st); | |
571 } | |
572 | |
573 const char* instanceKlassKlass::internal_name() const { | |
574 return "{instance class}"; | |
575 } | |
576 | |
577 // Verification | |
578 | |
579 class VerifyFieldClosure: public OopClosure { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
580 protected: |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
581 template <class T> void do_oop_work(T* p) { |
0 | 582 guarantee(Universe::heap()->is_in(p), "should be in heap"); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
583 oop obj = oopDesc::load_decode_heap_oop(p); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
584 guarantee(obj->is_oop_or_null(), "should be in heap"); |
0 | 585 } |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
586 public: |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
587 virtual void do_oop(oop* p) { VerifyFieldClosure::do_oop_work(p); } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
588 virtual void do_oop(narrowOop* p) { VerifyFieldClosure::do_oop_work(p); } |
0 | 589 }; |
590 | |
591 void instanceKlassKlass::oop_verify_on(oop obj, outputStream* st) { | |
592 klassKlass::oop_verify_on(obj, st); | |
593 if (!obj->partially_loaded()) { | |
594 Thread *thread = Thread::current(); | |
595 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
596 | |
597 #ifndef PRODUCT | |
598 // Avoid redundant verifies | |
599 if (ik->_verify_count == Universe::verify_count()) return; | |
600 ik->_verify_count = Universe::verify_count(); | |
601 #endif | |
602 // Verify that klass is present in SystemDictionary | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
603 if (ik->is_loaded() && !ik->is_anonymous()) { |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
604 Symbol* h_name = ik->name(); |
0 | 605 Handle h_loader (thread, ik->class_loader()); |
606 Handle h_obj(thread, obj); | |
607 SystemDictionary::verify_obj_klass_present(h_obj, h_name, h_loader); | |
608 } | |
609 | |
610 // Verify static fields | |
611 VerifyFieldClosure blk; | |
612 | |
613 // Verify vtables | |
614 if (ik->is_linked()) { | |
615 ResourceMark rm(thread); | |
616 // $$$ This used to be done only for m/s collections. Doing it | |
617 // always seemed a valid generalization. (DLD -- 6/00) | |
618 ik->vtable()->verify(st); | |
619 } | |
620 | |
621 // Verify oop map cache | |
622 if (ik->oop_map_cache() != NULL) { | |
623 ik->oop_map_cache()->verify(); | |
624 } | |
625 | |
626 // Verify first subklass | |
627 if (ik->subklass_oop() != NULL) { | |
628 guarantee(ik->subklass_oop()->is_perm(), "should be in permspace"); | |
629 guarantee(ik->subklass_oop()->is_klass(), "should be klass"); | |
630 } | |
631 | |
632 // Verify siblings | |
633 klassOop super = ik->super(); | |
634 Klass* sib = ik->next_sibling(); | |
635 int sib_count = 0; | |
636 while (sib != NULL) { | |
637 if (sib == ik) { | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1155
diff
changeset
|
638 fatal(err_msg("subclass cycle of length %d", sib_count)); |
0 | 639 } |
640 if (sib_count >= 100000) { | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1155
diff
changeset
|
641 fatal(err_msg("suspiciously long subclass list %d", sib_count)); |
0 | 642 } |
643 guarantee(sib->as_klassOop()->is_klass(), "should be klass"); | |
644 guarantee(sib->as_klassOop()->is_perm(), "should be in permspace"); | |
645 guarantee(sib->super() == super, "siblings should have same superklass"); | |
646 sib = sib->next_sibling(); | |
647 } | |
648 | |
649 // Verify implementor fields | |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
650 klassOop im = ik->implementor(); |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
651 if (im != NULL) { |
0 | 652 guarantee(ik->is_interface(), "only interfaces should have implementor set"); |
653 guarantee(im->is_perm(), "should be in permspace"); | |
654 guarantee(im->is_klass(), "should be klass"); | |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
5967
diff
changeset
|
655 guarantee(!Klass::cast(klassOop(im))->is_interface() || im == ik->as_klassOop(), "implementors cannot be interfaces"); |
0 | 656 } |
657 | |
658 // Verify local interfaces | |
659 objArrayOop local_interfaces = ik->local_interfaces(); | |
660 guarantee(local_interfaces->is_perm(), "should be in permspace"); | |
661 guarantee(local_interfaces->is_objArray(), "should be obj array"); | |
662 int j; | |
663 for (j = 0; j < local_interfaces->length(); j++) { | |
664 oop e = local_interfaces->obj_at(j); | |
665 guarantee(e->is_klass() && Klass::cast(klassOop(e))->is_interface(), "invalid local interface"); | |
666 } | |
667 | |
668 // Verify transitive interfaces | |
669 objArrayOop transitive_interfaces = ik->transitive_interfaces(); | |
670 guarantee(transitive_interfaces->is_perm(), "should be in permspace"); | |
671 guarantee(transitive_interfaces->is_objArray(), "should be obj array"); | |
672 for (j = 0; j < transitive_interfaces->length(); j++) { | |
673 oop e = transitive_interfaces->obj_at(j); | |
674 guarantee(e->is_klass() && Klass::cast(klassOop(e))->is_interface(), "invalid transitive interface"); | |
675 } | |
676 | |
677 // Verify methods | |
678 objArrayOop methods = ik->methods(); | |
679 guarantee(methods->is_perm(), "should be in permspace"); | |
680 guarantee(methods->is_objArray(), "should be obj array"); | |
681 for (j = 0; j < methods->length(); j++) { | |
682 guarantee(methods->obj_at(j)->is_method(), "non-method in methods array"); | |
683 } | |
684 for (j = 0; j < methods->length() - 1; j++) { | |
685 methodOop m1 = methodOop(methods->obj_at(j)); | |
686 methodOop m2 = methodOop(methods->obj_at(j + 1)); | |
687 guarantee(m1->name()->fast_compare(m2->name()) <= 0, "methods not sorted correctly"); | |
688 } | |
689 | |
690 // Verify method ordering | |
691 typeArrayOop method_ordering = ik->method_ordering(); | |
692 guarantee(method_ordering->is_perm(), "should be in permspace"); | |
693 guarantee(method_ordering->is_typeArray(), "should be type array"); | |
694 int length = method_ordering->length(); | |
3245
8ce625481709
7032407: Crash in LinkResolver::runtime_resolve_virtual_method()
coleenp
parents:
2460
diff
changeset
|
695 if (JvmtiExport::can_maintain_original_method_order() || |
8ce625481709
7032407: Crash in LinkResolver::runtime_resolve_virtual_method()
coleenp
parents:
2460
diff
changeset
|
696 (UseSharedSpaces && length != 0)) { |
0 | 697 guarantee(length == methods->length(), "invalid method ordering length"); |
698 jlong sum = 0; | |
699 for (j = 0; j < length; j++) { | |
700 int original_index = method_ordering->int_at(j); | |
701 guarantee(original_index >= 0 && original_index < length, "invalid method ordering index"); | |
702 sum += original_index; | |
703 } | |
704 // Verify sum of indices 0,1,...,length-1 | |
705 guarantee(sum == ((jlong)length*(length-1))/2, "invalid method ordering sum"); | |
706 } else { | |
707 guarantee(length == 0, "invalid method ordering length"); | |
708 } | |
709 | |
710 // Verify JNI static field identifiers | |
711 if (ik->jni_ids() != NULL) { | |
712 ik->jni_ids()->verify(ik->as_klassOop()); | |
713 } | |
714 | |
715 // Verify other fields | |
716 if (ik->array_klasses() != NULL) { | |
717 guarantee(ik->array_klasses()->is_perm(), "should be in permspace"); | |
718 guarantee(ik->array_klasses()->is_klass(), "should be klass"); | |
719 } | |
720 guarantee(ik->fields()->is_perm(), "should be in permspace"); | |
721 guarantee(ik->fields()->is_typeArray(), "should be type array"); | |
722 guarantee(ik->constants()->is_perm(), "should be in permspace"); | |
723 guarantee(ik->constants()->is_constantPool(), "should be constant pool"); | |
724 guarantee(ik->inner_classes()->is_perm(), "should be in permspace"); | |
725 guarantee(ik->inner_classes()->is_typeArray(), "should be type array"); | |
726 if (ik->protection_domain() != NULL) { | |
727 guarantee(ik->protection_domain()->is_oop(), "should be oop"); | |
728 } | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
729 if (ik->host_klass() != NULL) { |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
730 guarantee(ik->host_klass()->is_oop(), "should be oop"); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
731 } |
0 | 732 if (ik->signers() != NULL) { |
733 guarantee(ik->signers()->is_objArray(), "should be obj array"); | |
734 } | |
735 if (ik->class_annotations() != NULL) { | |
736 guarantee(ik->class_annotations()->is_typeArray(), "should be type array"); | |
737 } | |
738 if (ik->fields_annotations() != NULL) { | |
739 guarantee(ik->fields_annotations()->is_objArray(), "should be obj array"); | |
740 } | |
741 if (ik->methods_annotations() != NULL) { | |
742 guarantee(ik->methods_annotations()->is_objArray(), "should be obj array"); | |
743 } | |
744 if (ik->methods_parameter_annotations() != NULL) { | |
745 guarantee(ik->methods_parameter_annotations()->is_objArray(), "should be obj array"); | |
746 } | |
747 if (ik->methods_default_annotations() != NULL) { | |
748 guarantee(ik->methods_default_annotations()->is_objArray(), "should be obj array"); | |
749 } | |
750 } | |
751 } | |
752 | |
753 | |
754 bool instanceKlassKlass::oop_partially_loaded(oop obj) const { | |
755 assert(obj->is_klass(), "object must be klass"); | |
756 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
757 assert(ik->oop_is_instance(), "object must be instanceKlass"); | |
758 return ik->transitive_interfaces() == (objArrayOop) obj; // Check whether transitive_interfaces points to self | |
759 } | |
760 | |
761 | |
762 // The transitive_interfaces is the last field set when loading an object. | |
763 void instanceKlassKlass::oop_set_partially_loaded(oop obj) { | |
764 assert(obj->is_klass(), "object must be klass"); | |
765 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
766 // Set the layout helper to a place-holder value, until fuller initialization. | |
767 // (This allows asserts in oop_is_instance to succeed.) | |
768 ik->set_layout_helper(Klass::instance_layout_helper(0, true)); | |
769 assert(ik->oop_is_instance(), "object must be instanceKlass"); | |
770 assert(ik->transitive_interfaces() == NULL, "just checking"); | |
771 ik->set_transitive_interfaces((objArrayOop) obj); // Temporarily set transitive_interfaces to point to self | |
772 } |