311 // exception handler can cause class loading, which might throw an |
311 // exception handler can cause class loading, which might throw an |
312 // exception and those fields are expected to be clear during |
312 // exception and those fields are expected to be clear during |
313 // normal bytecode execution. |
313 // normal bytecode execution. |
314 thread->clear_exception_oop_and_pc(); |
314 thread->clear_exception_oop_and_pc(); |
315 |
315 |
316 continuation = SharedRuntime::compute_compiled_exc_handler(cm, pc, exception, false, false); |
316 bool recursive_exception = false; |
|
317 continuation = SharedRuntime::compute_compiled_exc_handler(cm, pc, exception, false, false, recursive_exception); |
317 // If an exception was thrown during exception dispatch, the exception oop may have changed |
318 // If an exception was thrown during exception dispatch, the exception oop may have changed |
318 thread->set_exception_oop(exception()); |
319 thread->set_exception_oop(exception()); |
319 thread->set_exception_pc(pc); |
320 thread->set_exception_pc(pc); |
320 |
321 |
321 // the exception cache is used only by non-implicit exceptions |
322 // the exception cache is used only by non-implicit exceptions |
322 if (continuation != NULL && !SharedRuntime::deopt_blob()->contains(continuation)) { |
323 // Update the exception cache only when there didn't happen |
|
324 // another exception during the computation of the compiled |
|
325 // exception handler. Checking for exception oop equality is not |
|
326 // sufficient because some exceptions are pre-allocated and reused. |
|
327 if (continuation != NULL && !recursive_exception && !SharedRuntime::deopt_blob()->contains(continuation)) { |
323 cm->add_handler_for_exception_and_pc(exception, pc, continuation); |
328 cm->add_handler_for_exception_and_pc(exception, pc, continuation); |
324 } |
329 } |
325 } |
330 } |
326 |
331 |
327 // Set flag if return address is a method handle call site. |
332 // Set flag if return address is a method handle call site. |