1.1 --- a/src/share/vm/prims/whitebox.cpp Fri Feb 28 09:10:55 2014 -0800 1.2 +++ b/src/share/vm/prims/whitebox.cpp Wed Feb 12 12:01:45 2014 -0800 1.3 @@ -316,9 +316,10 @@ 1.4 1.5 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr)) 1.6 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 1.7 + int result = 0; 1.8 + CHECK_JNI_EXCEPTION_(env, result); 1.9 MutexLockerEx mu(Compile_lock); 1.10 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 1.11 - int result = 0; 1.12 nmethod* code; 1.13 if (is_osr) { 1.14 int bci = InvocationEntryBci; 1.15 @@ -344,6 +345,7 @@ 1.16 1.17 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr)) 1.18 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 1.19 + CHECK_JNI_EXCEPTION_(env, JNI_FALSE); 1.20 MutexLockerEx mu(Compile_lock); 1.21 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 1.22 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code(); 1.23 @@ -355,6 +357,7 @@ 1.24 1.25 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr)) 1.26 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 1.27 + CHECK_JNI_EXCEPTION_(env, JNI_FALSE); 1.28 MutexLockerEx mu(Compile_lock); 1.29 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 1.30 if (is_osr) { 1.31 @@ -366,6 +369,7 @@ 1.32 1.33 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method)) 1.34 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 1.35 + CHECK_JNI_EXCEPTION_(env, JNI_FALSE); 1.36 MutexLockerEx mu(Compile_lock); 1.37 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 1.38 return mh->queued_for_compilation(); 1.39 @@ -373,6 +377,7 @@ 1.40 1.41 WB_ENTRY(jint, WB_GetMethodCompilationLevel(JNIEnv* env, jobject o, jobject method, jboolean is_osr)) 1.42 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 1.43 + CHECK_JNI_EXCEPTION_(env, CompLevel_none); 1.44 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 1.45 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code(); 1.46 return (code != NULL ? code->comp_level() : CompLevel_none); 1.47 @@ -380,6 +385,7 @@ 1.48 1.49 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr)) 1.50 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 1.51 + CHECK_JNI_EXCEPTION(env); 1.52 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 1.53 if (is_osr) { 1.54 mh->set_not_osr_compilable(comp_level, true /* report */, "WhiteBox"); 1.55 @@ -390,6 +396,7 @@ 1.56 1.57 WB_ENTRY(jint, WB_GetMethodEntryBci(JNIEnv* env, jobject o, jobject method)) 1.58 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 1.59 + CHECK_JNI_EXCEPTION_(env, InvocationEntryBci); 1.60 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 1.61 nmethod* code = mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false); 1.62 return (code != NULL && code->is_osr_method() ? code->osr_entry_bci() : InvocationEntryBci); 1.63 @@ -397,6 +404,7 @@ 1.64 1.65 WB_ENTRY(jboolean, WB_TestSetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value)) 1.66 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 1.67 + CHECK_JNI_EXCEPTION_(env, JNI_FALSE); 1.68 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 1.69 bool result = mh->dont_inline(); 1.70 mh->set_dont_inline(value == JNI_TRUE); 1.71 @@ -414,6 +422,7 @@ 1.72 1.73 WB_ENTRY(jboolean, WB_TestSetForceInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value)) 1.74 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 1.75 + CHECK_JNI_EXCEPTION_(env, JNI_FALSE); 1.76 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 1.77 bool result = mh->force_inline(); 1.78 mh->set_force_inline(value == JNI_TRUE); 1.79 @@ -422,6 +431,7 @@ 1.80 1.81 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci)) 1.82 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 1.83 + CHECK_JNI_EXCEPTION_(env, JNI_FALSE); 1.84 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 1.85 nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD); 1.86 MutexLockerEx mu(Compile_lock); 1.87 @@ -430,6 +440,7 @@ 1.88 1.89 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method)) 1.90 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 1.91 + CHECK_JNI_EXCEPTION(env); 1.92 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 1.93 MutexLockerEx mu(Compile_lock); 1.94 MethodData* mdo = mh->method_data(); 1.95 @@ -616,14 +627,18 @@ 1.96 bool result = true; 1.97 // one by one registration natives for exception catching 1.98 jclass exceptionKlass = env->FindClass(vmSymbols::java_lang_NoSuchMethodError()->as_C_string()); 1.99 + CHECK_JNI_EXCEPTION(env); 1.100 for (int i = 0, n = sizeof(methods) / sizeof(methods[0]); i < n; ++i) { 1.101 if (env->RegisterNatives(wbclass, methods + i, 1) != 0) { 1.102 result = false; 1.103 - if (env->ExceptionCheck() && env->IsInstanceOf(env->ExceptionOccurred(), exceptionKlass)) { 1.104 - // j.l.NoSuchMethodError is thrown when a method can't be found or a method is not native 1.105 - // ignoring the exception 1.106 - tty->print_cr("Warning: 'NoSuchMethodError' on register of sun.hotspot.WhiteBox::%s%s", methods[i].name, methods[i].signature); 1.107 + jthrowable throwable_obj = env->ExceptionOccurred(); 1.108 + if (throwable_obj != NULL) { 1.109 env->ExceptionClear(); 1.110 + if (env->IsInstanceOf(throwable_obj, exceptionKlass)) { 1.111 + // j.l.NoSuchMethodError is thrown when a method can't be found or a method is not native 1.112 + // ignoring the exception 1.113 + tty->print_cr("Warning: 'NoSuchMethodError' on register of sun.hotspot.WhiteBox::%s%s", methods[i].name, methods[i].signature); 1.114 + } 1.115 } else { 1.116 // register is failed w/o exception or w/ unexpected exception 1.117 tty->print_cr("Warning: unexpected error on register of sun.hotspot.WhiteBox::%s%s. All methods will be unregistered", methods[i].name, methods[i].signature);