Revert revision 593. This was a cleanup change but it caused layout
authorager@chromium.org <ager@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 28 Oct 2008 07:30:10 +0000 (07:30 +0000)
committerager@chromium.org <ager@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 28 Oct 2008 07:30:10 +0000 (07:30 +0000)
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

src/execution.cc
src/top.cc
src/top.h

index 03541a8..0598ad7 100644 (file)
@@ -91,10 +91,12 @@ static Handle<Object> 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
index 8df808e..a78ba32 100644 (file)
@@ -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<void*>(*exception_handle);
     if (!message_obj.is_null()) {
index 69fb7fa..866487c 100644 (file)
--- 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