Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Unified Diff: test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc

Issue 2686673002: [Compiler] Avoid blocking on inner function parallel compilation. (Closed)
Patch Set: Rebase Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler-dispatcher/compiler-dispatcher-job.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 420f9b71fbfeb264b7983ce4fd96eac2244f049b..b79388baf1ef6b0111e90575afb34762cbe8b062 100644
--- a/test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc
+++ b/test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc
@@ -809,18 +809,19 @@ TEST_F(CompilerDispatcherTest, EnqueueParsed) {
MockPlatform platform;
CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
- const char script[] =
+ const char source[] =
"function g() { var y = 1; function f17(x) { return x * y }; return f17; "
"} g();";
- Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script));
+ Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), source));
Handle<SharedFunctionInfo> shared(f->shared(), i_isolate());
+ Handle<Script> script(Script::cast(shared->script()), i_isolate());
ParseInfo parse_info(shared);
ASSERT_TRUE(Compiler::ParseAndAnalyze(&parse_info));
std::shared_ptr<DeferredHandles> handles;
ASSERT_FALSE(dispatcher.IsEnqueued(shared));
- ASSERT_TRUE(dispatcher.Enqueue(shared, parse_info.literal(),
+ ASSERT_TRUE(dispatcher.Enqueue(script, shared, parse_info.literal(),
parse_info.zone_shared(), handles, handles));
ASSERT_TRUE(dispatcher.IsEnqueued(shared));
@@ -836,18 +837,19 @@ TEST_F(CompilerDispatcherTest, EnqueueAndStepParsed) {
MockPlatform platform;
CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
- const char script[] =
+ const char source[] =
"function g() { var y = 1; function f18(x) { return x * y }; return f18; "
"} g();";
- Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script));
+ Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), source));
Handle<SharedFunctionInfo> shared(f->shared(), i_isolate());
+ Handle<Script> script(Script::cast(shared->script()), i_isolate());
ParseInfo parse_info(shared);
ASSERT_TRUE(Compiler::ParseAndAnalyze(&parse_info));
std::shared_ptr<DeferredHandles> handles;
ASSERT_FALSE(dispatcher.IsEnqueued(shared));
- ASSERT_TRUE(dispatcher.EnqueueAndStep(shared, parse_info.literal(),
+ ASSERT_TRUE(dispatcher.EnqueueAndStep(script, shared, parse_info.literal(),
parse_info.zone_shared(), handles,
handles));
ASSERT_TRUE(dispatcher.IsEnqueued(shared));
@@ -861,56 +863,17 @@ TEST_F(CompilerDispatcherTest, EnqueueAndStepParsed) {
platform.ClearBackgroundTasks();
}
-TEST_F(CompilerDispatcherTest, FinishAllNow) {
- MockPlatform platform;
- CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
-
- const char script1[] =
- "function g() { var y = 1; function f19(x) { return x + y }; return f19; "
- "} 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 f20(x) { return x * y }; return f20; "
- "} g();";
- Handle<JSFunction> f2 = Handle<JSFunction>::cast(RunJS(isolate(), script2));
- Handle<SharedFunctionInfo> shared2(f2->shared(), i_isolate());
-
- ASSERT_FALSE(shared1->is_compiled());
- ASSERT_FALSE(shared2->is_compiled());
-
- // Enqueue shared1 as already parsed.
- ParseInfo parse_info(shared1);
- ASSERT_TRUE(Compiler::ParseAndAnalyze(&parse_info));
- std::shared_ptr<DeferredHandles> handles;
- ASSERT_TRUE(dispatcher.Enqueue(shared1, parse_info.literal(),
- parse_info.zone_shared(), handles, handles));
-
- // Enqueue shared2 for parsing and compiling
- ASSERT_TRUE(dispatcher.Enqueue(shared2));
-
- ASSERT_TRUE(dispatcher.FinishAllNow());
-
- // Finishing removes the SFI from the queue.
- ASSERT_FALSE(dispatcher.IsEnqueued(shared1));
- ASSERT_FALSE(dispatcher.IsEnqueued(shared2));
- ASSERT_TRUE(shared1->is_compiled());
- ASSERT_TRUE(shared2->is_compiled());
- ASSERT_TRUE(platform.IdleTaskPending());
- platform.ClearIdleTask();
-}
-
TEST_F(CompilerDispatcherTest, CompileParsedOutOfScope) {
MockPlatform platform;
CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
Local<v8::Context> context = v8::Context::New(isolate());
- const char script[] =
+ const char source[] =
"function g() { var y = 1; function f20(x) { return x + y }; return f20; "
"} g();";
- Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script));
+ Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), source));
Handle<SharedFunctionInfo> shared(f->shared(), i_isolate());
+ Handle<Script> script(Script::cast(shared->script()), i_isolate());
{
HandleScope scope(i_isolate()); // Create handles scope for parsing.
@@ -926,7 +889,7 @@ TEST_F(CompilerDispatcherTest, CompileParsedOutOfScope) {
ASSERT_FALSE(platform.IdleTaskPending());
ASSERT_TRUE(dispatcher.Enqueue(
- shared, parse_info.literal(), parse_info.zone_shared(),
+ script, shared, parse_info.literal(), parse_info.zone_shared(),
parse_info.deferred_handles(), compilation_handles));
ASSERT_TRUE(platform.IdleTaskPending());
}
@@ -940,5 +903,28 @@ TEST_F(CompilerDispatcherTest, CompileParsedOutOfScope) {
ASSERT_TRUE(shared->is_compiled());
}
+TEST_F(CompilerDispatcherTest, CompileLazyFinishesDispatcherJob) {
+ // Use the real dispatcher so that CompileLazy checks the same one for
+ // enqueued functions.
+ CompilerDispatcher* dispatcher = i_isolate()->compiler_dispatcher();
+
+ const char source[] =
+ "function g() { var y = 1; function f16(x) { return x * y }; return f16; "
+ "} g();";
marja 2017/02/09 09:09:48 Is this g() now unnecessary? It's a bit confusing.
rmcilroy 2017/02/09 10:37:57 This is still needed (it returns f16 as the return
marja 2017/02/09 16:22:01 Acknowledged.
+ Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), source));
+ Handle<SharedFunctionInfo> shared(f->shared(), i_isolate());
+
+ ASSERT_FALSE(shared->is_compiled());
+ ASSERT_FALSE(dispatcher->IsEnqueued(shared));
+ ASSERT_TRUE(dispatcher->Enqueue(shared));
+ ASSERT_TRUE(dispatcher->IsEnqueued(shared));
+
+ // Now force the function to run and ensure CompileLazy finished and dequeues
+ // it from the dispatcher.
+ RunJS(isolate(), "g()();");
+ ASSERT_TRUE(shared->is_compiled());
+ ASSERT_FALSE(dispatcher->IsEnqueued(shared));
+}
marja 2017/02/09 16:22:01 Would it be interesting to add a test like this:
rmcilroy 2017/02/10 11:21:16 Sure, added this test. It ended up being slightly
+
} // namespace internal
} // namespace v8
« no previous file with comments | « src/compiler-dispatcher/compiler-dispatcher-job.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698