< prev index next >

src/hotspot/share/interpreter/interpreterRuntime.cpp

Print this page

        

*** 72,96 **** #include "utilities/events.hpp" #ifdef COMPILER2 #include "opto/runtime.hpp" #endif - class UnlockFlagSaver { - private: - JavaThread* _thread; - bool _do_not_unlock; - public: - UnlockFlagSaver(JavaThread* t) { - _thread = t; - _do_not_unlock = t->do_not_unlock_if_synchronized(); - t->set_do_not_unlock_if_synchronized(false); - } - ~UnlockFlagSaver() { - _thread->set_do_not_unlock_if_synchronized(_do_not_unlock); - } - }; - // Helper class to access current interpreter state class LastFrameAccessor : public StackObj { frame _last_frame; public: LastFrameAccessor(JavaThread* thread) { --- 72,81 ----
*** 1062,1082 **** return nm; } JRT_ENTRY(nmethod*, InterpreterRuntime::frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp)) // use UnlockFlagSaver to clear and restore the _do_not_unlock_if_synchronized // flag, in case this method triggers classloading which will call into Java. UnlockFlagSaver fs(thread); LastFrameAccessor last_frame(thread); assert(last_frame.is_interpreted_frame(), "must come from interpreter"); methodHandle method(thread, last_frame.method()); const int branch_bci = branch_bcp != NULL ? method->bci_from(branch_bcp) : InvocationEntryBci; const int bci = branch_bcp != NULL ? method->bci_from(last_frame.bcp()) : InvocationEntryBci; - assert(!HAS_PENDING_EXCEPTION, "Should not have any exceptions pending"); nmethod* osr_nm = CompilationPolicy::policy()->event(method, method, branch_bci, bci, CompLevel_none, NULL, thread); assert(!HAS_PENDING_EXCEPTION, "Event handler should not throw any exceptions"); BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod(); if (osr_nm != NULL && bs_nm != NULL) { --- 1047,1069 ---- return nm; } JRT_ENTRY(nmethod*, InterpreterRuntime::frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp)) + if (HAS_PENDING_EXCEPTION) { + return NULL; + } // use UnlockFlagSaver to clear and restore the _do_not_unlock_if_synchronized // flag, in case this method triggers classloading which will call into Java. UnlockFlagSaver fs(thread); LastFrameAccessor last_frame(thread); assert(last_frame.is_interpreted_frame(), "must come from interpreter"); methodHandle method(thread, last_frame.method()); const int branch_bci = branch_bcp != NULL ? method->bci_from(branch_bcp) : InvocationEntryBci; const int bci = branch_bcp != NULL ? method->bci_from(last_frame.bcp()) : InvocationEntryBci; nmethod* osr_nm = CompilationPolicy::policy()->event(method, method, branch_bci, bci, CompLevel_none, NULL, thread); assert(!HAS_PENDING_EXCEPTION, "Event handler should not throw any exceptions"); BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod(); if (osr_nm != NULL && bs_nm != NULL) {
*** 1115,1124 **** --- 1102,1114 ---- if (mdo == NULL) return 0; return mdo->bci_to_di(bci); JRT_END JRT_ENTRY(void, InterpreterRuntime::profile_method(JavaThread* thread)) + if (HAS_PENDING_EXCEPTION) { + return; + } // use UnlockFlagSaver to clear and restore the _do_not_unlock_if_synchronized // flag, in case this method triggers classloading which will call into Java. UnlockFlagSaver fs(thread); assert(ProfileInterpreter, "must be profiling interpreter");
< prev index next >