Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index 93c8e41f053795e02fb9a4cd698c525ec3db1ac2..a22a7e77673e4e26d6ac8e3367ed9c688fb88269 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(); |
@@ -12963,22 +13010,29 @@ THREADED_TEST(VariousGetPropertiesAndThrowingCallbacks) { |
Local<Value> result = instance->GetRealNamedProperty(v8_str("f")); |
CHECK(try_catch.HasCaught()); |
try_catch.Reset(); |
- CHECK(result.IsEmpty()); |
+ // TODO(mstarzinger): The exception is propagated directly to the TryCatch |
+ // scope and is never scheduled, because there is no real JavaScript frame |
+ // between here and the ThrowingGetter. Fixing this will make the result a |
+ // proper empty handle again. |
+ CHECK(result->IsUndefined()); |
result = another->GetRealNamedProperty(v8_str("f")); |
CHECK(try_catch.HasCaught()); |
try_catch.Reset(); |
- CHECK(result.IsEmpty()); |
+ // TODO(mstarzinger): Likewise. |
+ CHECK(result->IsUndefined()); |
result = another->GetRealNamedPropertyInPrototypeChain(v8_str("f")); |
CHECK(try_catch.HasCaught()); |
try_catch.Reset(); |
- CHECK(result.IsEmpty()); |
+ // TODO(mstarzinger): Likewise. |
+ CHECK(result->IsUndefined()); |
result = another->Get(v8_str("f")); |
CHECK(try_catch.HasCaught()); |
try_catch.Reset(); |
- CHECK(result.IsEmpty()); |
+ // TODO(mstarzinger): Likewise. |
+ CHECK(result->IsUndefined()); |
result = with_js_getter->GetRealNamedProperty(v8_str("f")); |
CHECK(try_catch.HasCaught()); |