Author: [EMAIL PROTECTED]
Date: Fri Oct 24 06:08:31 2008
New Revision: 592

Added:
    changes/[EMAIL PROTECTED]/xxx/
    changes/[EMAIL PROTECTED]/xxx/bleeding_edge/
       - copied from r591, /branches/bleeding_edge/
Modified:
    changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/execution.cc
    changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/top.cc
    changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/top.h

Log:
Revorked version of http://codereview.chromium.org/8101. The only change is
that the exception stored in the TryCatch is not cleared as that was the
cause of the regression.

So the actual difference to http://codereview.chromium.org/8101 is:
Index: src/top.h
===================================================================
--- src/top.h   (revision 576)
+++ src/top.h   (working copy)
@@ -154,10 +154,6 @@
      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;
    }
@@ -312,14 +308,14 @@
  };



Modified: changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/execution.cc
==============================================================================
--- /branches/bleeding_edge/src/execution.cc    (original)
+++ changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/execution.cc        Fri Oct 
 
24 06:08:31 2008
@@ -91,12 +91,10 @@
    value->Verify();
  #endif

-  // Update the pending exception flag and return the value.
+  // Update the pending exception and external caught flag and return the  
value.
    *has_pending_exception = value->IsException();
    ASSERT(*has_pending_exception == Top::has_pending_exception());
-  if (*has_pending_exception) {
-    Top::setup_external_caught();
-  }
+  Top::propagate_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

Modified: changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/top.cc
==============================================================================
--- /branches/bleeding_edge/src/top.cc  (original)
+++ changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/top.cc      Fri Oct 24  
06:08:31 2008
@@ -101,7 +101,7 @@
    clear_pending_exception();
    clear_scheduled_exception();
    thread_local_.save_context_ = NULL;
-  thread_local_.catcher_ = NULL;
+  thread_local_.pending_external_caught_exception_ = false;
  }


@@ -607,7 +607,7 @@


  Failure* Top::ReThrow(Object* exception, MessageLocation* location) {
-  // Set the exception beeing re-thrown.
+  // Set the exception being re-thrown.
    set_pending_exception(exception);
    return Failure::Exception();
  }
@@ -789,9 +789,8 @@
    // 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_.catcher_ = NULL;
+  thread_local_.pending_external_caught_exception_ = is_caught_externally;
    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()) {

Modified: changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/top.h
==============================================================================
--- /branches/bleeding_edge/src/top.h   (original)
+++ changes/[EMAIL PROTECTED]/xxx/bleeding_edge/src/top.h       Fri Oct 24  
06:08:31 2008
@@ -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,16 @@
      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_;
+    }
+    thread_local_.pending_external_caught_exception_ = false;
    }

    // Tells whether the current context has experienced an out of memory

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to