comparison src/share/vm/prims/whitebox.cpp @ 17704:56cd09c4a5c9

8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending Summary: added JNI exception pending check in several files under src/share/vm/prims directory Reviewed-by: coleenp, minqi
author ccheung
date Wed, 12 Feb 2014 12:01:45 -0800
parents 755c423791ab
children c66479743828 a48e16541e6b
comparison
equal deleted inserted replaced
17703:744553976af5 17704:56cd09c4a5c9
314 VMThread::execute(&op); 314 VMThread::execute(&op);
315 WB_END 315 WB_END
316 316
317 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr)) 317 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
318 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 318 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
319 int result = 0;
320 CHECK_JNI_EXCEPTION_(env, result);
319 MutexLockerEx mu(Compile_lock); 321 MutexLockerEx mu(Compile_lock);
320 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 322 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
321 int result = 0;
322 nmethod* code; 323 nmethod* code;
323 if (is_osr) { 324 if (is_osr) {
324 int bci = InvocationEntryBci; 325 int bci = InvocationEntryBci;
325 while ((code = mh->lookup_osr_nmethod_for(bci, CompLevel_none, false)) != NULL) { 326 while ((code = mh->lookup_osr_nmethod_for(bci, CompLevel_none, false)) != NULL) {
326 code->mark_for_deoptimization(); 327 code->mark_for_deoptimization();
342 return result; 343 return result;
343 WB_END 344 WB_END
344 345
345 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr)) 346 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
346 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 347 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
348 CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
347 MutexLockerEx mu(Compile_lock); 349 MutexLockerEx mu(Compile_lock);
348 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 350 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
349 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code(); 351 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
350 if (code == NULL) { 352 if (code == NULL) {
351 return JNI_FALSE; 353 return JNI_FALSE;
353 return (code->is_alive() && !code->is_marked_for_deoptimization()); 355 return (code->is_alive() && !code->is_marked_for_deoptimization());
354 WB_END 356 WB_END
355 357
356 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr)) 358 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
357 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 359 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
360 CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
358 MutexLockerEx mu(Compile_lock); 361 MutexLockerEx mu(Compile_lock);
359 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 362 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
360 if (is_osr) { 363 if (is_osr) {
361 return CompilationPolicy::can_be_osr_compiled(mh, comp_level); 364 return CompilationPolicy::can_be_osr_compiled(mh, comp_level);
362 } else { 365 } else {
364 } 367 }
365 WB_END 368 WB_END
366 369
367 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method)) 370 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method))
368 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 371 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
372 CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
369 MutexLockerEx mu(Compile_lock); 373 MutexLockerEx mu(Compile_lock);
370 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 374 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
371 return mh->queued_for_compilation(); 375 return mh->queued_for_compilation();
372 WB_END 376 WB_END
373 377
374 WB_ENTRY(jint, WB_GetMethodCompilationLevel(JNIEnv* env, jobject o, jobject method, jboolean is_osr)) 378 WB_ENTRY(jint, WB_GetMethodCompilationLevel(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
375 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 379 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
380 CHECK_JNI_EXCEPTION_(env, CompLevel_none);
376 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 381 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
377 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code(); 382 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
378 return (code != NULL ? code->comp_level() : CompLevel_none); 383 return (code != NULL ? code->comp_level() : CompLevel_none);
379 WB_END 384 WB_END
380 385
381 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr)) 386 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
382 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 387 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
388 CHECK_JNI_EXCEPTION(env);
383 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 389 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
384 if (is_osr) { 390 if (is_osr) {
385 mh->set_not_osr_compilable(comp_level, true /* report */, "WhiteBox"); 391 mh->set_not_osr_compilable(comp_level, true /* report */, "WhiteBox");
386 } else { 392 } else {
387 mh->set_not_compilable(comp_level, true /* report */, "WhiteBox"); 393 mh->set_not_compilable(comp_level, true /* report */, "WhiteBox");
388 } 394 }
389 WB_END 395 WB_END
390 396
391 WB_ENTRY(jint, WB_GetMethodEntryBci(JNIEnv* env, jobject o, jobject method)) 397 WB_ENTRY(jint, WB_GetMethodEntryBci(JNIEnv* env, jobject o, jobject method))
392 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 398 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
399 CHECK_JNI_EXCEPTION_(env, InvocationEntryBci);
393 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 400 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
394 nmethod* code = mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false); 401 nmethod* code = mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false);
395 return (code != NULL && code->is_osr_method() ? code->osr_entry_bci() : InvocationEntryBci); 402 return (code != NULL && code->is_osr_method() ? code->osr_entry_bci() : InvocationEntryBci);
396 WB_END 403 WB_END
397 404
398 WB_ENTRY(jboolean, WB_TestSetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value)) 405 WB_ENTRY(jboolean, WB_TestSetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
399 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 406 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
407 CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
400 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 408 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
401 bool result = mh->dont_inline(); 409 bool result = mh->dont_inline();
402 mh->set_dont_inline(value == JNI_TRUE); 410 mh->set_dont_inline(value == JNI_TRUE);
403 return result; 411 return result;
404 WB_END 412 WB_END
412 } 420 }
413 WB_END 421 WB_END
414 422
415 WB_ENTRY(jboolean, WB_TestSetForceInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value)) 423 WB_ENTRY(jboolean, WB_TestSetForceInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
416 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 424 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
425 CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
417 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 426 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
418 bool result = mh->force_inline(); 427 bool result = mh->force_inline();
419 mh->set_force_inline(value == JNI_TRUE); 428 mh->set_force_inline(value == JNI_TRUE);
420 return result; 429 return result;
421 WB_END 430 WB_END
422 431
423 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci)) 432 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci))
424 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 433 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
434 CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
425 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 435 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
426 nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD); 436 nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD);
427 MutexLockerEx mu(Compile_lock); 437 MutexLockerEx mu(Compile_lock);
428 return (mh->queued_for_compilation() || nm != NULL); 438 return (mh->queued_for_compilation() || nm != NULL);
429 WB_END 439 WB_END
430 440
431 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method)) 441 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method))
432 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 442 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
443 CHECK_JNI_EXCEPTION(env);
433 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 444 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
434 MutexLockerEx mu(Compile_lock); 445 MutexLockerEx mu(Compile_lock);
435 MethodData* mdo = mh->method_data(); 446 MethodData* mdo = mh->method_data();
436 MethodCounters* mcs = mh->method_counters(); 447 MethodCounters* mcs = mh->method_counters();
437 448
614 ResourceMark rm; 625 ResourceMark rm;
615 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 626 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
616 bool result = true; 627 bool result = true;
617 // one by one registration natives for exception catching 628 // one by one registration natives for exception catching
618 jclass exceptionKlass = env->FindClass(vmSymbols::java_lang_NoSuchMethodError()->as_C_string()); 629 jclass exceptionKlass = env->FindClass(vmSymbols::java_lang_NoSuchMethodError()->as_C_string());
630 CHECK_JNI_EXCEPTION(env);
619 for (int i = 0, n = sizeof(methods) / sizeof(methods[0]); i < n; ++i) { 631 for (int i = 0, n = sizeof(methods) / sizeof(methods[0]); i < n; ++i) {
620 if (env->RegisterNatives(wbclass, methods + i, 1) != 0) { 632 if (env->RegisterNatives(wbclass, methods + i, 1) != 0) {
621 result = false; 633 result = false;
622 if (env->ExceptionCheck() && env->IsInstanceOf(env->ExceptionOccurred(), exceptionKlass)) { 634 jthrowable throwable_obj = env->ExceptionOccurred();
623 // j.l.NoSuchMethodError is thrown when a method can't be found or a method is not native 635 if (throwable_obj != NULL) {
624 // ignoring the exception
625 tty->print_cr("Warning: 'NoSuchMethodError' on register of sun.hotspot.WhiteBox::%s%s", methods[i].name, methods[i].signature);
626 env->ExceptionClear(); 636 env->ExceptionClear();
637 if (env->IsInstanceOf(throwable_obj, exceptionKlass)) {
638 // j.l.NoSuchMethodError is thrown when a method can't be found or a method is not native
639 // ignoring the exception
640 tty->print_cr("Warning: 'NoSuchMethodError' on register of sun.hotspot.WhiteBox::%s%s", methods[i].name, methods[i].signature);
641 }
627 } else { 642 } else {
628 // register is failed w/o exception or w/ unexpected exception 643 // register is failed w/o exception or w/ unexpected exception
629 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); 644 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);
630 env->UnregisterNatives(wbclass); 645 env->UnregisterNatives(wbclass);
631 break; 646 break;