| Index: src/top.h
|
| diff --git a/src/top.h b/src/top.h
|
| index 5b0fd6157cbd4da5c822e1442ea47824a4eecf85..74b6229e84b1dc2ea0a624083316bc4353e77daa 100644
|
| --- a/src/top.h
|
| +++ b/src/top.h
|
| @@ -186,22 +186,26 @@ class Top {
|
| ASSERT(has_pending_exception());
|
| return thread_local_.pending_exception_;
|
| }
|
| - static bool external_caught_exception() {
|
| - return thread_local_.external_caught_exception_;
|
| - }
|
| static void set_pending_exception(MaybeObject* exception) {
|
| thread_local_.pending_exception_ = exception;
|
| }
|
| static void clear_pending_exception() {
|
| thread_local_.pending_exception_ = Heap::the_hole_value();
|
| }
|
| -
|
| static MaybeObject** pending_exception_address() {
|
| return &thread_local_.pending_exception_;
|
| }
|
| static bool has_pending_exception() {
|
| return !thread_local_.pending_exception_->IsTheHole();
|
| }
|
| +
|
| + static bool external_caught_exception() {
|
| + return thread_local_.external_caught_exception_;
|
| + }
|
| + static void set_external_caught_exception(bool value) {
|
| + thread_local_.external_caught_exception_ = value;
|
| + }
|
| +
|
| static void clear_pending_message() {
|
| thread_local_.has_pending_message_ = false;
|
| thread_local_.pending_message_ = NULL;
|
| @@ -240,13 +244,6 @@ class Top {
|
| thread_local_.scheduled_exception_ = Heap::the_hole_value();
|
| }
|
|
|
| - static void setup_external_caught() {
|
| - thread_local_.external_caught_exception_ =
|
| - has_pending_exception() &&
|
| - (thread_local_.catcher_ != NULL) &&
|
| - (try_catch_handler() == thread_local_.catcher_);
|
| - }
|
| -
|
| static void SetCaptureStackTraceForUncaughtExceptions(
|
| bool capture,
|
| int frame_limit,
|
| @@ -452,6 +449,25 @@ class Top {
|
| static const char* kStackOverflowMessage;
|
|
|
| private:
|
| +
|
| + static v8::TryCatch* catcher() {
|
| + return thread_local_.catcher_;
|
| + }
|
| +
|
| + static void set_catcher(v8::TryCatch* catcher) {
|
| + thread_local_.catcher_ = catcher;
|
| + }
|
| +
|
| + static void setup_external_caught() {
|
| + thread_local_.external_caught_exception_ =
|
| + has_pending_exception() &&
|
| + (thread_local_.catcher_ != NULL) &&
|
| + (try_catch_handler() == thread_local_.catcher_);
|
| + }
|
| +
|
| + // Attempts to propagate the pending exception to the proper v8::TryCatch.
|
| + static void PropagatePendingExceptionToExternalTryCatch();
|
| +
|
| #ifdef ENABLE_VMSTATE_TRACKING
|
| // Set of states used when communicating with the runtime profiler.
|
| //
|
| @@ -516,6 +532,29 @@ class Top {
|
| friend class ThreadLocalTop;
|
|
|
| static void FillCache();
|
| +
|
| + public:
|
| + class ExceptionScope {
|
| + public:
|
| + ExceptionScope() :
|
| + // Scope currently can only be used for regular exceptions, not
|
| + // failures like OOM or termination exception.
|
| + pending_exception_(Top::pending_exception()->ToObjectUnchecked()),
|
| + external_caught_exception_(Top::external_caught_exception()),
|
| + catcher_(Top::catcher())
|
| + { }
|
| +
|
| + ~ExceptionScope() {
|
| + Top::set_catcher(catcher_);
|
| + Top::set_external_caught_exception(external_caught_exception);
|
| + Top::set_pending_exception(*pending_exception_);
|
| + }
|
| +
|
| + private:
|
| + Handle<Object> pending_exception_;
|
| + bool external_caught_exception_;
|
| + v8::TryCatch* catcher_;
|
| + };
|
| };
|
|
|
|
|
|
|