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();