src/share/vm/gc_interface/collectedHeap.cpp

changeset 3205
e5928e7dab26
parent 3156
f08d439fab8c
child 3335
3c648b9ad052
     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 +}

mercurial