Revision: 21698
Author:   [email protected]
Date:     Thu Jun  5 13:58:57 2014 UTC
Log: Revert "V8 can clear exception pending message, when should not do this."

This reverts commit 2c6665a7a21bd38f3dea28eb9b303f913c69be8d. Broke too many tests.

[email protected]
BUG=None
LOG=N

Review URL: https://codereview.chromium.org/318773006
http://code.google.com/p/v8/source/detail?r=21698

Modified:
 /branches/bleeding_edge/src/isolate.cc
 /branches/bleeding_edge/src/isolate.h
 /branches/bleeding_edge/test/cctest/test-api.cc

=======================================
--- /branches/bleeding_edge/src/isolate.cc      Thu Jun  5 13:07:53 2014 UTC
+++ /branches/bleeding_edge/src/isolate.cc      Thu Jun  5 13:58:57 2014 UTC
@@ -1166,15 +1166,20 @@
 }


-bool Isolate::HasExternalTryCatch() {
+bool Isolate::IsExternallyCaught() {
   ASSERT(has_pending_exception());

-  return (thread_local_top()->catcher_ != NULL) &&
-      (try_catch_handler() == thread_local_top()->catcher_);
-}
+  if ((thread_local_top()->catcher_ == NULL) ||
+      (try_catch_handler() != thread_local_top()->catcher_)) {
+    // When throwing the exception, we found no v8::TryCatch
+    // which should care about this exception.
+    return false;
+  }

+  if (!is_catchable_by_javascript(pending_exception())) {
+    return true;
+  }

-bool Isolate::IsFinallyOnTop() {
// Get the address of the external handler so we can compare the address to
   // determine which one is closer to the top of the stack.
   Address external_handler_address =
@@ -1194,18 +1199,18 @@
       StackHandler::FromAddress(Isolate::handler(thread_local_top()));
while (handler != NULL && handler->address() < external_handler_address) {
     ASSERT(!handler->is_catch());
-    if (handler->is_finally()) return true;
+    if (handler->is_finally()) return false;

     handler = handler->next();
   }

-  return false;
+  return true;
 }


 void Isolate::ReportPendingMessages() {
   ASSERT(has_pending_exception());
-  bool can_clear_message = PropagatePendingExceptionToExternalTryCatch();
+  PropagatePendingExceptionToExternalTryCatch();

   HandleScope scope(this);
   if (thread_local_top_.pending_exception_ ==
@@ -1232,7 +1237,7 @@
       }
     }
   }
-  if (can_clear_message) clear_pending_message();
+  clear_pending_message();
 }


@@ -1737,18 +1742,13 @@
 }


-bool Isolate::PropagatePendingExceptionToExternalTryCatch() {
+void Isolate::PropagatePendingExceptionToExternalTryCatch() {
   ASSERT(has_pending_exception());

-  bool has_external_try_catch = HasExternalTryCatch();
- bool is_catchable_by_js = is_catchable_by_javascript(pending_exception());
-  bool is_finally_on_top  = IsFinallyOnTop();
+  bool external_caught = IsExternallyCaught();
+  thread_local_top_.external_caught_exception_ = external_caught;

-  bool should_propagate_now = has_external_try_catch &&
-    (!is_catchable_by_js || !is_finally_on_top);
-  thread_local_top_.external_caught_exception_ = should_propagate_now;
-
-  if (!should_propagate_now) return !has_external_try_catch;
+  if (!external_caught) return;

   if (thread_local_top_.pending_exception_ ==
              heap()->termination_exception()) {
@@ -1765,14 +1765,13 @@
     handler->has_terminated_ = false;
     handler->exception_ = pending_exception();
// Propagate to the external try-catch only if we got an actual message.
-    if (thread_local_top_.pending_message_obj_->IsTheHole()) return true;
+    if (thread_local_top_.pending_message_obj_->IsTheHole()) return;

     handler->message_obj_ = thread_local_top_.pending_message_obj_;
     handler->message_script_ = thread_local_top_.pending_message_script_;
handler->message_start_pos_ = thread_local_top_.pending_message_start_pos_;
     handler->message_end_pos_ = thread_local_top_.pending_message_end_pos_;
   }
-  return true;
 }


=======================================
--- /branches/bleeding_edge/src/isolate.h       Thu Jun  5 13:07:53 2014 UTC
+++ /branches/bleeding_edge/src/isolate.h       Thu Jun  5 13:58:57 2014 UTC
@@ -604,8 +604,7 @@
     thread_local_top_.scheduled_exception_ = heap_.the_hole_value();
   }

-  bool HasExternalTryCatch();
-  bool IsFinallyOnTop();
+  bool IsExternallyCaught();

   bool is_catchable_by_javascript(Object* exception) {
     return exception != heap()->termination_exception();
@@ -1180,10 +1179,7 @@

   void FillCache();

-  // Propagate pending exception message to the v8::TryCatch.
- // If there is no external try-catch or message was successfully propagated,
-  // then return true.
-  bool PropagatePendingExceptionToExternalTryCatch();
+  void PropagatePendingExceptionToExternalTryCatch();

// Traverse prototype chain to find out whether the object is derived from
   // the Error object.
=======================================
--- /branches/bleeding_edge/test/cctest/test-api.cc Thu Jun 5 13:07:53 2014 UTC +++ /branches/bleeding_edge/test/cctest/test-api.cc Thu Jun 5 13:58:57 2014 UTC
@@ -8360,41 +8360,6 @@
       "})()");
   CHECK(try_catch.HasCaught());
 }
-
-
-void CEvaluate(const v8::FunctionCallbackInfo<v8::Value>& args) {
-  v8::HandleScope scope(args.GetIsolate());
-  CompileRun(args[0]->ToString());
-}
-
-
-TEST(TryCatchFinallyStoresMessageUsingTryCatchHandler) {
-  v8::Isolate* isolate = CcTest::isolate();
-  v8::HandleScope scope(isolate);
-  Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
-  templ->Set(v8_str("CEvaluate"),
-             v8::FunctionTemplate::New(isolate, CEvaluate));
-  LocalContext context(0, templ);
-  v8::TryCatch try_catch;
-  CompileRun("try {"
-             "  CEvaluate('throw 1;');"
-             "} finally {"
-             "}");
-  CHECK(try_catch.HasCaught());
-  CHECK(!try_catch.Message().IsEmpty());
-  String::Utf8Value exception_value(try_catch.Exception());
-  CHECK_EQ(*exception_value, "1");
-  try_catch.Reset();
-  CompileRun("try {"
-             "  CEvaluate('throw 1;');"
-             "} finally {"
-             "  throw 2;"
-             "}");
-  CHECK(try_catch.HasCaught());
-  CHECK(!try_catch.Message().IsEmpty());
-  String::Utf8Value finally_exception_value(try_catch.Exception());
-  CHECK_EQ(*finally_exception_value, "2");
-}


 // For use within the TestSecurityHandler() test.

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to