annotate src/share/vm/oops/klassKlass.cpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents 7fcd5f39bd7a
children 06f017f7daa7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1155
diff changeset
2 * Copyright (c) 1997, 2006, 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: 1155
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1155
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1155
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_klassKlass.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 int klassKlass::oop_size(oop obj) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
29 assert (obj->is_klass(), "must be a klassOop");
a61af66fc99e Initial load
duke
parents:
diff changeset
30 return klassOop(obj)->klass_part()->klass_oop_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
31 }
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 klassOop klassKlass::create_klass(TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
34 KlassHandle h_this_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 klassKlass o;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // for bootstrapping, handles may not be available yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
37 klassOop k = base_create_klass_oop(h_this_klass, header_size(), o.vtbl_value(), CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
38 k->set_klass(k); // point to thyself
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // Do not try to allocate mirror, java.lang.Class not loaded at this point.
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // See Universe::fixup_mirrors()
a61af66fc99e Initial load
duke
parents:
diff changeset
41 return k;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 }
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 void klassKlass::oop_follow_contents(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
45 Klass* k = Klass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // If we are alive it is valid to keep our superclass and subtype caches alive
a61af66fc99e Initial load
duke
parents:
diff changeset
47 MarkSweep::mark_and_push(k->adr_super());
a61af66fc99e Initial load
duke
parents:
diff changeset
48 for (juint i = 0; i < Klass::primary_super_limit(); i++)
a61af66fc99e Initial load
duke
parents:
diff changeset
49 MarkSweep::mark_and_push(k->adr_primary_supers()+i);
a61af66fc99e Initial load
duke
parents:
diff changeset
50 MarkSweep::mark_and_push(k->adr_secondary_super_cache());
a61af66fc99e Initial load
duke
parents:
diff changeset
51 MarkSweep::mark_and_push(k->adr_secondary_supers());
a61af66fc99e Initial load
duke
parents:
diff changeset
52 MarkSweep::mark_and_push(k->adr_java_mirror());
1941
79d04223b8a5 Added caching for resolved types and resolved fields.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents: 1713
diff changeset
53 MarkSweep::mark_and_push(k->adr_c1x_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
54 MarkSweep::mark_and_push(k->adr_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // We follow the subklass and sibling links at the end of the
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // marking phase, since otherwise following them will prevent
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // class unloading (all classes are transitively linked from
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // java.lang.Object).
a61af66fc99e Initial load
duke
parents:
diff changeset
59 MarkSweep::revisit_weak_klass_link(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
60 obj->follow_header();
a61af66fc99e Initial load
duke
parents:
diff changeset
61 }
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
64 void klassKlass::oop_follow_contents(ParCompactionManager* cm,
a61af66fc99e Initial load
duke
parents:
diff changeset
65 oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 Klass* k = Klass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // If we are alive it is valid to keep our superclass and subtype caches alive
a61af66fc99e Initial load
duke
parents:
diff changeset
68 PSParallelCompact::mark_and_push(cm, k->adr_super());
a61af66fc99e Initial load
duke
parents:
diff changeset
69 for (juint i = 0; i < Klass::primary_super_limit(); i++)
a61af66fc99e Initial load
duke
parents:
diff changeset
70 PSParallelCompact::mark_and_push(cm, k->adr_primary_supers()+i);
a61af66fc99e Initial load
duke
parents:
diff changeset
71 PSParallelCompact::mark_and_push(cm, k->adr_secondary_super_cache());
a61af66fc99e Initial load
duke
parents:
diff changeset
72 PSParallelCompact::mark_and_push(cm, k->adr_secondary_supers());
a61af66fc99e Initial load
duke
parents:
diff changeset
73 PSParallelCompact::mark_and_push(cm, k->adr_java_mirror());
1941
79d04223b8a5 Added caching for resolved types and resolved fields.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents: 1713
diff changeset
74 PSParallelCompact::mark_and_push(cm, k->adr_c1x_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
75 PSParallelCompact::mark_and_push(cm, k->adr_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // We follow the subklass and sibling links at the end of the
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // marking phase, since otherwise following them will prevent
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // class unloading (all classes are transitively linked from
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // java.lang.Object).
a61af66fc99e Initial load
duke
parents:
diff changeset
80 PSParallelCompact::revisit_weak_klass_link(cm, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 obj->follow_header(cm);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 int klassKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // Get size before changing pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
87 int size = oop_size(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 Klass* k = Klass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
89 blk->do_oop(k->adr_super());
a61af66fc99e Initial load
duke
parents:
diff changeset
90 for (juint i = 0; i < Klass::primary_super_limit(); i++)
a61af66fc99e Initial load
duke
parents:
diff changeset
91 blk->do_oop(k->adr_primary_supers()+i);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 blk->do_oop(k->adr_secondary_super_cache());
a61af66fc99e Initial load
duke
parents:
diff changeset
93 blk->do_oop(k->adr_secondary_supers());
a61af66fc99e Initial load
duke
parents:
diff changeset
94 blk->do_oop(k->adr_java_mirror());
1941
79d04223b8a5 Added caching for resolved types and resolved fields.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents: 1713
diff changeset
95 blk->do_oop(k->adr_c1x_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
96 blk->do_oop(k->adr_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // The following are in the perm gen and are treated
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // specially in a later phase of a perm gen collection; ...
a61af66fc99e Initial load
duke
parents:
diff changeset
99 assert(oop(k)->is_perm(), "should be in perm");
a61af66fc99e Initial load
duke
parents:
diff changeset
100 assert(oop(k->subklass())->is_perm_or_null(), "should be in perm");
a61af66fc99e Initial load
duke
parents:
diff changeset
101 assert(oop(k->next_sibling())->is_perm_or_null(), "should be in perm");
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // ... don't scan them normally, but remember this klassKlass
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // for later (see, for instance, oop_follow_contents above
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // for what MarkSweep does with it.
a61af66fc99e Initial load
duke
parents:
diff changeset
105 if (blk->should_remember_klasses()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 blk->remember_klass(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108 obj->oop_iterate_header(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 return size;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 int klassKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // Get size before changing pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
115 int size = oop_size(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
116 Klass* k = Klass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
117 oop* adr;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 adr = k->adr_super();
a61af66fc99e Initial load
duke
parents:
diff changeset
119 if (mr.contains(adr)) blk->do_oop(adr);
a61af66fc99e Initial load
duke
parents:
diff changeset
120 for (juint i = 0; i < Klass::primary_super_limit(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 adr = k->adr_primary_supers()+i;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 if (mr.contains(adr)) blk->do_oop(adr);
a61af66fc99e Initial load
duke
parents:
diff changeset
123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
124 adr = k->adr_secondary_super_cache();
a61af66fc99e Initial load
duke
parents:
diff changeset
125 if (mr.contains(adr)) blk->do_oop(adr);
a61af66fc99e Initial load
duke
parents:
diff changeset
126 adr = k->adr_secondary_supers();
a61af66fc99e Initial load
duke
parents:
diff changeset
127 if (mr.contains(adr)) blk->do_oop(adr);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 adr = k->adr_java_mirror();
a61af66fc99e Initial load
duke
parents:
diff changeset
129 if (mr.contains(adr)) blk->do_oop(adr);
1941
79d04223b8a5 Added caching for resolved types and resolved fields.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents: 1713
diff changeset
130 adr = k->adr_c1x_mirror();
79d04223b8a5 Added caching for resolved types and resolved fields.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents: 1713
diff changeset
131 if (mr.contains(adr)) blk->do_oop(adr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
132 adr = k->adr_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
133 if (mr.contains(adr)) blk->do_oop(adr);
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // The following are "weak links" in the perm gen and are
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // treated specially in a later phase of a perm gen collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
136 assert(oop(k)->is_perm(), "should be in perm");
a61af66fc99e Initial load
duke
parents:
diff changeset
137 assert(oop(k->adr_subklass())->is_perm(), "should be in perm");
a61af66fc99e Initial load
duke
parents:
diff changeset
138 assert(oop(k->adr_next_sibling())->is_perm(), "should be in perm");
a61af66fc99e Initial load
duke
parents:
diff changeset
139 if (blk->should_remember_klasses()
a61af66fc99e Initial load
duke
parents:
diff changeset
140 && (mr.contains(k->adr_subklass())
a61af66fc99e Initial load
duke
parents:
diff changeset
141 || mr.contains(k->adr_next_sibling()))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 blk->remember_klass(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 obj->oop_iterate_header(blk, mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 return size;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 int klassKlass::oop_adjust_pointers(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // Get size before changing pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
151 int size = oop_size(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
152 obj->adjust_header();
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 Klass* k = Klass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 MarkSweep::adjust_pointer(k->adr_super());
a61af66fc99e Initial load
duke
parents:
diff changeset
157 for (juint i = 0; i < Klass::primary_super_limit(); i++)
a61af66fc99e Initial load
duke
parents:
diff changeset
158 MarkSweep::adjust_pointer(k->adr_primary_supers()+i);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 MarkSweep::adjust_pointer(k->adr_secondary_super_cache());
a61af66fc99e Initial load
duke
parents:
diff changeset
160 MarkSweep::adjust_pointer(k->adr_secondary_supers());
a61af66fc99e Initial load
duke
parents:
diff changeset
161 MarkSweep::adjust_pointer(k->adr_java_mirror());
1941
79d04223b8a5 Added caching for resolved types and resolved fields.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents: 1713
diff changeset
162 MarkSweep::adjust_pointer(k->adr_c1x_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
163 MarkSweep::adjust_pointer(k->adr_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
164 MarkSweep::adjust_pointer(k->adr_subklass());
a61af66fc99e Initial load
duke
parents:
diff changeset
165 MarkSweep::adjust_pointer(k->adr_next_sibling());
a61af66fc99e Initial load
duke
parents:
diff changeset
166 return size;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
170 void klassKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 int klassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
174 Klass* k = Klass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 oop* const beg_oop = k->oop_block_beg();
a61af66fc99e Initial load
duke
parents:
diff changeset
177 oop* const end_oop = k->oop_block_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
178 for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 PSParallelCompact::adjust_pointer(cur_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 return oop_size(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 int klassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
186 HeapWord* beg_addr, HeapWord* end_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 Klass* k = Klass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 oop* const beg_oop = MAX2((oop*)beg_addr, k->oop_block_beg());
a61af66fc99e Initial load
duke
parents:
diff changeset
190 oop* const end_oop = MIN2((oop*)end_addr, k->oop_block_end());
a61af66fc99e Initial load
duke
parents:
diff changeset
191 for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) {
a61af66fc99e Initial load
duke
parents:
diff changeset
192 PSParallelCompact::adjust_pointer(cur_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 return oop_size(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 void klassKlass::oop_print_on(oop obj, outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 Klass::oop_print_on(obj, st);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 void klassKlass::oop_print_value_on(oop obj, outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 Klass::oop_print_value_on(obj, st);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 const char* klassKlass::internal_name() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 return "{other class}";
a61af66fc99e Initial load
duke
parents:
diff changeset
212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Verification
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 void klassKlass::oop_verify_on(oop obj, outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 Klass::oop_verify_on(obj, st);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 guarantee(obj->is_perm(), "should be in permspace");
a61af66fc99e Initial load
duke
parents:
diff changeset
220 guarantee(obj->is_klass(), "should be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 Klass* k = Klass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
223 if (k->super() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 guarantee(k->super()->is_perm(), "should be in permspace");
a61af66fc99e Initial load
duke
parents:
diff changeset
225 guarantee(k->super()->is_klass(), "should be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227 klassOop ko = k->secondary_super_cache();
a61af66fc99e Initial load
duke
parents:
diff changeset
228 if( ko != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
229 guarantee(ko->is_perm(), "should be in permspace");
a61af66fc99e Initial load
duke
parents:
diff changeset
230 guarantee(ko->is_klass(), "should be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 for( uint i = 0; i < primary_super_limit(); i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 oop ko = k->adr_primary_supers()[i]; // Cannot use normal accessor because it asserts
a61af66fc99e Initial load
duke
parents:
diff changeset
234 if( ko != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 guarantee(ko->is_perm(), "should be in permspace");
a61af66fc99e Initial load
duke
parents:
diff changeset
236 guarantee(ko->is_klass(), "should be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 if (k->java_mirror() != NULL || (k->oop_is_instance() && instanceKlass::cast(klassOop(obj))->is_loaded())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
241 guarantee(k->java_mirror() != NULL, "should be allocated");
a61af66fc99e Initial load
duke
parents:
diff changeset
242 guarantee(k->java_mirror()->is_perm(), "should be in permspace");
a61af66fc99e Initial load
duke
parents:
diff changeset
243 guarantee(k->java_mirror()->is_instance(), "should be instance");
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245 if (k->name() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 guarantee(Universe::heap()->is_in_permanent(k->name()),
a61af66fc99e Initial load
duke
parents:
diff changeset
247 "should be in permspace");
a61af66fc99e Initial load
duke
parents:
diff changeset
248 guarantee(k->name()->is_symbol(), "should be symbol");
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }