| Index: src/top.h
|
| ===================================================================
|
| --- src/top.h (revision 570)
|
| +++ src/top.h (working copy)
|
| @@ -53,7 +53,9 @@
|
| bool external_caught_exception_;
|
| v8::TryCatch* try_catch_handler_;
|
| SaveContext* save_context_;
|
| - v8::TryCatch* catcher_;
|
| + // Flag indicating that the try_catch_handler_ contains an exception to be
|
| + // caught.
|
| + bool pending_external_caught_exception_;
|
|
|
| // Stack.
|
| Address c_entry_fp_; // the frame pointer of the top c entry frame
|
| @@ -144,10 +146,20 @@
|
| thread_local_.scheduled_exception_ = Heap::the_hole_value();
|
| }
|
|
|
| - static void setup_external_caught() {
|
| - thread_local_.external_caught_exception_ =
|
| - (thread_local_.catcher_ != NULL) &&
|
| - (Top::thread_local_.try_catch_handler_ == Top::thread_local_.catcher_);
|
| + // Propagate the external caught exception flag. If there is no external
|
| + // caught exception always clear the TryCatch handler as it might contain
|
| + // an exception object from a throw which was bypassed by a finally block
|
| + // doing an explicit return/break/continue.
|
| + static void propagate_external_caught() {
|
| + if (has_pending_exception()) {
|
| + thread_local_.external_caught_exception_ =
|
| + thread_local_.pending_external_caught_exception_;
|
| + } else {
|
| + if (thread_local_.try_catch_handler_ != NULL) {
|
| + thread_local_.try_catch_handler_->Reset();
|
| + }
|
| + }
|
| + thread_local_.pending_external_caught_exception_ = false;
|
| }
|
|
|
| // Tells whether the current context has experienced an out of memory
|
|
|