Mercurial > hg > truffle
annotate src/share/vm/oops/instanceKlassKlass.cpp @ 2066:02895c6a2f82
7007769: VM crashes with SIGBUS writing PerfData if tmp space is full
Summary: Fill perfdata file with zeros to verify available disk space
Reviewed-by: coleenp, kamg
author | bobv |
---|---|
date | Mon, 20 Dec 2010 14:30:24 -0500 |
parents | f95d63e2154a |
children | 3582bf76420e |
rev | line source |
---|---|
0 | 1 /* |
1972 | 2 * Copyright (c) 1997, 2010, 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" | |
34 #include "oops/instanceKlassKlass.hpp" | |
35 #include "oops/instanceRefKlass.hpp" | |
36 #include "oops/objArrayKlassKlass.hpp" | |
37 #include "oops/objArrayOop.hpp" | |
38 #include "oops/oop.inline.hpp" | |
39 #include "oops/oop.inline2.hpp" | |
40 #include "oops/symbolOop.hpp" | |
41 #include "oops/typeArrayOop.hpp" | |
42 #include "prims/jvmtiExport.hpp" | |
43 #include "runtime/fieldDescriptor.hpp" | |
44 #ifndef SERIALGC | |
45 #include "gc_implementation/parNew/parOopClosures.inline.hpp" | |
46 #include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp" | |
47 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp" | |
48 #include "memory/cardTableRS.hpp" | |
49 #include "oops/oop.pcgc.inline.hpp" | |
50 #endif | |
0 | 51 |
52 klassOop instanceKlassKlass::create_klass(TRAPS) { | |
53 instanceKlassKlass o; | |
54 KlassHandle h_this_klass(THREAD, Universe::klassKlassObj()); | |
55 KlassHandle k = base_create_klass(h_this_klass, header_size(), o.vtbl_value(), CHECK_NULL); | |
56 // Make sure size calculation is right | |
57 assert(k()->size() == align_object_size(header_size()), "wrong size for object"); | |
58 java_lang_Class::create_mirror(k, CHECK_NULL); // Allocate mirror | |
59 return k(); | |
60 } | |
61 | |
62 int instanceKlassKlass::oop_size(oop obj) const { | |
63 assert(obj->is_klass(), "must be klass"); | |
64 return instanceKlass::cast(klassOop(obj))->object_size(); | |
65 } | |
66 | |
67 bool instanceKlassKlass::oop_is_parsable(oop obj) const { | |
68 assert(obj->is_klass(), "must be klass"); | |
69 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
70 return (!ik->null_vtbl()) && ik->object_is_parsable(); | |
71 } | |
72 | |
73 void instanceKlassKlass::iterate_c_heap_oops(instanceKlass* ik, | |
74 OopClosure* closure) { | |
75 if (ik->oop_map_cache() != NULL) { | |
76 ik->oop_map_cache()->oop_iterate(closure); | |
77 } | |
78 | |
79 if (ik->jni_ids() != NULL) { | |
80 ik->jni_ids()->oops_do(closure); | |
81 } | |
82 } | |
83 | |
84 void instanceKlassKlass::oop_follow_contents(oop obj) { | |
85 assert(obj->is_klass(),"must be a klass"); | |
86 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); | |
87 | |
88 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
89 ik->follow_static_fields(); | |
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_source_file_name()); | |
105 MarkSweep::mark_and_push(ik->adr_source_debug_extension()); | |
106 MarkSweep::mark_and_push(ik->adr_inner_classes()); | |
107 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
|
108 MarkSweep::mark_and_push(ik->adr_host_klass()); |
0 | 109 MarkSweep::mark_and_push(ik->adr_signers()); |
110 MarkSweep::mark_and_push(ik->adr_generic_signature()); | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
665
diff
changeset
|
111 MarkSweep::mark_and_push(ik->adr_bootstrap_method()); |
0 | 112 MarkSweep::mark_and_push(ik->adr_class_annotations()); |
113 MarkSweep::mark_and_push(ik->adr_fields_annotations()); | |
114 MarkSweep::mark_and_push(ik->adr_methods_annotations()); | |
115 MarkSweep::mark_and_push(ik->adr_methods_parameter_annotations()); | |
116 MarkSweep::mark_and_push(ik->adr_methods_default_annotations()); | |
117 | |
118 // We do not follow adr_implementors() here. It is followed later | |
119 // in instanceKlass::follow_weak_klass_links() | |
120 | |
121 klassKlass::oop_follow_contents(obj); | |
122 | |
123 iterate_c_heap_oops(ik, &MarkSweep::mark_and_push_closure); | |
124 } | |
125 | |
126 #ifndef SERIALGC | |
127 void instanceKlassKlass::oop_follow_contents(ParCompactionManager* cm, | |
128 oop obj) { | |
129 assert(obj->is_klass(),"must be a klass"); | |
130 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); | |
131 | |
132 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
133 ik->follow_static_fields(cm); | |
134 ik->vtable()->oop_follow_contents(cm); | |
135 ik->itable()->oop_follow_contents(cm); | |
136 | |
137 PSParallelCompact::mark_and_push(cm, ik->adr_array_klasses()); | |
138 PSParallelCompact::mark_and_push(cm, ik->adr_methods()); | |
139 PSParallelCompact::mark_and_push(cm, ik->adr_method_ordering()); | |
140 PSParallelCompact::mark_and_push(cm, ik->adr_local_interfaces()); | |
141 PSParallelCompact::mark_and_push(cm, ik->adr_transitive_interfaces()); | |
142 PSParallelCompact::mark_and_push(cm, ik->adr_fields()); | |
143 PSParallelCompact::mark_and_push(cm, ik->adr_constants()); | |
144 PSParallelCompact::mark_and_push(cm, ik->adr_class_loader()); | |
145 PSParallelCompact::mark_and_push(cm, ik->adr_source_file_name()); | |
146 PSParallelCompact::mark_and_push(cm, ik->adr_source_debug_extension()); | |
147 PSParallelCompact::mark_and_push(cm, ik->adr_inner_classes()); | |
148 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
|
149 PSParallelCompact::mark_and_push(cm, ik->adr_host_klass()); |
0 | 150 PSParallelCompact::mark_and_push(cm, ik->adr_signers()); |
151 PSParallelCompact::mark_and_push(cm, ik->adr_generic_signature()); | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
665
diff
changeset
|
152 PSParallelCompact::mark_and_push(cm, ik->adr_bootstrap_method()); |
0 | 153 PSParallelCompact::mark_and_push(cm, ik->adr_class_annotations()); |
154 PSParallelCompact::mark_and_push(cm, ik->adr_fields_annotations()); | |
155 PSParallelCompact::mark_and_push(cm, ik->adr_methods_annotations()); | |
156 PSParallelCompact::mark_and_push(cm, ik->adr_methods_parameter_annotations()); | |
157 PSParallelCompact::mark_and_push(cm, ik->adr_methods_default_annotations()); | |
158 | |
159 // We do not follow adr_implementor() here. It is followed later | |
160 // in instanceKlass::follow_weak_klass_links() | |
161 | |
162 klassKlass::oop_follow_contents(cm, obj); | |
163 | |
164 PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm); | |
165 iterate_c_heap_oops(ik, &mark_and_push_closure); | |
166 } | |
167 #endif // SERIALGC | |
168 | |
169 int instanceKlassKlass::oop_oop_iterate(oop obj, OopClosure* blk) { | |
170 assert(obj->is_klass(),"must be a klass"); | |
171 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); | |
172 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
173 // Get size before changing pointers. | |
174 // Don't call size() or oop_size() since that is a virtual call. | |
175 int size = ik->object_size(); | |
176 | |
177 ik->iterate_static_fields(blk); | |
178 ik->vtable()->oop_oop_iterate(blk); | |
179 ik->itable()->oop_oop_iterate(blk); | |
180 | |
181 blk->do_oop(ik->adr_array_klasses()); | |
182 blk->do_oop(ik->adr_methods()); | |
183 blk->do_oop(ik->adr_method_ordering()); | |
184 blk->do_oop(ik->adr_local_interfaces()); | |
185 blk->do_oop(ik->adr_transitive_interfaces()); | |
186 blk->do_oop(ik->adr_fields()); | |
187 blk->do_oop(ik->adr_constants()); | |
188 blk->do_oop(ik->adr_class_loader()); | |
189 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
|
190 blk->do_oop(ik->adr_host_klass()); |
0 | 191 blk->do_oop(ik->adr_signers()); |
192 blk->do_oop(ik->adr_source_file_name()); | |
193 blk->do_oop(ik->adr_source_debug_extension()); | |
194 blk->do_oop(ik->adr_inner_classes()); | |
195 for (int i = 0; i < instanceKlass::implementors_limit; i++) { | |
196 blk->do_oop(&ik->adr_implementors()[i]); | |
197 } | |
198 blk->do_oop(ik->adr_generic_signature()); | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
665
diff
changeset
|
199 blk->do_oop(ik->adr_bootstrap_method()); |
0 | 200 blk->do_oop(ik->adr_class_annotations()); |
201 blk->do_oop(ik->adr_fields_annotations()); | |
202 blk->do_oop(ik->adr_methods_annotations()); | |
203 blk->do_oop(ik->adr_methods_parameter_annotations()); | |
204 blk->do_oop(ik->adr_methods_default_annotations()); | |
205 | |
206 klassKlass::oop_oop_iterate(obj, blk); | |
207 | |
208 if(ik->oop_map_cache() != NULL) ik->oop_map_cache()->oop_iterate(blk); | |
209 return size; | |
210 } | |
211 | |
212 int instanceKlassKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, | |
213 MemRegion mr) { | |
214 assert(obj->is_klass(),"must be a klass"); | |
215 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); | |
216 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
217 // Get size before changing pointers. | |
218 // Don't call size() or oop_size() since that is a virtual call. | |
219 int size = ik->object_size(); | |
220 | |
221 ik->iterate_static_fields(blk, mr); | |
222 ik->vtable()->oop_oop_iterate_m(blk, mr); | |
223 ik->itable()->oop_oop_iterate_m(blk, mr); | |
224 | |
225 oop* adr; | |
226 adr = ik->adr_array_klasses(); | |
227 if (mr.contains(adr)) blk->do_oop(adr); | |
228 adr = ik->adr_methods(); | |
229 if (mr.contains(adr)) blk->do_oop(adr); | |
230 adr = ik->adr_method_ordering(); | |
231 if (mr.contains(adr)) blk->do_oop(adr); | |
232 adr = ik->adr_local_interfaces(); | |
233 if (mr.contains(adr)) blk->do_oop(adr); | |
234 adr = ik->adr_transitive_interfaces(); | |
235 if (mr.contains(adr)) blk->do_oop(adr); | |
236 adr = ik->adr_fields(); | |
237 if (mr.contains(adr)) blk->do_oop(adr); | |
238 adr = ik->adr_constants(); | |
239 if (mr.contains(adr)) blk->do_oop(adr); | |
240 adr = ik->adr_class_loader(); | |
241 if (mr.contains(adr)) blk->do_oop(adr); | |
242 adr = ik->adr_protection_domain(); | |
243 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
|
244 adr = ik->adr_host_klass(); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
245 if (mr.contains(adr)) blk->do_oop(adr); |
0 | 246 adr = ik->adr_signers(); |
247 if (mr.contains(adr)) blk->do_oop(adr); | |
248 adr = ik->adr_source_file_name(); | |
249 if (mr.contains(adr)) blk->do_oop(adr); | |
250 adr = ik->adr_source_debug_extension(); | |
251 if (mr.contains(adr)) blk->do_oop(adr); | |
252 adr = ik->adr_inner_classes(); | |
253 if (mr.contains(adr)) blk->do_oop(adr); | |
254 adr = ik->adr_implementors(); | |
255 for (int i = 0; i < instanceKlass::implementors_limit; i++) { | |
256 if (mr.contains(&adr[i])) blk->do_oop(&adr[i]); | |
257 } | |
258 adr = ik->adr_generic_signature(); | |
259 if (mr.contains(adr)) blk->do_oop(adr); | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
665
diff
changeset
|
260 adr = ik->adr_bootstrap_method(); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
665
diff
changeset
|
261 if (mr.contains(adr)) blk->do_oop(adr); |
0 | 262 adr = ik->adr_class_annotations(); |
263 if (mr.contains(adr)) blk->do_oop(adr); | |
264 adr = ik->adr_fields_annotations(); | |
265 if (mr.contains(adr)) blk->do_oop(adr); | |
266 adr = ik->adr_methods_annotations(); | |
267 if (mr.contains(adr)) blk->do_oop(adr); | |
268 adr = ik->adr_methods_parameter_annotations(); | |
269 if (mr.contains(adr)) blk->do_oop(adr); | |
270 adr = ik->adr_methods_default_annotations(); | |
271 if (mr.contains(adr)) blk->do_oop(adr); | |
272 | |
273 klassKlass::oop_oop_iterate_m(obj, blk, mr); | |
274 | |
275 if(ik->oop_map_cache() != NULL) ik->oop_map_cache()->oop_iterate(blk, mr); | |
276 return size; | |
277 } | |
278 | |
279 int instanceKlassKlass::oop_adjust_pointers(oop obj) { | |
280 assert(obj->is_klass(),"must be a klass"); | |
281 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), "must be instance klass"); | |
282 | |
283 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
284 ik->adjust_static_fields(); | |
285 ik->vtable()->oop_adjust_pointers(); | |
286 ik->itable()->oop_adjust_pointers(); | |
287 | |
288 MarkSweep::adjust_pointer(ik->adr_array_klasses()); | |
289 MarkSweep::adjust_pointer(ik->adr_methods()); | |
290 MarkSweep::adjust_pointer(ik->adr_method_ordering()); | |
291 MarkSweep::adjust_pointer(ik->adr_local_interfaces()); | |
292 MarkSweep::adjust_pointer(ik->adr_transitive_interfaces()); | |
293 MarkSweep::adjust_pointer(ik->adr_fields()); | |
294 MarkSweep::adjust_pointer(ik->adr_constants()); | |
295 MarkSweep::adjust_pointer(ik->adr_class_loader()); | |
296 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
|
297 MarkSweep::adjust_pointer(ik->adr_host_klass()); |
0 | 298 MarkSweep::adjust_pointer(ik->adr_signers()); |
299 MarkSweep::adjust_pointer(ik->adr_source_file_name()); | |
300 MarkSweep::adjust_pointer(ik->adr_source_debug_extension()); | |
301 MarkSweep::adjust_pointer(ik->adr_inner_classes()); | |
302 for (int i = 0; i < instanceKlass::implementors_limit; i++) { | |
303 MarkSweep::adjust_pointer(&ik->adr_implementors()[i]); | |
304 } | |
305 MarkSweep::adjust_pointer(ik->adr_generic_signature()); | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
665
diff
changeset
|
306 MarkSweep::adjust_pointer(ik->adr_bootstrap_method()); |
0 | 307 MarkSweep::adjust_pointer(ik->adr_class_annotations()); |
308 MarkSweep::adjust_pointer(ik->adr_fields_annotations()); | |
309 MarkSweep::adjust_pointer(ik->adr_methods_annotations()); | |
310 MarkSweep::adjust_pointer(ik->adr_methods_parameter_annotations()); | |
311 MarkSweep::adjust_pointer(ik->adr_methods_default_annotations()); | |
312 | |
313 iterate_c_heap_oops(ik, &MarkSweep::adjust_root_pointer_closure); | |
314 | |
315 return klassKlass::oop_adjust_pointers(obj); | |
316 } | |
317 | |
318 #ifndef SERIALGC | |
319 void instanceKlassKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { | |
320 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
321 ik->push_static_fields(pm); | |
322 | |
323 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
|
324 if (PSScavenge::should_scavenge(loader_addr)) { |
0 | 325 pm->claim_or_forward_depth(loader_addr); |
326 } | |
327 | |
328 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
|
329 if (PSScavenge::should_scavenge(pd_addr)) { |
0 | 330 pm->claim_or_forward_depth(pd_addr); |
331 } | |
332 | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
333 oop* hk_addr = ik->adr_host_klass(); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
334 if (PSScavenge::should_scavenge(hk_addr)) { |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
335 pm->claim_or_forward_depth(hk_addr); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
336 } |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
337 |
0 | 338 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
|
339 if (PSScavenge::should_scavenge(sg_addr)) { |
0 | 340 pm->claim_or_forward_depth(sg_addr); |
341 } | |
342 | |
1059
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
975
diff
changeset
|
343 oop* bsm_addr = ik->adr_bootstrap_method(); |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
975
diff
changeset
|
344 if (PSScavenge::should_scavenge(bsm_addr)) { |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
975
diff
changeset
|
345 pm->claim_or_forward_depth(bsm_addr); |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
975
diff
changeset
|
346 } |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
975
diff
changeset
|
347 |
1706
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1552
diff
changeset
|
348 klassKlass::oop_push_contents(pm, obj); |
0 | 349 } |
350 | |
351 int instanceKlassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { | |
352 assert(obj->is_klass(),"must be a klass"); | |
353 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), | |
354 "must be instance klass"); | |
355 | |
356 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
357 ik->update_static_fields(); | |
358 ik->vtable()->oop_update_pointers(cm); | |
359 ik->itable()->oop_update_pointers(cm); | |
360 | |
361 oop* const beg_oop = ik->oop_block_beg(); | |
362 oop* const end_oop = ik->oop_block_end(); | |
363 for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) { | |
364 PSParallelCompact::adjust_pointer(cur_oop); | |
365 } | |
366 | |
367 OopClosure* closure = PSParallelCompact::adjust_root_pointer_closure(); | |
368 iterate_c_heap_oops(ik, closure); | |
369 | |
370 klassKlass::oop_update_pointers(cm, obj); | |
371 return ik->object_size(); | |
372 } | |
373 | |
374 int instanceKlassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj, | |
375 HeapWord* beg_addr, | |
376 HeapWord* end_addr) { | |
377 assert(obj->is_klass(),"must be a klass"); | |
378 assert(klassOop(obj)->klass_part()->oop_is_instance_slow(), | |
379 "must be instance klass"); | |
380 | |
381 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
382 ik->update_static_fields(beg_addr, end_addr); | |
383 ik->vtable()->oop_update_pointers(cm, beg_addr, end_addr); | |
384 ik->itable()->oop_update_pointers(cm, beg_addr, end_addr); | |
385 | |
386 oop* const beg_oop = MAX2((oop*)beg_addr, ik->oop_block_beg()); | |
387 oop* const end_oop = MIN2((oop*)end_addr, ik->oop_block_end()); | |
388 for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) { | |
389 PSParallelCompact::adjust_pointer(cur_oop); | |
390 } | |
391 | |
392 // The oop_map_cache, jni_ids and jni_id_map are allocated from the C heap, | |
393 // and so don't lie within any 'Chunk' boundaries. Update them when the | |
394 // lowest addressed oop in the instanceKlass 'oop_block' is updated. | |
395 if (beg_oop == ik->oop_block_beg()) { | |
396 OopClosure* closure = PSParallelCompact::adjust_root_pointer_closure(); | |
397 iterate_c_heap_oops(ik, closure); | |
398 } | |
399 | |
400 klassKlass::oop_update_pointers(cm, obj, beg_addr, end_addr); | |
401 return ik->object_size(); | |
402 } | |
403 #endif // SERIALGC | |
404 | |
938 | 405 klassOop |
406 instanceKlassKlass::allocate_instance_klass(int vtable_len, int itable_len, | |
407 int static_field_size, | |
939
9eebd3ac74cf
6845368: large objects cause a crash or unexpected exception
jcoomes
parents:
938
diff
changeset
|
408 unsigned nonstatic_oop_map_count, |
938 | 409 ReferenceType rt, TRAPS) { |
0 | 410 |
938 | 411 const int nonstatic_oop_map_size = |
412 instanceKlass::nonstatic_oop_map_size(nonstatic_oop_map_count); | |
0 | 413 int size = instanceKlass::object_size(align_object_offset(vtable_len) + align_object_offset(itable_len) + static_field_size + nonstatic_oop_map_size); |
414 | |
415 // Allocation | |
416 KlassHandle h_this_klass(THREAD, as_klassOop()); | |
417 KlassHandle k; | |
418 if (rt == REF_NONE) { | |
419 // regular klass | |
420 instanceKlass o; | |
421 k = base_create_klass(h_this_klass, size, o.vtbl_value(), CHECK_NULL); | |
422 } else { | |
423 // reference klass | |
424 instanceRefKlass o; | |
425 k = base_create_klass(h_this_klass, size, o.vtbl_value(), CHECK_NULL); | |
426 } | |
427 { | |
428 No_Safepoint_Verifier no_safepoint; // until k becomes parsable | |
429 instanceKlass* ik = (instanceKlass*) k()->klass_part(); | |
430 assert(!k()->is_parsable(), "not expecting parsability yet."); | |
431 | |
432 // The sizes of these these three variables are used for determining the | |
433 // size of the instanceKlassOop. It is critical that these are set to the right | |
434 // sizes before the first GC, i.e., when we allocate the mirror. | |
435 ik->set_vtable_length(vtable_len); | |
436 ik->set_itable_length(itable_len); | |
437 ik->set_static_field_size(static_field_size); | |
438 ik->set_nonstatic_oop_map_size(nonstatic_oop_map_size); | |
439 assert(k()->size() == size, "wrong size for object"); | |
440 | |
441 ik->set_array_klasses(NULL); | |
442 ik->set_methods(NULL); | |
443 ik->set_method_ordering(NULL); | |
444 ik->set_local_interfaces(NULL); | |
445 ik->set_transitive_interfaces(NULL); | |
446 ik->init_implementor(); | |
447 ik->set_fields(NULL); | |
448 ik->set_constants(NULL); | |
449 ik->set_class_loader(NULL); | |
450 ik->set_protection_domain(NULL); | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
451 ik->set_host_klass(NULL); |
0 | 452 ik->set_signers(NULL); |
453 ik->set_source_file_name(NULL); | |
454 ik->set_source_debug_extension(NULL); | |
455 ik->set_inner_classes(NULL); | |
456 ik->set_static_oop_field_size(0); | |
457 ik->set_nonstatic_field_size(0); | |
975 | 458 ik->set_is_marked_dependent(false); |
0 | 459 ik->set_init_state(instanceKlass::allocated); |
460 ik->set_init_thread(NULL); | |
461 ik->set_reference_type(rt); | |
462 ik->set_oop_map_cache(NULL); | |
463 ik->set_jni_ids(NULL); | |
464 ik->set_osr_nmethods_head(NULL); | |
465 ik->set_breakpoints(NULL); | |
466 ik->init_previous_versions(); | |
467 ik->set_generic_signature(NULL); | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
665
diff
changeset
|
468 ik->set_bootstrap_method(NULL); |
0 | 469 ik->release_set_methods_jmethod_ids(NULL); |
470 ik->release_set_methods_cached_itable_indices(NULL); | |
471 ik->set_class_annotations(NULL); | |
472 ik->set_fields_annotations(NULL); | |
473 ik->set_methods_annotations(NULL); | |
474 ik->set_methods_parameter_annotations(NULL); | |
475 ik->set_methods_default_annotations(NULL); | |
476 ik->set_enclosing_method_indices(0, 0); | |
477 ik->set_jvmti_cached_class_field_map(NULL); | |
478 ik->set_initial_method_idnum(0); | |
479 assert(k()->is_parsable(), "should be parsable here."); | |
480 | |
481 // initialize the non-header words to zero | |
482 intptr_t* p = (intptr_t*)k(); | |
483 for (int index = instanceKlass::header_size(); index < size; index++) { | |
484 p[index] = NULL_WORD; | |
485 } | |
486 | |
487 // To get verify to work - must be set to partial loaded before first GC point. | |
488 k()->set_partially_loaded(); | |
489 } | |
490 | |
491 // GC can happen here | |
492 java_lang_Class::create_mirror(k, CHECK_NULL); // Allocate mirror | |
493 return k(); | |
494 } | |
495 | |
496 | |
497 | |
498 #ifndef PRODUCT | |
499 | |
500 // Printing | |
501 | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
502 #define BULLET " - " |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
503 |
0 | 504 static const char* state_names[] = { |
505 "unparseable_by_gc", "allocated", "loaded", "linked", "being_initialized", "fully_initialized", "initialization_error" | |
506 }; | |
507 | |
508 | |
509 void instanceKlassKlass::oop_print_on(oop obj, outputStream* st) { | |
510 assert(obj->is_klass(), "must be klass"); | |
511 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
512 klassKlass::oop_print_on(obj, st); | |
513 | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
514 st->print(BULLET"instance size: %d", ik->size_helper()); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
515 st->print(BULLET"klass size: %d", ik->object_size()); st->cr(); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
516 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
|
517 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
|
518 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
|
519 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
|
520 st->print(BULLET"sub: "); |
0 | 521 Klass* sub = ik->subklass(); |
522 int n; | |
523 for (n = 0; sub != NULL; n++, sub = sub->next_sibling()) { | |
524 if (n < MaxSubklassPrintSize) { | |
525 sub->as_klassOop()->print_value_on(st); | |
526 st->print(" "); | |
527 } | |
528 } | |
529 if (n >= MaxSubklassPrintSize) st->print("(%d more klasses...)", n - MaxSubklassPrintSize); | |
530 st->cr(); | |
531 | |
532 if (ik->is_interface()) { | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
533 st->print_cr(BULLET"nof implementors: %d", ik->nof_implementors()); |
0 | 534 int print_impl = 0; |
535 for (int i = 0; i < instanceKlass::implementors_limit; i++) { | |
536 if (ik->implementor(i) != NULL) { | |
537 if (++print_impl == 1) | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
538 st->print_cr(BULLET"implementor: "); |
0 | 539 st->print(" "); |
540 ik->implementor(i)->print_value_on(st); | |
541 } | |
542 } | |
543 if (print_impl > 0) st->cr(); | |
544 } | |
545 | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
546 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
|
547 st->print(BULLET"methods: "); ik->methods()->print_value_on(st); st->cr(); |
0 | 548 if (Verbose) { |
549 objArrayOop methods = ik->methods(); | |
550 for(int i = 0; i < methods->length(); i++) { | |
551 tty->print("%d : ", i); methods->obj_at(i)->print_value(); tty->cr(); | |
552 } | |
553 } | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
554 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
|
555 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
|
556 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
|
557 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
|
558 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
|
559 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
|
560 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
|
561 st->print(BULLET"signers: "); ik->signers()->print_value_on(st); st->cr(); |
0 | 562 if (ik->source_file_name() != NULL) { |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
563 st->print(BULLET"source file: "); |
0 | 564 ik->source_file_name()->print_value_on(st); |
565 st->cr(); | |
566 } | |
567 if (ik->source_debug_extension() != NULL) { | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
568 st->print(BULLET"source debug extension: "); |
0 | 569 ik->source_debug_extension()->print_value_on(st); |
570 st->cr(); | |
571 } | |
572 | |
573 { | |
574 ResourceMark rm; | |
575 // PreviousVersionInfo objects returned via PreviousVersionWalker | |
576 // contain a GrowableArray of handles. We have to clean up the | |
577 // GrowableArray _after_ the PreviousVersionWalker destructor | |
578 // has destroyed the handles. | |
579 { | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
580 bool have_pv = false; |
0 | 581 PreviousVersionWalker pvw(ik); |
582 for (PreviousVersionInfo * pv_info = pvw.next_previous_version(); | |
583 pv_info != NULL; pv_info = pvw.next_previous_version()) { | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
584 if (!have_pv) |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
585 st->print(BULLET"previous version: "); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
586 have_pv = true; |
0 | 587 pv_info->prev_constant_pool_handle()()->print_value_on(st); |
588 } | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
589 if (have_pv) st->cr(); |
0 | 590 } // pvw is cleaned up |
591 } // rm is cleaned up | |
592 | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
665
diff
changeset
|
593 if (ik->bootstrap_method() != NULL) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
665
diff
changeset
|
594 st->print(BULLET"bootstrap method: "); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
665
diff
changeset
|
595 ik->bootstrap_method()->print_value_on(st); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
665
diff
changeset
|
596 st->cr(); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
665
diff
changeset
|
597 } |
0 | 598 if (ik->generic_signature() != NULL) { |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
599 st->print(BULLET"generic signature: "); |
0 | 600 ik->generic_signature()->print_value_on(st); |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
601 st->cr(); |
0 | 602 } |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
603 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
|
604 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
|
605 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
|
606 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
|
607 st->print_cr(BULLET"---- static fields (%d words):", ik->static_field_size()); |
0 | 608 FieldPrinter print_static_field(st); |
609 ik->do_local_static_fields(&print_static_field); | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
610 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
|
611 FieldPrinter print_nonstatic_field(st); |
0 | 612 ik->do_nonstatic_fields(&print_nonstatic_field); |
613 | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
614 st->print(BULLET"static oop maps: "); |
0 | 615 if (ik->static_oop_field_size() > 0) { |
616 int first_offset = ik->offset_of_static_fields(); | |
617 st->print("%d-%d", first_offset, first_offset + ik->static_oop_field_size() - 1); | |
618 } | |
619 st->cr(); | |
620 | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
431
diff
changeset
|
621 st->print(BULLET"non-static oop maps: "); |
0 | 622 OopMapBlock* map = ik->start_of_nonstatic_oop_maps(); |
938 | 623 OopMapBlock* end_map = map + ik->nonstatic_oop_map_count(); |
0 | 624 while (map < end_map) { |
938 | 625 st->print("%d-%d ", map->offset(), map->offset() + heapOopSize*(map->count() - 1)); |
0 | 626 map++; |
627 } | |
628 st->cr(); | |
629 } | |
630 | |
1155
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
1059
diff
changeset
|
631 #endif //PRODUCT |
0 | 632 |
633 void instanceKlassKlass::oop_print_value_on(oop obj, outputStream* st) { | |
634 assert(obj->is_klass(), "must be klass"); | |
635 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
636 ik->name()->print_value_on(st); | |
637 } | |
638 | |
639 const char* instanceKlassKlass::internal_name() const { | |
640 return "{instance class}"; | |
641 } | |
642 | |
643 // Verification | |
644 | |
645 class VerifyFieldClosure: public OopClosure { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
646 protected: |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
647 template <class T> void do_oop_work(T* p) { |
0 | 648 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
|
649 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
|
650 guarantee(obj->is_oop_or_null(), "should be in heap"); |
0 | 651 } |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
652 public: |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
653 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
|
654 virtual void do_oop(narrowOop* p) { VerifyFieldClosure::do_oop_work(p); } |
0 | 655 }; |
656 | |
657 void instanceKlassKlass::oop_verify_on(oop obj, outputStream* st) { | |
658 klassKlass::oop_verify_on(obj, st); | |
659 if (!obj->partially_loaded()) { | |
660 Thread *thread = Thread::current(); | |
661 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
662 | |
663 #ifndef PRODUCT | |
664 // Avoid redundant verifies | |
665 if (ik->_verify_count == Universe::verify_count()) return; | |
666 ik->_verify_count = Universe::verify_count(); | |
667 #endif | |
668 // 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
|
669 if (ik->is_loaded() && !ik->is_anonymous()) { |
0 | 670 symbolHandle h_name (thread, ik->name()); |
671 Handle h_loader (thread, ik->class_loader()); | |
672 Handle h_obj(thread, obj); | |
673 SystemDictionary::verify_obj_klass_present(h_obj, h_name, h_loader); | |
674 } | |
675 | |
676 // Verify static fields | |
677 VerifyFieldClosure blk; | |
678 ik->iterate_static_fields(&blk); | |
679 | |
680 // Verify vtables | |
681 if (ik->is_linked()) { | |
682 ResourceMark rm(thread); | |
683 // $$$ This used to be done only for m/s collections. Doing it | |
684 // always seemed a valid generalization. (DLD -- 6/00) | |
685 ik->vtable()->verify(st); | |
686 } | |
687 | |
688 // Verify oop map cache | |
689 if (ik->oop_map_cache() != NULL) { | |
690 ik->oop_map_cache()->verify(); | |
691 } | |
692 | |
693 // Verify first subklass | |
694 if (ik->subklass_oop() != NULL) { | |
695 guarantee(ik->subklass_oop()->is_perm(), "should be in permspace"); | |
696 guarantee(ik->subklass_oop()->is_klass(), "should be klass"); | |
697 } | |
698 | |
699 // Verify siblings | |
700 klassOop super = ik->super(); | |
701 Klass* sib = ik->next_sibling(); | |
702 int sib_count = 0; | |
703 while (sib != NULL) { | |
704 if (sib == ik) { | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1155
diff
changeset
|
705 fatal(err_msg("subclass cycle of length %d", sib_count)); |
0 | 706 } |
707 if (sib_count >= 100000) { | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1155
diff
changeset
|
708 fatal(err_msg("suspiciously long subclass list %d", sib_count)); |
0 | 709 } |
710 guarantee(sib->as_klassOop()->is_klass(), "should be klass"); | |
711 guarantee(sib->as_klassOop()->is_perm(), "should be in permspace"); | |
712 guarantee(sib->super() == super, "siblings should have same superklass"); | |
713 sib = sib->next_sibling(); | |
714 } | |
715 | |
716 // Verify implementor fields | |
717 bool saw_null_impl = false; | |
718 for (int i = 0; i < instanceKlass::implementors_limit; i++) { | |
719 klassOop im = ik->implementor(i); | |
720 if (im == NULL) { saw_null_impl = true; continue; } | |
721 guarantee(!saw_null_impl, "non-nulls must preceded all nulls"); | |
722 guarantee(ik->is_interface(), "only interfaces should have implementor set"); | |
723 guarantee(i < ik->nof_implementors(), "should only have one implementor"); | |
724 guarantee(im->is_perm(), "should be in permspace"); | |
725 guarantee(im->is_klass(), "should be klass"); | |
726 guarantee(!Klass::cast(klassOop(im))->is_interface(), "implementors cannot be interfaces"); | |
727 } | |
728 | |
729 // Verify local interfaces | |
730 objArrayOop local_interfaces = ik->local_interfaces(); | |
731 guarantee(local_interfaces->is_perm(), "should be in permspace"); | |
732 guarantee(local_interfaces->is_objArray(), "should be obj array"); | |
733 int j; | |
734 for (j = 0; j < local_interfaces->length(); j++) { | |
735 oop e = local_interfaces->obj_at(j); | |
736 guarantee(e->is_klass() && Klass::cast(klassOop(e))->is_interface(), "invalid local interface"); | |
737 } | |
738 | |
739 // Verify transitive interfaces | |
740 objArrayOop transitive_interfaces = ik->transitive_interfaces(); | |
741 guarantee(transitive_interfaces->is_perm(), "should be in permspace"); | |
742 guarantee(transitive_interfaces->is_objArray(), "should be obj array"); | |
743 for (j = 0; j < transitive_interfaces->length(); j++) { | |
744 oop e = transitive_interfaces->obj_at(j); | |
745 guarantee(e->is_klass() && Klass::cast(klassOop(e))->is_interface(), "invalid transitive interface"); | |
746 } | |
747 | |
748 // Verify methods | |
749 objArrayOop methods = ik->methods(); | |
750 guarantee(methods->is_perm(), "should be in permspace"); | |
751 guarantee(methods->is_objArray(), "should be obj array"); | |
752 for (j = 0; j < methods->length(); j++) { | |
753 guarantee(methods->obj_at(j)->is_method(), "non-method in methods array"); | |
754 } | |
755 for (j = 0; j < methods->length() - 1; j++) { | |
756 methodOop m1 = methodOop(methods->obj_at(j)); | |
757 methodOop m2 = methodOop(methods->obj_at(j + 1)); | |
758 guarantee(m1->name()->fast_compare(m2->name()) <= 0, "methods not sorted correctly"); | |
759 } | |
760 | |
761 // Verify method ordering | |
762 typeArrayOop method_ordering = ik->method_ordering(); | |
763 guarantee(method_ordering->is_perm(), "should be in permspace"); | |
764 guarantee(method_ordering->is_typeArray(), "should be type array"); | |
765 int length = method_ordering->length(); | |
766 if (JvmtiExport::can_maintain_original_method_order()) { | |
767 guarantee(length == methods->length(), "invalid method ordering length"); | |
768 jlong sum = 0; | |
769 for (j = 0; j < length; j++) { | |
770 int original_index = method_ordering->int_at(j); | |
771 guarantee(original_index >= 0 && original_index < length, "invalid method ordering index"); | |
772 sum += original_index; | |
773 } | |
774 // Verify sum of indices 0,1,...,length-1 | |
775 guarantee(sum == ((jlong)length*(length-1))/2, "invalid method ordering sum"); | |
776 } else { | |
777 guarantee(length == 0, "invalid method ordering length"); | |
778 } | |
779 | |
780 // Verify JNI static field identifiers | |
781 if (ik->jni_ids() != NULL) { | |
782 ik->jni_ids()->verify(ik->as_klassOop()); | |
783 } | |
784 | |
785 // Verify other fields | |
786 if (ik->array_klasses() != NULL) { | |
787 guarantee(ik->array_klasses()->is_perm(), "should be in permspace"); | |
788 guarantee(ik->array_klasses()->is_klass(), "should be klass"); | |
789 } | |
790 guarantee(ik->fields()->is_perm(), "should be in permspace"); | |
791 guarantee(ik->fields()->is_typeArray(), "should be type array"); | |
792 guarantee(ik->constants()->is_perm(), "should be in permspace"); | |
793 guarantee(ik->constants()->is_constantPool(), "should be constant pool"); | |
794 guarantee(ik->inner_classes()->is_perm(), "should be in permspace"); | |
795 guarantee(ik->inner_classes()->is_typeArray(), "should be type array"); | |
796 if (ik->source_file_name() != NULL) { | |
797 guarantee(ik->source_file_name()->is_perm(), "should be in permspace"); | |
798 guarantee(ik->source_file_name()->is_symbol(), "should be symbol"); | |
799 } | |
800 if (ik->source_debug_extension() != NULL) { | |
801 guarantee(ik->source_debug_extension()->is_perm(), "should be in permspace"); | |
802 guarantee(ik->source_debug_extension()->is_symbol(), "should be symbol"); | |
803 } | |
804 if (ik->protection_domain() != NULL) { | |
805 guarantee(ik->protection_domain()->is_oop(), "should be oop"); | |
806 } | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
807 if (ik->host_klass() != NULL) { |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
808 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
|
809 } |
0 | 810 if (ik->signers() != NULL) { |
811 guarantee(ik->signers()->is_objArray(), "should be obj array"); | |
812 } | |
813 if (ik->generic_signature() != NULL) { | |
814 guarantee(ik->generic_signature()->is_perm(), "should be in permspace"); | |
815 guarantee(ik->generic_signature()->is_symbol(), "should be symbol"); | |
816 } | |
817 if (ik->class_annotations() != NULL) { | |
818 guarantee(ik->class_annotations()->is_typeArray(), "should be type array"); | |
819 } | |
820 if (ik->fields_annotations() != NULL) { | |
821 guarantee(ik->fields_annotations()->is_objArray(), "should be obj array"); | |
822 } | |
823 if (ik->methods_annotations() != NULL) { | |
824 guarantee(ik->methods_annotations()->is_objArray(), "should be obj array"); | |
825 } | |
826 if (ik->methods_parameter_annotations() != NULL) { | |
827 guarantee(ik->methods_parameter_annotations()->is_objArray(), "should be obj array"); | |
828 } | |
829 if (ik->methods_default_annotations() != NULL) { | |
830 guarantee(ik->methods_default_annotations()->is_objArray(), "should be obj array"); | |
831 } | |
832 } | |
833 } | |
834 | |
835 | |
836 bool instanceKlassKlass::oop_partially_loaded(oop obj) const { | |
837 assert(obj->is_klass(), "object must be klass"); | |
838 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
839 assert(ik->oop_is_instance(), "object must be instanceKlass"); | |
840 return ik->transitive_interfaces() == (objArrayOop) obj; // Check whether transitive_interfaces points to self | |
841 } | |
842 | |
843 | |
844 // The transitive_interfaces is the last field set when loading an object. | |
845 void instanceKlassKlass::oop_set_partially_loaded(oop obj) { | |
846 assert(obj->is_klass(), "object must be klass"); | |
847 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); | |
848 // Set the layout helper to a place-holder value, until fuller initialization. | |
849 // (This allows asserts in oop_is_instance to succeed.) | |
850 ik->set_layout_helper(Klass::instance_layout_helper(0, true)); | |
851 assert(ik->oop_is_instance(), "object must be instanceKlass"); | |
852 assert(ik->transitive_interfaces() == NULL, "just checking"); | |
853 ik->set_transitive_interfaces((objArrayOop) obj); // Temporarily set transitive_interfaces to point to self | |
854 } |