src/share/vm/runtime/sharedRuntime.cpp

Print this page

        

*** 657,672 **** --- 657,674 ---- int handler_bci = -1; int scope_depth = 0; if (!force_unwind) { int bci = sd->bci(); + bool recursive_exception = false; do { bool skip_scope_increment = false; // exception handler lookup KlassHandle ek (THREAD, exception->klass()); handler_bci = sd->method()->fast_exception_handler_bci_for(ek, bci, THREAD); if (HAS_PENDING_EXCEPTION) { + recursive_exception = true; // We threw an exception while trying to find the exception handler. // Transfer the new exception to the exception handle which will // be set into thread local storage, and do another lookup for an // exception handler for this exception, this time starting at the // BCI of the exception handler which caused the exception to be
*** 678,695 **** bci = handler_bci; handler_bci = -1; skip_scope_increment = true; } } if (!top_frame_only && handler_bci < 0 && !skip_scope_increment) { sd = sd->sender(); if (sd != NULL) { bci = sd->bci(); } ++scope_depth; } ! } while (!top_frame_only && handler_bci < 0 && sd != NULL); } // found handling method => lookup exception handler int catch_pco = ret_pc - nm->code_begin(); --- 680,700 ---- bci = handler_bci; handler_bci = -1; skip_scope_increment = true; } } + else { + recursive_exception = false; + } if (!top_frame_only && handler_bci < 0 && !skip_scope_increment) { sd = sd->sender(); if (sd != NULL) { bci = sd->bci(); } ++scope_depth; } ! } while (recursive_exception || (!top_frame_only && handler_bci < 0 && sd != NULL)); } // found handling method => lookup exception handler int catch_pco = ret_pc - nm->code_begin();