Revision: 12503
Author:   [email protected]
Date:     Fri Sep 14 01:13:57 2012
Log:      Not mask exception thrown by toString in String::UtfValue etc.

[email protected]
BUG=v8:2317

Review URL: https://chromiumcodereview.appspot.com/10917236
http://code.google.com/p/v8/source/detail?r=12503

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

=======================================
--- /branches/bleeding_edge/src/api.cc  Thu Sep 13 02:36:56 2012
+++ /branches/bleeding_edge/src/api.cc  Fri Sep 14 01:13:57 2012
@@ -5500,7 +5500,6 @@
   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);
@@ -5522,7 +5521,6 @@
   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();
@@ -5543,7 +5541,6 @@
   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();
=======================================
--- /branches/bleeding_edge/test/cctest/test-api.cc     Thu Sep 13 02:36:56 2012
+++ /branches/bleeding_edge/test/cctest/test-api.cc     Fri Sep 14 01:13:57 2012
@@ -17513,4 +17513,37 @@
 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