< prev index next >

src/share/vm/gc/shared/collectedHeap.inline.hpp

Print this page
rev 11484 : [mq]: webrev.02

@@ -94,10 +94,26 @@
          !((oop)obj)->is_array(), "must not be an array");
   // notify jvmti and dtrace
   post_allocation_notify(klass, (oop)obj, size);
 }
 
+void CollectedHeap::post_allocation_setup_class(KlassHandle klass,
+                                                HeapWord* obj,
+                                                int size,
+                                                int size_field_offset) {
+  post_allocation_setup_no_klass_install(klass, obj);
+
+  // set the j.l.Class instance's oop_size field BEFORE setting the header:
+  ((oop)obj)->int_field_put(size_field_offset, size);
+
+  post_allocation_install_obj_klass(klass, oop(obj)); // set the header
+  assert(Universe::is_bootstrapping() ||
+         !((oop)obj)->is_array(), "must not be an array");
+  // notify jvmti and dtrace
+  post_allocation_notify(klass, (oop)obj, size);
+}
+
 void CollectedHeap::post_allocation_setup_array(KlassHandle klass,
                                                 HeapWord* obj,
                                                 int length) {
   // Set array length before setting the _klass field
   // in post_allocation_setup_common() because the klass field

@@ -205,10 +221,22 @@
   post_allocation_setup_obj(klass, obj, size);
   NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
   return (oop)obj;
 }
 
+// Instances of j.l.Class have an oop_size field that must be set before the 
+// the header is set in order to parse the instances's size correctly.
+oop CollectedHeap::class_allocate(KlassHandle klass, int size, int size_field_offset, 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 = common_mem_allocate_init(klass, size, CHECK_NULL);
+  post_allocation_setup_class(klass, obj, size, size_field_offset); // set oop_size
+  NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
+  return (oop)obj;
+}
+
 oop CollectedHeap::array_allocate(KlassHandle klass,
                                   int size,
                                   int length,
                                   TRAPS) {
   debug_only(check_for_valid_allocation_state());
< prev index next >