OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler-dispatcher/compiler-dispatcher.h" | 5 #include "src/compiler-dispatcher/compiler-dispatcher.h" |
6 | 6 |
7 #include "include/v8-platform.h" | 7 #include "include/v8-platform.h" |
8 #include "src/compiler-dispatcher/compiler-dispatcher-job.h" | 8 #include "src/compiler-dispatcher/compiler-dispatcher-job.h" |
9 #include "src/flags.h" | 9 #include "src/flags.h" |
10 #include "src/handles.h" | 10 #include "src/handles.h" |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 TEST_F(CompilerDispatcherTest, FinishNow) { | 97 TEST_F(CompilerDispatcherTest, FinishNow) { |
98 MockPlatform platform; | 98 MockPlatform platform; |
99 CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size); | 99 CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size); |
100 | 100 |
101 const char script[] = | 101 const char script[] = |
102 "function g() { var y = 1; function f2(x) { return x * y }; return f2; } " | 102 "function g() { var y = 1; function f2(x) { return x * y }; return f2; } " |
103 "g();"; | 103 "g();"; |
104 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); | 104 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); |
105 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); | 105 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); |
106 | 106 |
107 ASSERT_FALSE(shared->HasBaselineCode()); | 107 ASSERT_FALSE(shared->is_compiled()); |
108 ASSERT_TRUE(dispatcher.Enqueue(shared)); | 108 ASSERT_TRUE(dispatcher.Enqueue(shared)); |
109 ASSERT_TRUE(dispatcher.FinishNow(shared)); | 109 ASSERT_TRUE(dispatcher.FinishNow(shared)); |
110 // Finishing removes the SFI from the queue. | 110 // Finishing removes the SFI from the queue. |
111 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); | 111 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); |
112 ASSERT_TRUE(shared->HasBaselineCode()); | 112 ASSERT_TRUE(shared->is_compiled()); |
113 } | 113 } |
114 | 114 |
115 TEST_F(CompilerDispatcherTest, IdleTask) { | 115 TEST_F(CompilerDispatcherTest, IdleTask) { |
116 MockPlatform platform; | 116 MockPlatform platform; |
117 CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size); | 117 CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size); |
118 | 118 |
119 const char script[] = | 119 const char script[] = |
120 "function g() { var y = 1; function f3(x) { return x * y }; return f3; } " | 120 "function g() { var y = 1; function f3(x) { return x * y }; return f3; } " |
121 "g();"; | 121 "g();"; |
122 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); | 122 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); |
123 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); | 123 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); |
124 | 124 |
125 ASSERT_FALSE(platform.IdleTaskPending()); | 125 ASSERT_FALSE(platform.IdleTaskPending()); |
126 ASSERT_TRUE(dispatcher.Enqueue(shared)); | 126 ASSERT_TRUE(dispatcher.Enqueue(shared)); |
127 ASSERT_TRUE(platform.IdleTaskPending()); | 127 ASSERT_TRUE(platform.IdleTaskPending()); |
128 | 128 |
129 // Since time doesn't progress on the MockPlatform, this is enough idle time | 129 // Since time doesn't progress on the MockPlatform, this is enough idle time |
130 // to finish compiling the function. | 130 // to finish compiling the function. |
131 platform.RunIdleTask(1000.0, 0.0); | 131 platform.RunIdleTask(1000.0, 0.0); |
132 | 132 |
133 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); | 133 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); |
134 ASSERT_TRUE(shared->HasBaselineCode()); | 134 ASSERT_TRUE(shared->is_compiled()); |
135 } | 135 } |
136 | 136 |
137 TEST_F(CompilerDispatcherTest, IdleTaskSmallIdleTime) { | 137 TEST_F(CompilerDispatcherTest, IdleTaskSmallIdleTime) { |
138 MockPlatform platform; | 138 MockPlatform platform; |
139 CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size); | 139 CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size); |
140 | 140 |
141 const char script[] = | 141 const char script[] = |
142 "function g() { var y = 1; function f4(x) { return x * y }; return f4; } " | 142 "function g() { var y = 1; function f4(x) { return x * y }; return f4; } " |
143 "g();"; | 143 "g();"; |
144 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); | 144 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); |
145 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); | 145 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); |
146 | 146 |
147 ASSERT_FALSE(platform.IdleTaskPending()); | 147 ASSERT_FALSE(platform.IdleTaskPending()); |
148 ASSERT_TRUE(dispatcher.Enqueue(shared)); | 148 ASSERT_TRUE(dispatcher.Enqueue(shared)); |
149 ASSERT_TRUE(platform.IdleTaskPending()); | 149 ASSERT_TRUE(platform.IdleTaskPending()); |
150 | 150 |
151 // The job should be scheduled for the main thread. | 151 // The job should be scheduled for the main thread. |
152 ASSERT_EQ(dispatcher.jobs_.size(), 1u); | 152 ASSERT_EQ(dispatcher.jobs_.size(), 1u); |
153 ASSERT_TRUE(dispatcher.jobs_.begin()->second->status() == | 153 ASSERT_TRUE(dispatcher.jobs_.begin()->second->status() == |
154 CompileJobStatus::kInitial); | 154 CompileJobStatus::kInitial); |
155 | 155 |
156 // Only grant a little idle time and have time advance beyond it in one step. | 156 // Only grant a little idle time and have time advance beyond it in one step. |
157 platform.RunIdleTask(2.0, 1.0); | 157 platform.RunIdleTask(2.0, 1.0); |
158 | 158 |
159 ASSERT_TRUE(dispatcher.IsEnqueued(shared)); | 159 ASSERT_TRUE(dispatcher.IsEnqueued(shared)); |
160 ASSERT_FALSE(shared->HasBaselineCode()); | 160 ASSERT_FALSE(shared->is_compiled()); |
161 ASSERT_TRUE(platform.IdleTaskPending()); | 161 ASSERT_TRUE(platform.IdleTaskPending()); |
162 | 162 |
163 // The job should be still scheduled for the main thread, but ready for | 163 // The job should be still scheduled for the main thread, but ready for |
164 // parsing. | 164 // parsing. |
165 ASSERT_EQ(dispatcher.jobs_.size(), 1u); | 165 ASSERT_EQ(dispatcher.jobs_.size(), 1u); |
166 ASSERT_TRUE(dispatcher.jobs_.begin()->second->status() == | 166 ASSERT_TRUE(dispatcher.jobs_.begin()->second->status() == |
167 CompileJobStatus::kReadyToParse); | 167 CompileJobStatus::kReadyToParse); |
168 | 168 |
169 // Only grant a lot of idle time and freeze time. | 169 // Only grant a lot of idle time and freeze time. |
170 platform.RunIdleTask(1000.0, 0.0); | 170 platform.RunIdleTask(1000.0, 0.0); |
171 | 171 |
172 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); | 172 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); |
173 ASSERT_TRUE(shared->HasBaselineCode()); | 173 ASSERT_TRUE(shared->is_compiled()); |
174 ASSERT_FALSE(platform.IdleTaskPending()); | 174 ASSERT_FALSE(platform.IdleTaskPending()); |
175 } | 175 } |
176 | 176 |
177 TEST_F(CompilerDispatcherTest, IdleTaskException) { | 177 TEST_F(CompilerDispatcherTest, IdleTaskException) { |
178 MockPlatform platform; | 178 MockPlatform platform; |
179 CompilerDispatcher dispatcher(i_isolate(), &platform, 50); | 179 CompilerDispatcher dispatcher(i_isolate(), &platform, 50); |
180 | 180 |
181 std::string script("function g() { function f5(x) { var a = "); | 181 std::string script("function g() { function f5(x) { var a = "); |
182 for (int i = 0; i < 1000; i++) { | 182 for (int i = 0; i < 1000; i++) { |
183 script += "'x' + "; | 183 script += "'x' + "; |
184 } | 184 } |
185 script += " 'x'; }; return f5; } g();"; | 185 script += " 'x'; }; return f5; } g();"; |
186 Handle<JSFunction> f = | 186 Handle<JSFunction> f = |
187 Handle<JSFunction>::cast(RunJS(isolate(), script.c_str())); | 187 Handle<JSFunction>::cast(RunJS(isolate(), script.c_str())); |
188 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); | 188 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); |
189 | 189 |
190 ASSERT_FALSE(platform.IdleTaskPending()); | 190 ASSERT_FALSE(platform.IdleTaskPending()); |
191 ASSERT_TRUE(dispatcher.Enqueue(shared)); | 191 ASSERT_TRUE(dispatcher.Enqueue(shared)); |
192 ASSERT_TRUE(platform.IdleTaskPending()); | 192 ASSERT_TRUE(platform.IdleTaskPending()); |
193 | 193 |
194 // Idle tasks shouldn't leave exceptions behind. | 194 // Idle tasks shouldn't leave exceptions behind. |
195 v8::TryCatch try_catch(isolate()); | 195 v8::TryCatch try_catch(isolate()); |
196 | 196 |
197 // Since time doesn't progress on the MockPlatform, this is enough idle time | 197 // Since time doesn't progress on the MockPlatform, this is enough idle time |
198 // to finish compiling the function. | 198 // to finish compiling the function. |
199 platform.RunIdleTask(1000.0, 0.0); | 199 platform.RunIdleTask(1000.0, 0.0); |
200 | 200 |
201 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); | 201 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); |
202 ASSERT_FALSE(shared->HasBaselineCode()); | 202 ASSERT_FALSE(shared->is_compiled()); |
203 ASSERT_FALSE(try_catch.HasCaught()); | 203 ASSERT_FALSE(try_catch.HasCaught()); |
204 } | 204 } |
205 | 205 |
206 } // namespace internal | 206 } // namespace internal |
207 } // namespace v8 | 207 } // namespace v8 |
OLD | NEW |