comparison src/share/vm/opto/runtime.cpp @ 12876:8b80b262e501

8005173: assert(false) failed: DEBUG MESSAGE: exception oop must be empty (macroAssembler_x86.cpp:625) Reviewed-by: kvn, iveresov
author twisti
date Fri, 11 Oct 2013 10:14:02 -0700
parents b800986664f4
children 469216acdb28
comparison
equal deleted inserted replaced
12875:d13d7aba8c12 12876:8b80b262e501
974 // the runtime stubs checks this on exit. 974 // the runtime stubs checks this on exit.
975 assert(thread->exception_oop() != NULL, "exception oop is found"); 975 assert(thread->exception_oop() != NULL, "exception oop is found");
976 address handler_address = NULL; 976 address handler_address = NULL;
977 977
978 Handle exception(thread, thread->exception_oop()); 978 Handle exception(thread, thread->exception_oop());
979 address pc = thread->exception_pc();
980
981 // Clear out the exception oop and pc since looking up an
982 // exception handler can cause class loading, which might throw an
983 // exception and those fields are expected to be clear during
984 // normal bytecode execution.
985 thread->clear_exception_oop_and_pc();
979 986
980 if (TraceExceptions) { 987 if (TraceExceptions) {
981 trace_exception(exception(), thread->exception_pc(), ""); 988 trace_exception(exception(), pc, "");
982 } 989 }
990
983 // for AbortVMOnException flag 991 // for AbortVMOnException flag
984 NOT_PRODUCT(Exceptions::debug_check_abort(exception)); 992 NOT_PRODUCT(Exceptions::debug_check_abort(exception));
985 993
986 #ifdef ASSERT 994 #ifdef ASSERT
987 if (!(exception->is_a(SystemDictionary::Throwable_klass()))) { 995 if (!(exception->is_a(SystemDictionary::Throwable_klass()))) {
988 // should throw an exception here 996 // should throw an exception here
989 ShouldNotReachHere(); 997 ShouldNotReachHere();
990 } 998 }
991 #endif 999 #endif
992
993 1000
994 // new exception handling: this method is entered only from adapters 1001 // new exception handling: this method is entered only from adapters
995 // exceptions from compiled java methods are handled in compiled code 1002 // exceptions from compiled java methods are handled in compiled code
996 // using rethrow node 1003 // using rethrow node
997 1004
998 address pc = thread->exception_pc();
999 nm = CodeCache::find_nmethod(pc); 1005 nm = CodeCache::find_nmethod(pc);
1000 assert(nm != NULL, "No NMethod found"); 1006 assert(nm != NULL, "No NMethod found");
1001 if (nm->is_native_method()) { 1007 if (nm->is_native_method()) {
1002 fatal("Native mathod should not have path to exception handling"); 1008 fatal("Native method should not have path to exception handling");
1003 } else { 1009 } else {
1004 // we are switching to old paradigm: search for exception handler in caller_frame 1010 // we are switching to old paradigm: search for exception handler in caller_frame
1005 // instead in exception handler of caller_frame.sender() 1011 // instead in exception handler of caller_frame.sender()
1006 1012
1007 if (JvmtiExport::can_post_on_exceptions()) { 1013 if (JvmtiExport::can_post_on_exceptions()) {
1344 tty->print("%d [Exception (%s): ", trace_exception_counter, msg); 1350 tty->print("%d [Exception (%s): ", trace_exception_counter, msg);
1345 exception_oop->print_value(); 1351 exception_oop->print_value();
1346 tty->print(" in "); 1352 tty->print(" in ");
1347 CodeBlob* blob = CodeCache::find_blob(exception_pc); 1353 CodeBlob* blob = CodeCache::find_blob(exception_pc);
1348 if (blob->is_nmethod()) { 1354 if (blob->is_nmethod()) {
1349 ((nmethod*)blob)->method()->print_value(); 1355 nmethod* nm = blob->as_nmethod_or_null();
1356 nm->method()->print_value();
1350 } else if (blob->is_runtime_stub()) { 1357 } else if (blob->is_runtime_stub()) {
1351 tty->print("<runtime-stub>"); 1358 tty->print("<runtime-stub>");
1352 } else { 1359 } else {
1353 tty->print("<unknown>"); 1360 tty->print("<unknown>");
1354 } 1361 }