# HG changeset patch # User never # Date 1318912709 25200 # Node ID e5928e7dab260caf4ce8cd7d6c7cd46464f10b77 # Parent 8187c94a9a87e2ad5dc3a0512965170a0870a831 7098528: crash with java -XX:+ExtendedDTraceProbes Reviewed-by: kvn diff -r 8187c94a9a87 -r e5928e7dab26 src/share/vm/classfile/javaClasses.cpp --- a/src/share/vm/classfile/javaClasses.cpp Mon Oct 17 11:00:41 2011 -0700 +++ b/src/share/vm/classfile/javaClasses.cpp Mon Oct 17 21:38:29 2011 -0700 @@ -503,12 +503,8 @@ if (SystemDictionary::Class_klass_loaded() && (k->oop_is_instance() || k->oop_is_javaArray())) { // Allocate mirror (java.lang.Class instance) Handle mirror = instanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK_0); - // Setup indirections - mirror->obj_field_put(_klass_offset, k()); - k->set_java_mirror(mirror()); instanceMirrorKlass* mk = instanceMirrorKlass::cast(mirror->klass()); - java_lang_Class::set_oop_size(mirror(), mk->instance_size(k)); java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror())); // It might also have a component mirror. This mirror must already exist. @@ -571,9 +567,10 @@ assert(aklass != NULL, "correct bootstrap"); set_array_klass(java_class, aklass); } +#ifdef ASSERT instanceMirrorKlass* mk = instanceMirrorKlass::cast(SystemDictionary::Class_klass()); - java_lang_Class::set_oop_size(java_class, mk->instance_size(oop(NULL))); - java_lang_Class::set_static_oop_field_count(java_class, 0); + assert(java_lang_Class::static_oop_field_count(java_class) == 0, "should have been zeroed by allocation"); +#endif return java_class; } @@ -587,6 +584,12 @@ } +void java_lang_Class::set_klass(oop java_class, klassOop klass) { + assert(java_lang_Class::is_instance(java_class), "must be a Class object"); + java_class->obj_field_put(_klass_offset, klass); +} + + void java_lang_Class::print_signature(oop java_class, outputStream* st) { assert(java_lang_Class::is_instance(java_class), "must be a Class object"); Symbol* name = NULL; diff -r 8187c94a9a87 -r e5928e7dab26 src/share/vm/classfile/javaClasses.hpp --- a/src/share/vm/classfile/javaClasses.hpp Mon Oct 17 11:00:41 2011 -0700 +++ b/src/share/vm/classfile/javaClasses.hpp Mon Oct 17 21:38:29 2011 -0700 @@ -188,6 +188,7 @@ static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS); // Conversion static klassOop as_klassOop(oop java_class); + static void set_klass(oop java_class, klassOop klass); static BasicType as_BasicType(oop java_class, klassOop* reference_klass = NULL); static BasicType as_BasicType(oop java_class, KlassHandle* reference_klass) { klassOop refk_oop = NULL; diff -r 8187c94a9a87 -r e5928e7dab26 src/share/vm/gc_interface/collectedHeap.cpp --- a/src/share/vm/gc_interface/collectedHeap.cpp Mon Oct 17 11:00:41 2011 -0700 +++ b/src/share/vm/gc_interface/collectedHeap.cpp Mon Oct 17 21:38:29 2011 -0700 @@ -28,6 +28,7 @@ #include "gc_interface/collectedHeap.hpp" #include "gc_interface/collectedHeap.inline.hpp" #include "oops/oop.inline.hpp" +#include "oops/instanceMirrorKlass.hpp" #include "runtime/init.hpp" #include "services/heapDumper.hpp" #ifdef TARGET_OS_FAMILY_linux @@ -436,3 +437,37 @@ inspector.doit(); } } + +oop CollectedHeap::Class_obj_allocate(KlassHandle klass, int size, KlassHandle real_klass, TRAPS) { + debug_only(check_for_valid_allocation_state()); + assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); + assert(size >= 0, "int won't convert to size_t"); + HeapWord* obj; + if (JavaObjectsInPerm) { + obj = common_permanent_mem_allocate_init(size, CHECK_NULL); + } else { + assert(ScavengeRootsInCode > 0, "must be"); + obj = common_mem_allocate_init(size, CHECK_NULL); + } + post_allocation_setup_common(klass, obj, size); + assert(Universe::is_bootstrapping() || + !((oop)obj)->blueprint()->oop_is_array(), "must not be an array"); + NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size)); + oop mirror = (oop)obj; + + java_lang_Class::set_oop_size(mirror, size); + + // Setup indirections + if (!real_klass.is_null()) { + java_lang_Class::set_klass(mirror, real_klass()); + real_klass->set_java_mirror(mirror); + } + + instanceMirrorKlass* mk = instanceMirrorKlass::cast(mirror->klass()); + assert(size == mk->instance_size(real_klass), "should have been set"); + + // notify jvmti and dtrace + post_allocation_notify(klass, (oop)obj); + + return mirror; +} diff -r 8187c94a9a87 -r e5928e7dab26 src/share/vm/gc_interface/collectedHeap.hpp --- a/src/share/vm/gc_interface/collectedHeap.hpp Mon Oct 17 11:00:41 2011 -0700 +++ b/src/share/vm/gc_interface/collectedHeap.hpp Mon Oct 17 21:38:29 2011 -0700 @@ -319,6 +319,9 @@ // VM (then terminate). virtual void preload_and_dump(TRAPS) { ShouldNotReachHere(); } + // Allocate and initialize instances of Class + static oop Class_obj_allocate(KlassHandle klass, int size, KlassHandle real_klass, TRAPS); + // General obj/array allocation facilities. inline static oop obj_allocate(KlassHandle klass, int size, TRAPS); inline static oop array_allocate(KlassHandle klass, int size, int length, TRAPS); diff -r 8187c94a9a87 -r e5928e7dab26 src/share/vm/oops/instanceMirrorKlass.cpp --- a/src/share/vm/oops/instanceMirrorKlass.cpp Mon Oct 17 11:00:41 2011 -0700 +++ b/src/share/vm/oops/instanceMirrorKlass.cpp Mon Oct 17 21:38:29 2011 -0700 @@ -288,15 +288,7 @@ // Query before forming handle. int size = instance_size(k); KlassHandle h_k(THREAD, as_klassOop()); - instanceOop i; - - if (JavaObjectsInPerm) { - i = (instanceOop) CollectedHeap::permanent_obj_allocate(h_k, size, CHECK_NULL); - } else { - assert(ScavengeRootsInCode > 0, "must be"); - i = (instanceOop) CollectedHeap::obj_allocate(h_k, size, CHECK_NULL); - } - + instanceOop i = (instanceOop) CollectedHeap::Class_obj_allocate(h_k, size, k, CHECK_NULL); return i; }