Reviewers: Jakob,

Description:
Replace r12503. Explicitly check toString() for exception in d8's print().


[email protected]
BUG=v8:2317


Please review this at https://chromiumcodereview.appspot.com/10911305/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/api.cc
  M src/d8.cc
  M test/cctest/test-api.cc


Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index bcec7f90042cff777d28ba84fa78f7c699efde77..bb343b5be805cd5ba666cee1877bc7dd6fc37fc0 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -5500,6 +5500,7 @@ String::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj)
   if (obj.IsEmpty()) return;
   ENTER_V8(isolate);
   i::HandleScope scope(isolate);
+  TryCatch try_catch;
   Handle<String> str = obj->ToString();
   if (str.IsEmpty()) return;
   i::Handle<i::String> i_str = Utils::OpenHandle(*str);
@@ -5521,6 +5522,7 @@ String::AsciiValue::AsciiValue(v8::Handle<v8::Value> obj)
   if (obj.IsEmpty()) return;
   ENTER_V8(isolate);
   i::HandleScope scope(isolate);
+  TryCatch try_catch;
   Handle<String> str = obj->ToString();
   if (str.IsEmpty()) return;
   length_ = str->Length();
@@ -5541,6 +5543,7 @@ String::Value::Value(v8::Handle<v8::Value> obj)
   if (obj.IsEmpty()) return;
   ENTER_V8(isolate);
   i::HandleScope scope(isolate);
+  TryCatch try_catch;
   Handle<String> str = obj->ToString();
   if (str.IsEmpty()) return;
   length_ = str->Length();
Index: src/d8.cc
diff --git a/src/d8.cc b/src/d8.cc
index f20a41aa5fc7bb56a3feab434c46e717d0a0e44a..b3b1bb8a170855180c7ba4865c60a1051067ea8e 100644
--- a/src/d8.cc
+++ b/src/d8.cc
@@ -200,7 +200,13 @@ Handle<Value> Shell::Write(const Arguments& args) {
     if (i != 0) {
       printf(" ");
     }
-    v8::String::Utf8Value str(args[i]);
+
+    // Explicitly catch potential exceptions in toString().
+    v8::TryCatch try_catch;
+    Handle<String> str_obj = args[i]->ToString();
+    if (try_catch.HasCaught()) return try_catch.ReThrow();
+
+    v8::String::Utf8Value str(str_obj);
int n = static_cast<int>(fwrite(*str, sizeof(**str), str.length(), stdout));
     if (n != str.length()) {
       printf("Error in fwrite\n");
Index: test/cctest/test-api.cc
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index 027c0d6c19ef32df4078bef0838d67c2b3bf903d..18025e14a076210b454a8cc4bcc2e7a3dd9d8f47 100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -17513,37 +17513,4 @@ class ThreadInterruptTest {
 THREADED_TEST(SemaphoreInterruption) {
   ThreadInterruptTest().RunTest();
 }
-
-
-TEST(Utf8ValueException) {
-  v8::HandleScope scope;
-  LocalContext context;
-
-  Handle<Value> object = CompileRun(
-      "var obj = { toString : function() { throw 'deadbeef';  } }; obj");
-
-  { v8::TryCatch try_catch;
-    v8::String::Utf8Value utf8_value(object);
-    CHECK(try_catch.HasCaught());
-    CHECK_EQ("deadbeef", *v8::String::Utf8Value(try_catch.Exception()));
-  }
-
-  { v8::TryCatch try_catch;
-    v8::String::AsciiValue ascii_value(object);
-    CHECK(try_catch.HasCaught());
-    CHECK_EQ("deadbeef", *v8::String::Utf8Value(try_catch.Exception()));
-  }
-
-  { v8::TryCatch try_catch;
-    v8::String::Value value(object);
-    CHECK(try_catch.HasCaught());
-    CHECK_EQ("deadbeef", *v8::String::Utf8Value(try_catch.Exception()));
-  }
-
-  // It should work fine without any TryCatch.
-  v8::String::Utf8Value utf8_value(object);
-  v8::String::AsciiValue ascii_value(object);
-  v8::String::Value value(object);
-}
-
 #endif  // WIN32


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

Reply via email to