1.1 --- a/src/share/vm/gc_interface/collectedHeap.cpp Mon Oct 17 11:00:41 2011 -0700 1.2 +++ b/src/share/vm/gc_interface/collectedHeap.cpp Mon Oct 17 21:38:29 2011 -0700 1.3 @@ -28,6 +28,7 @@ 1.4 #include "gc_interface/collectedHeap.hpp" 1.5 #include "gc_interface/collectedHeap.inline.hpp" 1.6 #include "oops/oop.inline.hpp" 1.7 +#include "oops/instanceMirrorKlass.hpp" 1.8 #include "runtime/init.hpp" 1.9 #include "services/heapDumper.hpp" 1.10 #ifdef TARGET_OS_FAMILY_linux 1.11 @@ -436,3 +437,37 @@ 1.12 inspector.doit(); 1.13 } 1.14 } 1.15 + 1.16 +oop CollectedHeap::Class_obj_allocate(KlassHandle klass, int size, KlassHandle real_klass, TRAPS) { 1.17 + debug_only(check_for_valid_allocation_state()); 1.18 + assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); 1.19 + assert(size >= 0, "int won't convert to size_t"); 1.20 + HeapWord* obj; 1.21 + if (JavaObjectsInPerm) { 1.22 + obj = common_permanent_mem_allocate_init(size, CHECK_NULL); 1.23 + } else { 1.24 + assert(ScavengeRootsInCode > 0, "must be"); 1.25 + obj = common_mem_allocate_init(size, CHECK_NULL); 1.26 + } 1.27 + post_allocation_setup_common(klass, obj, size); 1.28 + assert(Universe::is_bootstrapping() || 1.29 + !((oop)obj)->blueprint()->oop_is_array(), "must not be an array"); 1.30 + NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size)); 1.31 + oop mirror = (oop)obj; 1.32 + 1.33 + java_lang_Class::set_oop_size(mirror, size); 1.34 + 1.35 + // Setup indirections 1.36 + if (!real_klass.is_null()) { 1.37 + java_lang_Class::set_klass(mirror, real_klass()); 1.38 + real_klass->set_java_mirror(mirror); 1.39 + } 1.40 + 1.41 + instanceMirrorKlass* mk = instanceMirrorKlass::cast(mirror->klass()); 1.42 + assert(size == mk->instance_size(real_klass), "should have been set"); 1.43 + 1.44 + // notify jvmti and dtrace 1.45 + post_allocation_notify(klass, (oop)obj); 1.46 + 1.47 + return mirror; 1.48 +}