Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index 447437541ef935d8d0e58f2e7e60f7937a52f4f1..a66242b9b24703839adccd7533a96257f3be9e74 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -5343,15 +5343,28 @@ THREADED_TEST(TryCatchAndFinally) { |
} |
-static void TryCatchNestedHelper(int depth) { |
+static void TryCatchNested1Helper(int depth) { |
if (depth > 0) { |
v8::TryCatch try_catch; |
try_catch.SetVerbose(true); |
- TryCatchNestedHelper(depth - 1); |
+ TryCatchNested1Helper(depth - 1); |
CHECK(try_catch.HasCaught()); |
try_catch.ReThrow(); |
} else { |
- CcTest::isolate()->ThrowException(v8_str("back")); |
+ CcTest::isolate()->ThrowException(v8_str("E1")); |
+ } |
+} |
+ |
+ |
+static void TryCatchNested2Helper(int depth) { |
+ if (depth > 0) { |
+ v8::TryCatch try_catch; |
+ try_catch.SetVerbose(true); |
+ TryCatchNested2Helper(depth - 1); |
+ CHECK(try_catch.HasCaught()); |
+ try_catch.ReThrow(); |
+ } else { |
+ CompileRun("throw 'E2';"); |
} |
} |
@@ -5360,10 +5373,22 @@ TEST(TryCatchNested) { |
v8::V8::Initialize(); |
LocalContext context; |
v8::HandleScope scope(context->GetIsolate()); |
- v8::TryCatch try_catch; |
- TryCatchNestedHelper(5); |
- CHECK(try_catch.HasCaught()); |
- CHECK_EQ(0, strcmp(*v8::String::Utf8Value(try_catch.Exception()), "back")); |
+ |
+ { |
+ // Test nested try-catch with a native throw in the end. |
+ v8::TryCatch try_catch; |
+ TryCatchNested1Helper(5); |
+ CHECK(try_catch.HasCaught()); |
+ CHECK_EQ(0, strcmp(*v8::String::Utf8Value(try_catch.Exception()), "E1")); |
+ } |
+ |
+ { |
+ // Test nested try-catch with a JavaScript throw in the end. |
+ v8::TryCatch try_catch; |
+ TryCatchNested2Helper(5); |
+ CHECK(try_catch.HasCaught()); |
+ CHECK_EQ(0, strcmp(*v8::String::Utf8Value(try_catch.Exception()), "E2")); |
+ } |
} |
@@ -5409,6 +5434,28 @@ TEST(TryCatchMixedNesting) { |
} |
+void TryCatchNativeHelper(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+ ApiTestFuzzer::Fuzz(); |
+ v8::TryCatch try_catch; |
+ args.GetIsolate()->ThrowException(v8_str("boom")); |
+ CHECK(try_catch.HasCaught()); |
+} |
+ |
+ |
+TEST(TryCatchNative) { |
+ v8::Isolate* isolate = CcTest::isolate(); |
+ v8::HandleScope scope(isolate); |
+ v8::V8::Initialize(); |
+ v8::TryCatch try_catch; |
+ Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
+ templ->Set(v8_str("TryCatchNativeHelper"), |
+ v8::FunctionTemplate::New(isolate, TryCatchNativeHelper)); |
+ LocalContext context(0, templ); |
+ CompileRun("TryCatchNativeHelper();"); |
+ CHECK(!try_catch.HasCaught()); |
+} |
+ |
+ |
THREADED_TEST(Equality) { |
LocalContext context; |
v8::Isolate* isolate = context->GetIsolate(); |