| Index: src/isolate.h | 
| diff --git a/src/isolate.h b/src/isolate.h | 
| index 9ef6fc732a9f9f64c22fd4449ce28834a0107083..c0376aeac0bf4a7cf7922daae6603a67265d7f59 100644 | 
| --- a/src/isolate.h | 
| +++ b/src/isolate.h | 
| @@ -78,6 +78,7 @@ typedef void* ExternalReferenceRedirectorPointer(); | 
|  | 
| class Debug; | 
| class Debugger; | 
| +class PromiseOnStack; | 
|  | 
| #if !defined(__arm__) && V8_TARGET_ARCH_ARM || \ | 
| !defined(__aarch64__) && V8_TARGET_ARCH_ARM64 || \ | 
| @@ -240,11 +241,7 @@ class ThreadLocalTop BASE_EMBEDDED { | 
| v8::TryCatch::JSStackComparableAddress(try_catch_handler())); | 
| } | 
|  | 
| -  void Free() { | 
| -    DCHECK(!has_pending_message_); | 
| -    DCHECK(!external_caught_exception_); | 
| -    DCHECK(try_catch_handler_ == NULL); | 
| -  } | 
| +  void Free(); | 
|  | 
| Isolate* isolate_; | 
| // The context where the current execution method is created and for variable | 
| @@ -270,6 +267,11 @@ class ThreadLocalTop BASE_EMBEDDED { | 
| Address c_entry_fp_;  // the frame pointer of the top c entry frame | 
| Address handler_;   // try-blocks are chained through the stack | 
|  | 
| +  // Throwing an exception may cause a Promise rejection.  For this purpose | 
| +  // we keep track of a stack of nested promises and the corresponding | 
| +  // try-catch handlers. | 
| +  PromiseOnStack* promise_on_stack_; | 
| + | 
| #ifdef USE_SIMULATOR | 
| Simulator* simulator_; | 
| #endif | 
| @@ -676,6 +678,11 @@ class Isolate { | 
| // JavaScript code.  If an exception is scheduled true is returned. | 
| bool OptionalRescheduleException(bool is_bottom_call); | 
|  | 
| +  // Push and pop a promise and the current try-catch handler. | 
| +  void PushPromise(Handle<JSObject> promise); | 
| +  void PopPromise(); | 
| +  Handle<Object> GetPromiseOnStackOnThrow(); | 
| + | 
| class ExceptionScope { | 
| public: | 
| explicit ExceptionScope(Isolate* isolate) : | 
| @@ -1349,6 +1356,22 @@ class Isolate { | 
| #undef THREAD_LOCAL_TOP_ACCESSOR | 
|  | 
|  | 
| +class PromiseOnStack { | 
| + public: | 
| +  PromiseOnStack(StackHandler* handler, Handle<JSObject> promise, | 
| +                 PromiseOnStack* prev) | 
| +      : handler_(handler), promise_(promise), prev_(prev) {} | 
| +  StackHandler* handler() { return handler_; } | 
| +  Handle<JSObject> promise() { return promise_; } | 
| +  PromiseOnStack* prev() { return prev_; } | 
| + | 
| + private: | 
| +  StackHandler* handler_; | 
| +  Handle<JSObject> promise_; | 
| +  PromiseOnStack* prev_; | 
| +}; | 
| + | 
| + | 
| // If the GCC version is 4.1.x or 4.2.x an additional field is added to the | 
| // class as a work around for a bug in the generated code found with these | 
| // versions of GCC. See V8 issue 122 for details. | 
|  |