637 JRT_END |
637 JRT_END |
638 |
638 |
639 // ret_pc points into caller; we are returning caller's exception handler |
639 // ret_pc points into caller; we are returning caller's exception handler |
640 // for given exception |
640 // for given exception |
641 address SharedRuntime::compute_compiled_exc_handler(nmethod* nm, address ret_pc, Handle& exception, |
641 address SharedRuntime::compute_compiled_exc_handler(nmethod* nm, address ret_pc, Handle& exception, |
642 bool force_unwind, bool top_frame_only) { |
642 bool force_unwind, bool top_frame_only, bool& recursive_exception_occurred) { |
643 assert(nm != NULL, "must exist"); |
643 assert(nm != NULL, "must exist"); |
644 ResourceMark rm; |
644 ResourceMark rm; |
645 |
645 |
646 ScopeDesc* sd = nm->scope_desc_at(ret_pc); |
646 ScopeDesc* sd = nm->scope_desc_at(ret_pc); |
647 // determine handler bci, if any |
647 // determine handler bci, if any |
665 // be set into thread local storage, and do another lookup for an |
665 // be set into thread local storage, and do another lookup for an |
666 // exception handler for this exception, this time starting at the |
666 // exception handler for this exception, this time starting at the |
667 // BCI of the exception handler which caused the exception to be |
667 // BCI of the exception handler which caused the exception to be |
668 // thrown (bugs 4307310 and 4546590). Set "exception" reference |
668 // thrown (bugs 4307310 and 4546590). Set "exception" reference |
669 // argument to ensure that the correct exception is thrown (4870175). |
669 // argument to ensure that the correct exception is thrown (4870175). |
|
670 recursive_exception_occurred = true; |
670 exception = Handle(THREAD, PENDING_EXCEPTION); |
671 exception = Handle(THREAD, PENDING_EXCEPTION); |
671 CLEAR_PENDING_EXCEPTION; |
672 CLEAR_PENDING_EXCEPTION; |
672 if (handler_bci >= 0) { |
673 if (handler_bci >= 0) { |
673 bci = handler_bci; |
674 bci = handler_bci; |
674 handler_bci = -1; |
675 handler_bci = -1; |