annotate src/share/vm/oops/instanceKlassKlass.cpp @ 4155:394404b2d9bd

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