Replace r12503. Explicitly check toString() for exception in d8's print().
R=jkummerow@chromium.org BUG=v8:2317 Review URL: https://chromiumcodereview.appspot.com/10911305 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12507 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
ee55b2c2d3
commit
8d04c8c89f
@ -5500,6 +5500,7 @@ String::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj)
|
|||||||
if (obj.IsEmpty()) return;
|
if (obj.IsEmpty()) return;
|
||||||
ENTER_V8(isolate);
|
ENTER_V8(isolate);
|
||||||
i::HandleScope scope(isolate);
|
i::HandleScope scope(isolate);
|
||||||
|
TryCatch try_catch;
|
||||||
Handle<String> str = obj->ToString();
|
Handle<String> str = obj->ToString();
|
||||||
if (str.IsEmpty()) return;
|
if (str.IsEmpty()) return;
|
||||||
i::Handle<i::String> i_str = Utils::OpenHandle(*str);
|
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;
|
if (obj.IsEmpty()) return;
|
||||||
ENTER_V8(isolate);
|
ENTER_V8(isolate);
|
||||||
i::HandleScope scope(isolate);
|
i::HandleScope scope(isolate);
|
||||||
|
TryCatch try_catch;
|
||||||
Handle<String> str = obj->ToString();
|
Handle<String> str = obj->ToString();
|
||||||
if (str.IsEmpty()) return;
|
if (str.IsEmpty()) return;
|
||||||
length_ = str->Length();
|
length_ = str->Length();
|
||||||
@ -5541,6 +5543,7 @@ String::Value::Value(v8::Handle<v8::Value> obj)
|
|||||||
if (obj.IsEmpty()) return;
|
if (obj.IsEmpty()) return;
|
||||||
ENTER_V8(isolate);
|
ENTER_V8(isolate);
|
||||||
i::HandleScope scope(isolate);
|
i::HandleScope scope(isolate);
|
||||||
|
TryCatch try_catch;
|
||||||
Handle<String> str = obj->ToString();
|
Handle<String> str = obj->ToString();
|
||||||
if (str.IsEmpty()) return;
|
if (str.IsEmpty()) return;
|
||||||
length_ = str->Length();
|
length_ = str->Length();
|
||||||
|
@ -200,7 +200,13 @@ Handle<Value> Shell::Write(const Arguments& args) {
|
|||||||
if (i != 0) {
|
if (i != 0) {
|
||||||
printf(" ");
|
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));
|
int n = static_cast<int>(fwrite(*str, sizeof(**str), str.length(), stdout));
|
||||||
if (n != str.length()) {
|
if (n != str.length()) {
|
||||||
printf("Error in fwrite\n");
|
printf("Error in fwrite\n");
|
||||||
|
@ -17513,37 +17513,4 @@ class ThreadInterruptTest {
|
|||||||
THREADED_TEST(SemaphoreInterruption) {
|
THREADED_TEST(SemaphoreInterruption) {
|
||||||
ThreadInterruptTest().RunTest();
|
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
|
#endif // WIN32
|
||||||
|
Loading…
Reference in New Issue
Block a user