--- a/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp Sun Mar 19 16:40:09 2017 -0400
+++ b/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp Thu Mar 16 16:40:41 2017 -0700
@@ -56,6 +56,31 @@
#include "utilities/resourceHash.hpp"
+void JNIHandleMark::push_jni_handle_block() {
+ JavaThread* thread = JavaThread::current();
+ if (thread != NULL) {
+ // Allocate a new block for JNI handles.
+ // Inlined code from jni_PushLocalFrame()
+ JNIHandleBlock* java_handles = ((JavaThread*)thread)->active_handles();
+ JNIHandleBlock* compile_handles = JNIHandleBlock::allocate_block(thread);
+ assert(compile_handles != NULL && java_handles != NULL, "should not be NULL");
+ compile_handles->set_pop_frame_link(java_handles);
+ thread->set_active_handles(compile_handles);
+ }
+}
+
+void JNIHandleMark::pop_jni_handle_block() {
+ JavaThread* thread = JavaThread::current();
+ if (thread != NULL) {
+ // Release our JNI handle block
+ JNIHandleBlock* compile_handles = thread->active_handles();
+ JNIHandleBlock* java_handles = compile_handles->pop_frame_link();
+ thread->set_active_handles(java_handles);
+ compile_handles->set_pop_frame_link(NULL);
+ JNIHandleBlock::release_block(compile_handles, thread); // may block
+ }
+}
+
// Entry to native method implementation that transitions current thread to '_thread_in_vm'.
#define C2V_VMENTRY(result_type, name, signature) \
JNIEXPORT result_type JNICALL c2v_ ## name signature { \
@@ -89,6 +114,7 @@
return NULL;
}
+
int CompilerToVM::Data::Klass_vtable_start_offset;
int CompilerToVM::Data::Klass_vtable_length_offset;
@@ -987,6 +1013,8 @@
C2V_VMENTRY(jint, installCode, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject installed_code, jobject speculation_log))
ResourceMark rm;
HandleMark hm;
+ JNIHandleMark jni_hm;
+
Handle target_handle(THREAD, JNIHandles::resolve(target));
Handle compiled_code_handle(THREAD, JNIHandles::resolve(compiled_code));
CodeBlob* cb = NULL;