8141420: Compiler runtime entries don't hold Klass* from being GCed
Reviewed-by: kvn, coleenp
--- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp Mon Mar 14 12:35:48 2016 +0300
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp Mon Mar 14 12:35:48 2016 +0300
@@ -335,6 +335,7 @@
NOT_PRODUCT(_new_instance_slowcase_cnt++;)
assert(klass->is_klass(), "not a class");
+ Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
instanceKlassHandle h(thread, klass);
h->check_valid_for_instantiation(true, CHECK);
// make sure klass is initialized
@@ -370,6 +371,7 @@
// anymore after new_objArray() and no GC can happen before.
// (This may have to change if this code changes!)
assert(array_klass->is_klass(), "not a class");
+ Handle holder(THREAD, array_klass->klass_holder()); // keep the klass alive
Klass* elem_klass = ObjArrayKlass::cast(array_klass)->element_klass();
objArrayOop obj = oopFactory::new_objArray(elem_klass, length, CHECK);
thread->set_vm_result(obj);
@@ -386,6 +388,7 @@
assert(klass->is_klass(), "not a class");
assert(rank >= 1, "rank must be nonzero");
+ Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
oop obj = ArrayKlass::cast(klass)->multi_allocate(rank, dims, CHECK);
thread->set_vm_result(obj);
JRT_END
--- a/hotspot/src/share/vm/jvmci/jvmciRuntime.cpp Mon Mar 14 12:35:48 2016 +0300
+++ b/hotspot/src/share/vm/jvmci/jvmciRuntime.cpp Mon Mar 14 12:35:48 2016 +0300
@@ -103,6 +103,7 @@
JRT_BLOCK_ENTRY(void, JVMCIRuntime::new_instance(JavaThread* thread, Klass* klass))
JRT_BLOCK;
assert(klass->is_klass(), "not a class");
+ Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
instanceKlassHandle h(thread, klass);
h->check_valid_for_instantiation(true, CHECK);
// make sure klass is initialized
@@ -128,6 +129,7 @@
BasicType elt_type = TypeArrayKlass::cast(array_klass)->element_type();
obj = oopFactory::new_typeArray(elt_type, length, CHECK);
} else {
+ Handle holder(THREAD, array_klass->klass_holder()); // keep the klass alive
Klass* elem_klass = ObjArrayKlass::cast(array_klass)->element_klass();
obj = oopFactory::new_objArray(elem_klass, length, CHECK);
}
@@ -171,6 +173,7 @@
JRT_ENTRY(void, JVMCIRuntime::new_multi_array(JavaThread* thread, Klass* klass, int rank, jint* dims))
assert(klass->is_klass(), "not a class");
assert(rank >= 1, "rank must be nonzero");
+ Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
oop obj = ArrayKlass::cast(klass)->multi_allocate(rank, dims, CHECK);
thread->set_vm_result(obj);
JRT_END
--- a/hotspot/src/share/vm/opto/runtime.cpp Mon Mar 14 12:35:48 2016 +0300
+++ b/hotspot/src/share/vm/opto/runtime.cpp Mon Mar 14 12:35:48 2016 +0300
@@ -220,22 +220,17 @@
// These checks are cheap to make and support reflective allocation.
int lh = klass->layout_helper();
- if (Klass::layout_helper_needs_slow_path(lh)
- || !InstanceKlass::cast(klass)->is_initialized()) {
- KlassHandle kh(THREAD, klass);
- kh->check_valid_for_instantiation(false, THREAD);
+ if (Klass::layout_helper_needs_slow_path(lh) || !InstanceKlass::cast(klass)->is_initialized()) {
+ Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
+ klass->check_valid_for_instantiation(false, THREAD);
if (!HAS_PENDING_EXCEPTION) {
- InstanceKlass::cast(kh())->initialize(THREAD);
- }
- if (!HAS_PENDING_EXCEPTION) {
- klass = kh();
- } else {
- klass = NULL;
+ InstanceKlass::cast(klass)->initialize(THREAD);
}
}
- if (klass != NULL) {
+ if (!HAS_PENDING_EXCEPTION) {
// Scavenge and allocate an instance.
+ Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
oop result = InstanceKlass::cast(klass)->allocate_instance(THREAD);
thread->set_vm_result(result);
@@ -275,6 +270,7 @@
// Although the oopFactory likes to work with the elem_type,
// the compiler prefers the array_type, since it must already have
// that latter value in hand for the fast path.
+ Handle holder(THREAD, array_type->klass_holder()); // keep the array klass alive
Klass* elem_type = ObjArrayKlass::cast(array_type)->element_klass();
result = oopFactory::new_objArray(elem_type, len, THREAD);
}
@@ -353,6 +349,7 @@
jint dims[2];
dims[0] = len1;
dims[1] = len2;
+ Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive
oop obj = ArrayKlass::cast(elem_type)->multi_allocate(2, dims, THREAD);
deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
thread->set_vm_result(obj);
@@ -369,6 +366,7 @@
dims[0] = len1;
dims[1] = len2;
dims[2] = len3;
+ Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive
oop obj = ArrayKlass::cast(elem_type)->multi_allocate(3, dims, THREAD);
deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
thread->set_vm_result(obj);
@@ -386,6 +384,7 @@
dims[1] = len2;
dims[2] = len3;
dims[3] = len4;
+ Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive
oop obj = ArrayKlass::cast(elem_type)->multi_allocate(4, dims, THREAD);
deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
thread->set_vm_result(obj);
@@ -404,6 +403,7 @@
dims[2] = len3;
dims[3] = len4;
dims[4] = len5;
+ Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive
oop obj = ArrayKlass::cast(elem_type)->multi_allocate(5, dims, THREAD);
deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
thread->set_vm_result(obj);
@@ -421,6 +421,7 @@
jint *c_dims = NEW_RESOURCE_ARRAY(jint, len);
Copy::conjoint_jints_atomic(j_dims, c_dims, len);
+ Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive
oop obj = ArrayKlass::cast(elem_type)->multi_allocate(len, c_dims, THREAD);
deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
thread->set_vm_result(obj);