8141420: Compiler runtime entries don't hold Klass* from being GCed

Mon, 14 Mar 2016 12:35:48 +0300

author
vlivanov
date
Mon, 14 Mar 2016 12:35:48 +0300
changeset 8419
65a0107d52ed
parent 8338
d025821b6b6d
child 8420
b5c3e9670fa0
child 8427
c3d0bd36ab28

8141420: Compiler runtime entries don't hold Klass* from being GCed
Reviewed-by: kvn, coleenp

src/share/vm/c1/c1_Runtime1.cpp file | annotate | diff | comparison | revisions
src/share/vm/opto/runtime.cpp file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/vm/c1/c1_Runtime1.cpp	Fri Apr 15 14:47:04 2016 +0100
     1.2 +++ b/src/share/vm/c1/c1_Runtime1.cpp	Mon Mar 14 12:35:48 2016 +0300
     1.3 @@ -312,6 +312,7 @@
     1.4    NOT_PRODUCT(_new_instance_slowcase_cnt++;)
     1.5  
     1.6    assert(klass->is_klass(), "not a class");
     1.7 +  Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
     1.8    instanceKlassHandle h(thread, klass);
     1.9    h->check_valid_for_instantiation(true, CHECK);
    1.10    // make sure klass is initialized
    1.11 @@ -347,6 +348,7 @@
    1.12    //       anymore after new_objArray() and no GC can happen before.
    1.13    //       (This may have to change if this code changes!)
    1.14    assert(array_klass->is_klass(), "not a class");
    1.15 +  Handle holder(THREAD, array_klass->klass_holder()); // keep the klass alive
    1.16    Klass* elem_klass = ObjArrayKlass::cast(array_klass)->element_klass();
    1.17    objArrayOop obj = oopFactory::new_objArray(elem_klass, length, CHECK);
    1.18    thread->set_vm_result(obj);
    1.19 @@ -363,6 +365,7 @@
    1.20  
    1.21    assert(klass->is_klass(), "not a class");
    1.22    assert(rank >= 1, "rank must be nonzero");
    1.23 +  Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
    1.24    oop obj = ArrayKlass::cast(klass)->multi_allocate(rank, dims, CHECK);
    1.25    thread->set_vm_result(obj);
    1.26  JRT_END
     2.1 --- a/src/share/vm/opto/runtime.cpp	Fri Apr 15 14:47:04 2016 +0100
     2.2 +++ b/src/share/vm/opto/runtime.cpp	Mon Mar 14 12:35:48 2016 +0300
     2.3 @@ -231,22 +231,17 @@
     2.4  
     2.5    // These checks are cheap to make and support reflective allocation.
     2.6    int lh = klass->layout_helper();
     2.7 -  if (Klass::layout_helper_needs_slow_path(lh)
     2.8 -      || !InstanceKlass::cast(klass)->is_initialized()) {
     2.9 -    KlassHandle kh(THREAD, klass);
    2.10 -    kh->check_valid_for_instantiation(false, THREAD);
    2.11 +  if (Klass::layout_helper_needs_slow_path(lh) || !InstanceKlass::cast(klass)->is_initialized()) {
    2.12 +    Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
    2.13 +    klass->check_valid_for_instantiation(false, THREAD);
    2.14      if (!HAS_PENDING_EXCEPTION) {
    2.15 -      InstanceKlass::cast(kh())->initialize(THREAD);
    2.16 -    }
    2.17 -    if (!HAS_PENDING_EXCEPTION) {
    2.18 -      klass = kh();
    2.19 -    } else {
    2.20 -      klass = NULL;
    2.21 +      InstanceKlass::cast(klass)->initialize(THREAD);
    2.22      }
    2.23    }
    2.24  
    2.25 -  if (klass != NULL) {
    2.26 +  if (!HAS_PENDING_EXCEPTION) {
    2.27      // Scavenge and allocate an instance.
    2.28 +    Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
    2.29      oop result = InstanceKlass::cast(klass)->allocate_instance(THREAD);
    2.30      thread->set_vm_result(result);
    2.31  
    2.32 @@ -286,6 +281,7 @@
    2.33      // Although the oopFactory likes to work with the elem_type,
    2.34      // the compiler prefers the array_type, since it must already have
    2.35      // that latter value in hand for the fast path.
    2.36 +    Handle holder(THREAD, array_type->klass_holder()); // keep the array klass alive
    2.37      Klass* elem_type = ObjArrayKlass::cast(array_type)->element_klass();
    2.38      result = oopFactory::new_objArray(elem_type, len, THREAD);
    2.39    }
    2.40 @@ -364,6 +360,7 @@
    2.41    jint dims[2];
    2.42    dims[0] = len1;
    2.43    dims[1] = len2;
    2.44 +  Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive
    2.45    oop obj = ArrayKlass::cast(elem_type)->multi_allocate(2, dims, THREAD);
    2.46    deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
    2.47    thread->set_vm_result(obj);
    2.48 @@ -380,6 +377,7 @@
    2.49    dims[0] = len1;
    2.50    dims[1] = len2;
    2.51    dims[2] = len3;
    2.52 +  Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive
    2.53    oop obj = ArrayKlass::cast(elem_type)->multi_allocate(3, dims, THREAD);
    2.54    deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
    2.55    thread->set_vm_result(obj);
    2.56 @@ -397,6 +395,7 @@
    2.57    dims[1] = len2;
    2.58    dims[2] = len3;
    2.59    dims[3] = len4;
    2.60 +  Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive
    2.61    oop obj = ArrayKlass::cast(elem_type)->multi_allocate(4, dims, THREAD);
    2.62    deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
    2.63    thread->set_vm_result(obj);
    2.64 @@ -415,6 +414,7 @@
    2.65    dims[2] = len3;
    2.66    dims[3] = len4;
    2.67    dims[4] = len5;
    2.68 +  Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive
    2.69    oop obj = ArrayKlass::cast(elem_type)->multi_allocate(5, dims, THREAD);
    2.70    deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
    2.71    thread->set_vm_result(obj);
    2.72 @@ -432,6 +432,7 @@
    2.73    jint *c_dims = NEW_RESOURCE_ARRAY(jint, len);
    2.74    Copy::conjoint_jints_atomic(j_dims, c_dims, len);
    2.75  
    2.76 +  Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive
    2.77    oop obj = ArrayKlass::cast(elem_type)->multi_allocate(len, c_dims, THREAD);
    2.78    deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
    2.79    thread->set_vm_result(obj);

mercurial