| Index: src/isolate.cc
 | 
| diff --git a/src/isolate.cc b/src/isolate.cc
 | 
| index dc5b5368f6e4d383a0b9d0d819234d975af83567..a0ea93033b8125d5e7579d8d4d793d65bd7b30a5 100644
 | 
| --- a/src/isolate.cc
 | 
| +++ b/src/isolate.cc
 | 
| @@ -1067,7 +1067,7 @@ Object* Isolate::UnwindAndFindHandler() {
 | 
|      if (frame->is_optimized() && catchable_by_js) {
 | 
|        OptimizedFrame* js_frame = static_cast<OptimizedFrame*>(frame);
 | 
|        int stack_slots = 0;  // Will contain stack slot count of frame.
 | 
| -      offset = js_frame->LookupExceptionHandlerInTable(&stack_slots);
 | 
| +      offset = js_frame->LookupExceptionHandlerInTable(&stack_slots, NULL);
 | 
|        if (offset >= 0) {
 | 
|          // Compute the stack pointer from the frame pointer. This ensures that
 | 
|          // argument slots on the stack are dropped as returning would.
 | 
| @@ -1087,7 +1087,7 @@ Object* Isolate::UnwindAndFindHandler() {
 | 
|      if (frame->is_java_script() && catchable_by_js) {
 | 
|        JavaScriptFrame* js_frame = static_cast<JavaScriptFrame*>(frame);
 | 
|        int stack_slots = 0;  // Will contain operand stack depth of handler.
 | 
| -      offset = js_frame->LookupExceptionHandlerInTable(&stack_slots);
 | 
| +      offset = js_frame->LookupExceptionHandlerInTable(&stack_slots, NULL);
 | 
|        if (offset >= 0) {
 | 
|          // Compute the stack pointer from the frame pointer. This ensures that
 | 
|          // operand stack slots are dropped for nested statements. Also restore
 | 
| @@ -1143,8 +1143,12 @@ Isolate::CatchType Isolate::PredictExceptionCatcher() {
 | 
|      if (frame->is_java_script()) {
 | 
|        JavaScriptFrame* js_frame = static_cast<JavaScriptFrame*>(frame);
 | 
|        int stack_slots = 0;  // The computed stack slot count is not used.
 | 
| -      if (js_frame->LookupExceptionHandlerInTable(&stack_slots) > 0) {
 | 
| -        return CAUGHT_BY_JAVASCRIPT;
 | 
| +      HandlerTable::CatchPrediction prediction;
 | 
| +      if (js_frame->LookupExceptionHandlerInTable(&stack_slots, &prediction) >
 | 
| +          0) {
 | 
| +        // We are conservative with our prediction: try-finally is considered
 | 
| +        // to always rethrow, to meet the expectation of the debugger.
 | 
| +        if (prediction == HandlerTable::CAUGHT) return CAUGHT_BY_JAVASCRIPT;
 | 
|        }
 | 
|      }
 | 
|  
 | 
| @@ -1573,7 +1577,7 @@ Handle<Object> Isolate::GetPromiseOnStackOnThrow() {
 | 
|    for (JavaScriptFrameIterator it(this); !it.done(); it.Advance()) {
 | 
|      JavaScriptFrame* frame = it.frame();
 | 
|      int stack_slots = 0;  // The computed stack slot count is not used.
 | 
| -    if (frame->LookupExceptionHandlerInTable(&stack_slots) > 0) {
 | 
| +    if (frame->LookupExceptionHandlerInTable(&stack_slots, NULL) > 0) {
 | 
|        // Throwing inside a Promise only leads to a reject if not caught by an
 | 
|        // inner try-catch or try-finally.
 | 
|        if (frame->function() == *promise_function) {
 | 
| 
 |