Index: test/cctest/test-thread-termination.cc |
diff --git a/test/cctest/test-thread-termination.cc b/test/cctest/test-thread-termination.cc |
index d31b4131dfcd2e4cf789469416c187ca7c3739a5..3095b83bdac9592e198781245588d2b3b9320c6a 100644 |
--- a/test/cctest/test-thread-termination.cc |
+++ b/test/cctest/test-thread-termination.cc |
@@ -474,3 +474,33 @@ TEST(ErrorObjectAfterTermination) { |
// TODO(yangguo): crbug/403509. Check for empty handle instead. |
CHECK(error->IsUndefined()); |
} |
+ |
+ |
+void InnerTryCallTerminate(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+ CHECK(!v8::V8::IsExecutionTerminating(args.GetIsolate())); |
+ v8::Handle<v8::Object> global = CcTest::global(); |
+ v8::Handle<v8::Function> loop = |
+ v8::Handle<v8::Function>::Cast(global->Get(v8_str("loop"))); |
+ i::MaybeHandle<i::Object> result = |
+ i::Execution::TryCall(v8::Utils::OpenHandle((*loop)), |
+ v8::Utils::OpenHandle((*global)), 0, NULL, NULL); |
+ CHECK(result.is_null()); |
+ CHECK(v8::V8::IsExecutionTerminating(CcTest::isolate())); |
+} |
+ |
+ |
+TEST(TerminationInInnerTryCall) { |
+ v8::Isolate* isolate = CcTest::isolate(); |
+ v8::HandleScope scope(isolate); |
+ v8::Handle<v8::ObjectTemplate> global_template = CreateGlobalTemplate( |
+ CcTest::isolate(), TerminateCurrentThread, DoLoopNoCall); |
+ global_template->Set( |
+ v8_str("inner_try_call_terminate"), |
+ v8::FunctionTemplate::New(isolate, InnerTryCallTerminate)); |
+ v8::Handle<v8::Context> context = |
+ v8::Context::New(CcTest::isolate(), NULL, global_template); |
+ v8::Context::Scope context_scope(context); |
+ v8::TryCatch try_catch; |
+ CompileRun("inner_try_call_terminate()"); |
+ CHECK(try_catch.HasTerminated()); |
+} |