changeset 2101:183658a2d0b3

7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes Summary: 6912621 used a raw oop in the newly added assert following an allocation attempt that could result in a GC. Reviewed-by: jmasa
author ysr
date Thu, 10 Feb 2011 14:48:07 -0800
parents 59e20a452a2a
children 55cc33cf55bc
files src/share/vm/oops/constantPoolKlass.cpp
diffstat 1 files changed, 19 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/oops/constantPoolKlass.cpp	Wed Feb 09 09:43:02 2011 -0800
+++ b/src/share/vm/oops/constantPoolKlass.cpp	Thu Feb 10 14:48:07 2011 -0800
@@ -55,32 +55,35 @@
 constantPoolOop constantPoolKlass::allocate(int length, bool is_conc_safe, TRAPS) {
   int size = constantPoolOopDesc::object_size(length);
   KlassHandle klass (THREAD, as_klassOop());
-  constantPoolOop c =
-    (constantPoolOop)CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL);
+  assert(klass()->is_oop(), "Can't be null, else handlizing of c below won't work");
+  constantPoolHandle pool;
+  {
+    constantPoolOop c =
+      (constantPoolOop)CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL);
+    assert(c->klass_or_null() != NULL, "Handlizing below won't work");
+    pool = constantPoolHandle(THREAD, c);
+  }
 
-  c->set_length(length);
-  c->set_tags(NULL);
-  c->set_cache(NULL);
-  c->set_operands(NULL);
-  c->set_pool_holder(NULL);
-  c->set_flags(0);
+  pool->set_length(length);
+  pool->set_tags(NULL);
+  pool->set_cache(NULL);
+  pool->set_operands(NULL);
+  pool->set_pool_holder(NULL);
+  pool->set_flags(0);
   // only set to non-zero if constant pool is merged by RedefineClasses
-  c->set_orig_length(0);
+  pool->set_orig_length(0);
   // if constant pool may change during RedefineClasses, it is created
   // unsafe for GC concurrent processing.
-  c->set_is_conc_safe(is_conc_safe);
+  pool->set_is_conc_safe(is_conc_safe);
   // all fields are initialized; needed for GC
 
   // Note: because we may be in this "conc_unsafe" state when allocating
   // t_oop below, which may in turn cause a GC, it is imperative that our
   // size be correct, consistent and henceforth stable, at this stage.
-  assert(c->is_parsable(), "Else size() below is unreliable");
-  DEBUG_ONLY(int sz = c->size();)
+  assert(pool->is_oop() && pool->is_parsable(), "Else size() below is unreliable");
+  assert(size == pool->size(), "size() is wrong");
 
   // initialize tag array
-  // Note: cannot introduce constant pool handle before since it is not
-  //       completely initialized (no class) -> would cause assertion failure
-  constantPoolHandle pool (THREAD, c);
   typeArrayOop t_oop = oopFactory::new_permanent_byteArray(length, CHECK_NULL);
   typeArrayHandle tags (THREAD, t_oop);
   for (int index = 0; index < length; index++) {
@@ -89,7 +92,7 @@
   pool->set_tags(tags());
 
   // Check that our size was stable at its old value.
-  assert(sz == c->size(), "size() changed");
+  assert(size == pool->size(), "size() changed");
   return pool();
 }