Chromium Code Reviews| Index: test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc |
| diff --git a/test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc b/test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc |
| index 338041ed8a3411cf48c6d2e5037247144dda6910..bef225efaf299b0b2afc2e27399b684b7e9a49c3 100644 |
| --- a/test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc |
| +++ b/test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc |
| @@ -306,16 +306,13 @@ TEST_F(CompilerDispatcherTest, IdleTaskException) { |
| ASSERT_TRUE(dispatcher.Enqueue(shared)); |
| ASSERT_TRUE(platform.IdleTaskPending()); |
| - // Idle tasks shouldn't leave exceptions behind. |
| - v8::TryCatch try_catch(isolate()); |
| - |
| // Since time doesn't progress on the MockPlatform, this is enough idle time |
| // to finish compiling the function. |
| platform.RunIdleTask(1000.0, 0.0); |
| ASSERT_FALSE(dispatcher.IsEnqueued(shared)); |
| ASSERT_FALSE(shared->is_compiled()); |
| - ASSERT_FALSE(try_catch.HasCaught()); |
| + ASSERT_FALSE(i_isolate()->has_pending_exception()); |
| } |
| TEST_F(IgnitionCompilerDispatcherTest, CompileOnBackgroundThread) { |
| @@ -404,5 +401,63 @@ TEST_F(IgnitionCompilerDispatcherTest, FinishNowWithBackgroundTask) { |
| ASSERT_FALSE(platform.BackgroundTasksPending()); |
| } |
| +TEST_F(CompilerDispatcherTest, IdleTaskMultipleJobs) { |
| + MockPlatform platform; |
| + CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size); |
| + |
| + const char script1[] = |
| + "function g() { var y = 1; function f8(x) { return x * y }; return f8; } " |
| + "g();"; |
| + Handle<JSFunction> f1 = Handle<JSFunction>::cast(RunJS(isolate(), script1)); |
| + Handle<SharedFunctionInfo> shared1(f1->shared(), i_isolate()); |
| + |
| + const char script2[] = |
| + "function g() { var y = 1; function f9(x) { return x * y }; return f9; } " |
| + "g();"; |
| + Handle<JSFunction> f2 = Handle<JSFunction>::cast(RunJS(isolate(), script2)); |
| + Handle<SharedFunctionInfo> shared2(f2->shared(), i_isolate()); |
| + |
| + ASSERT_FALSE(platform.IdleTaskPending()); |
| + ASSERT_TRUE(dispatcher.Enqueue(shared1)); |
| + ASSERT_TRUE(dispatcher.Enqueue(shared2)); |
| + ASSERT_TRUE(platform.IdleTaskPending()); |
| + |
| + // Since time doesn't progress on the MockPlatform, this is enough idle time |
| + // to finish compiling the function. |
| + platform.RunIdleTask(1000.0, 0.0); |
| + |
| + ASSERT_FALSE(dispatcher.IsEnqueued(shared1)); |
| + ASSERT_FALSE(dispatcher.IsEnqueued(shared2)); |
| + ASSERT_TRUE(shared1->is_compiled()); |
| + ASSERT_TRUE(shared2->is_compiled()); |
| +} |
| + |
| +TEST_F(CompilerDispatcherTest, FinishNowException) { |
| + MockPlatform platform; |
| + CompilerDispatcher dispatcher(i_isolate(), &platform, 50); |
|
vogelheim
2017/01/04 10:08:49
For my understanding: The point is to over-run an
jochen (gone - plz use gerrit)
2017/01/04 10:23:18
yes
we can't put a real syntax error here, becaus
|
| + |
| + std::string script("function g() { function f10(x) { var a = "); |
| + for (int i = 0; i < 1000; i++) { |
| + script += "'x' + "; |
| + } |
| + script += " 'x'; }; return f10; } g();"; |
| + Handle<JSFunction> f = |
| + Handle<JSFunction>::cast(RunJS(isolate(), script.c_str())); |
| + Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); |
| + |
| + ASSERT_FALSE(platform.IdleTaskPending()); |
| + ASSERT_TRUE(dispatcher.Enqueue(shared)); |
| + ASSERT_TRUE(platform.IdleTaskPending()); |
| + |
| + ASSERT_FALSE(dispatcher.FinishNow(shared)); |
| + |
| + ASSERT_FALSE(dispatcher.IsEnqueued(shared)); |
| + ASSERT_FALSE(shared->is_compiled()); |
| + ASSERT_TRUE(i_isolate()->has_pending_exception()); |
| + |
| + i_isolate()->clear_pending_exception(); |
| + platform.ClearIdleTask(); |
| +} |
| + |
| } // namespace internal |
| } // namespace v8 |