913 if (nm->is_deopt_pc(pc)) { 914 deopting = true; 915 RegisterMap map(thread, false); 916 frame deoptee = thread->last_frame().sender(&map); 917 assert(deoptee.is_deoptimized_frame(), "must be deopted"); 918 // Adjust the pc back to the original throwing pc 919 pc = deoptee.pc(); 920 } 921 922 // If we are forcing an unwind because of stack overflow then deopt is 923 // irrelevant sice we are throwing the frame away anyway. 924 925 if (deopting && !force_unwind) { 926 handler_address = SharedRuntime::deopt_blob()->unpack_with_exception(); 927 } else { 928 929 handler_address = 930 force_unwind ? NULL : nm->handler_for_exception_and_pc(exception, pc); 931 932 if (handler_address == NULL) { 933 handler_address = SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, force_unwind, true); 934 assert (handler_address != NULL, "must have compiled handler"); 935 // Update the exception cache only when the unwind was not forced. 936 if (!force_unwind) { 937 nm->add_handler_for_exception_and_pc(exception,pc,handler_address); 938 } 939 } else { 940 assert(handler_address == SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, force_unwind, true), "Must be the same"); 941 } 942 } 943 944 thread->set_exception_pc(pc); 945 thread->set_exception_handler_pc(handler_address); 946 thread->set_exception_stack_size(0); 947 948 // Check if the exception PC is a MethodHandle call site. 949 thread->set_is_method_handle_return(nm->is_method_handle_return(pc)); 950 } 951 952 // Restore correct return pc. Was saved above. 953 thread->set_exception_oop(exception()); 954 return handler_address; 955 956 JRT_END | 913 if (nm->is_deopt_pc(pc)) { 914 deopting = true; 915 RegisterMap map(thread, false); 916 frame deoptee = thread->last_frame().sender(&map); 917 assert(deoptee.is_deoptimized_frame(), "must be deopted"); 918 // Adjust the pc back to the original throwing pc 919 pc = deoptee.pc(); 920 } 921 922 // If we are forcing an unwind because of stack overflow then deopt is 923 // irrelevant sice we are throwing the frame away anyway. 924 925 if (deopting && !force_unwind) { 926 handler_address = SharedRuntime::deopt_blob()->unpack_with_exception(); 927 } else { 928 929 handler_address = 930 force_unwind ? NULL : nm->handler_for_exception_and_pc(exception, pc); 931 932 if (handler_address == NULL) { 933 Handle original_exception(thread, exception()); 934 handler_address = SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, force_unwind, true); 935 assert (handler_address != NULL, "must have compiled handler"); 936 // Update the exception cache only when the unwind was not forced 937 // and there didn't happen another exception during the computation of the 938 // compiled exception handler. 939 if (!force_unwind && original_exception() == exception()) { 940 nm->add_handler_for_exception_and_pc(exception,pc,handler_address); 941 } 942 } else { 943 assert(handler_address == SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, force_unwind, true), "Must be the same"); 944 } 945 } 946 947 thread->set_exception_pc(pc); 948 thread->set_exception_handler_pc(handler_address); 949 thread->set_exception_stack_size(0); 950 951 // Check if the exception PC is a MethodHandle call site. 952 thread->set_is_method_handle_return(nm->is_method_handle_return(pc)); 953 } 954 955 // Restore correct return pc. Was saved above. 956 thread->set_exception_oop(exception()); 957 return handler_address; 958 959 JRT_END |