src/share/vm/oops/instanceKlassKlass.cpp

Thu, 07 Apr 2011 09:53:20 -0700

author
johnc
date
Thu, 07 Apr 2011 09:53:20 -0700
changeset 2781
e1162778c1c8
parent 2658
c7f3d0b4570f
child 2742
ed69575596ac
permissions
-rw-r--r--

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer.
Reviewed-by: kvn, iveresov, never, tonyp, dholmes

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

mercurial