From: ager@chromium.org Date: Tue, 28 Oct 2008 07:30:10 +0000 (+0000) Subject: Revert revision 593. This was a cleanup change but it caused layout X-Git-Tag: upstream/4.7.83~25101 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8813d15d186cdc94f7fbd6c5e99b9494398cee48;p=platform%2Fupstream%2Fv8.git Revert revision 593. This was a cleanup change but it caused layout test regressions. Review URL: http://codereview.chromium.org/8827 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@615 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/execution.cc b/src/execution.cc index 03541a8f3..0598ad718 100644 --- a/src/execution.cc +++ b/src/execution.cc @@ -91,10 +91,12 @@ static Handle Invoke(bool construct, value->Verify(); #endif - // Update the pending exception and external caught flag and return the value. + // Update the pending exception flag and return the value. *has_pending_exception = value->IsException(); ASSERT(*has_pending_exception == Top::has_pending_exception()); - Top::propagate_external_caught(); + if (*has_pending_exception) { + Top::setup_external_caught(); + } // If the pending exception is OutOfMemoryException set out_of_memory in // the global context. Note: We have to mark the global context here diff --git a/src/top.cc b/src/top.cc index 8df808e56..a78ba32b5 100644 --- a/src/top.cc +++ b/src/top.cc @@ -101,7 +101,7 @@ void Top::InitializeThreadLocal() { clear_pending_exception(); clear_scheduled_exception(); thread_local_.save_context_ = NULL; - thread_local_.pending_external_caught_exception_ = false; + thread_local_.catcher_ = NULL; } @@ -607,7 +607,7 @@ Failure* Top::Throw(Object* exception, MessageLocation* location) { Failure* Top::ReThrow(Object* exception, MessageLocation* location) { - // Set the exception being re-thrown. + // Set the exception beeing re-thrown. set_pending_exception(exception); return Failure::Exception(); } @@ -789,8 +789,9 @@ void Top::DoThrow(Object* exception, // If the exception is caught externally, we store it in the // try/catch handler. The C code can find it later and process it if // necessary. - thread_local_.pending_external_caught_exception_ = is_caught_externally; + thread_local_.catcher_ = NULL; if (is_caught_externally) { + thread_local_.catcher_ = thread_local_.try_catch_handler_; thread_local_.try_catch_handler_->exception_ = reinterpret_cast(*exception_handle); if (!message_obj.is_null()) { diff --git a/src/top.h b/src/top.h index 69fb7fa6c..866487c83 100644 --- a/src/top.h +++ b/src/top.h @@ -53,9 +53,7 @@ class ThreadLocalTop BASE_EMBEDDED { bool external_caught_exception_; v8::TryCatch* try_catch_handler_; SaveContext* save_context_; - // Flag indicating that the try_catch_handler_ contains an exception to be - // caught. - bool pending_external_caught_exception_; + v8::TryCatch* catcher_; // Stack. Address c_entry_fp_; // the frame pointer of the top c entry frame @@ -146,16 +144,10 @@ class Top { thread_local_.scheduled_exception_ = Heap::the_hole_value(); } - // 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_; - } - thread_local_.pending_external_caught_exception_ = false; + static void setup_external_caught() { + thread_local_.external_caught_exception_ = + (thread_local_.catcher_ != NULL) && + (Top::thread_local_.try_catch_handler_ == Top::thread_local_.catcher_); } // Tells whether the current context has experienced an out of memory