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 <memory> | 5 #include <memory> |
6 | 6 |
7 #include "include/v8.h" | 7 #include "include/v8.h" |
8 #include "src/api.h" | 8 #include "src/api.h" |
9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
10 #include "src/ast/scopes.h" | 10 #include "src/ast/scopes.h" |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( | 130 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( |
131 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), nullptr), | 131 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), nullptr), |
132 FLAG_stack_size)); | 132 FLAG_stack_size)); |
133 | 133 |
134 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); | 134 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
135 job->PrepareToParseOnMainThread(); | 135 job->PrepareToParseOnMainThread(); |
136 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToParse); | 136 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToParse); |
137 job->Parse(); | 137 job->Parse(); |
138 ASSERT_TRUE(job->status() == CompileJobStatus::kParsed); | 138 ASSERT_TRUE(job->status() == CompileJobStatus::kParsed); |
139 ASSERT_TRUE(job->FinalizeParsingOnMainThread()); | 139 ASSERT_TRUE(job->FinalizeParsingOnMainThread()); |
140 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToAnalyse); | 140 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToAnalyze); |
| 141 ASSERT_TRUE(job->AnalyzeOnMainThread()); |
| 142 ASSERT_TRUE(job->status() == CompileJobStatus::kAnalyzed); |
141 ASSERT_TRUE(job->PrepareToCompileOnMainThread()); | 143 ASSERT_TRUE(job->PrepareToCompileOnMainThread()); |
142 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToCompile); | 144 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToCompile); |
143 job->Compile(); | 145 job->Compile(); |
144 ASSERT_TRUE(job->status() == CompileJobStatus::kCompiled); | 146 ASSERT_TRUE(job->status() == CompileJobStatus::kCompiled); |
145 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); | 147 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); |
146 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); | 148 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); |
147 job->ResetOnMainThread(); | 149 job->ResetOnMainThread(); |
148 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); | 150 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
149 } | 151 } |
150 | 152 |
(...skipping 20 matching lines...) Expand all Loading... |
171 "function g() { var y = 1; function f(x) { return x * y }; return f; } " | 173 "function g() { var y = 1; function f(x) { return x * y }; return f; } " |
172 "g();"; | 174 "g();"; |
173 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); | 175 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); |
174 | 176 |
175 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( | 177 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( |
176 i_isolate(), tracer(), handle(f->shared()), FLAG_stack_size)); | 178 i_isolate(), tracer(), handle(f->shared()), FLAG_stack_size)); |
177 | 179 |
178 job->PrepareToParseOnMainThread(); | 180 job->PrepareToParseOnMainThread(); |
179 job->Parse(); | 181 job->Parse(); |
180 ASSERT_TRUE(job->FinalizeParsingOnMainThread()); | 182 ASSERT_TRUE(job->FinalizeParsingOnMainThread()); |
| 183 ASSERT_TRUE(job->AnalyzeOnMainThread()); |
181 ASSERT_TRUE(job->PrepareToCompileOnMainThread()); | 184 ASSERT_TRUE(job->PrepareToCompileOnMainThread()); |
182 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToCompile); | 185 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToCompile); |
183 | 186 |
184 const AstRawString* var_x = | 187 const AstRawString* var_x = |
185 job->parse_info_->ast_value_factory()->GetOneByteString("x"); | 188 job->parse_info_->ast_value_factory()->GetOneByteString("x"); |
186 Variable* var = job->parse_info_->literal()->scope()->Lookup(var_x); | 189 Variable* var = job->parse_info_->literal()->scope()->Lookup(var_x); |
187 ASSERT_TRUE(var); | 190 ASSERT_TRUE(var); |
188 ASSERT_TRUE(var->IsParameter()); | 191 ASSERT_TRUE(var->IsParameter()); |
189 | 192 |
190 const AstRawString* var_y = | 193 const AstRawString* var_y = |
(...skipping 16 matching lines...) Expand all Loading... |
207 " return f;\n" | 210 " return f;\n" |
208 "}\n" | 211 "}\n" |
209 "g();"; | 212 "g();"; |
210 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); | 213 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); |
211 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( | 214 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( |
212 i_isolate(), tracer(), handle(f->shared()), FLAG_stack_size)); | 215 i_isolate(), tracer(), handle(f->shared()), FLAG_stack_size)); |
213 | 216 |
214 job->PrepareToParseOnMainThread(); | 217 job->PrepareToParseOnMainThread(); |
215 job->Parse(); | 218 job->Parse(); |
216 job->FinalizeParsingOnMainThread(); | 219 job->FinalizeParsingOnMainThread(); |
| 220 job->AnalyzeOnMainThread(); |
217 job->PrepareToCompileOnMainThread(); | 221 job->PrepareToCompileOnMainThread(); |
218 job->Compile(); | 222 job->Compile(); |
219 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); | 223 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); |
220 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); | 224 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); |
221 | 225 |
222 Smi* value = Smi::cast(*RunJS(isolate(), "f(100);")); | 226 Smi* value = Smi::cast(*RunJS(isolate(), "f(100);")); |
223 ASSERT_TRUE(value == Smi::FromInt(160)); | 227 ASSERT_TRUE(value == Smi::FromInt(160)); |
224 | 228 |
225 job->ResetOnMainThread(); | 229 job->ResetOnMainThread(); |
226 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); | 230 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
227 } | 231 } |
228 | 232 |
229 TEST_F(CompilerDispatcherJobTest, CompileFailureToPrepare) { | 233 TEST_F(CompilerDispatcherJobTest, CompileFailureToAnalyse) { |
230 std::string raw_script("() { var a = "); | 234 std::string raw_script("() { var a = "); |
231 for (int i = 0; i < 100000; i++) { | 235 for (int i = 0; i < 100000; i++) { |
232 raw_script += "'x' + "; | 236 raw_script += "'x' + "; |
233 } | 237 } |
234 raw_script += " 'x'; }"; | 238 raw_script += " 'x'; }"; |
235 ScriptResource script(raw_script.c_str(), strlen(raw_script.c_str())); | 239 ScriptResource script(raw_script.c_str(), strlen(raw_script.c_str())); |
236 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( | 240 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( |
237 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script), | 241 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script), |
238 100)); | 242 100)); |
239 | 243 |
240 job->PrepareToParseOnMainThread(); | 244 job->PrepareToParseOnMainThread(); |
241 job->Parse(); | 245 job->Parse(); |
242 job->FinalizeParsingOnMainThread(); | 246 job->FinalizeParsingOnMainThread(); |
243 ASSERT_FALSE(job->PrepareToCompileOnMainThread()); | 247 ASSERT_FALSE(job->AnalyzeOnMainThread()); |
244 ASSERT_TRUE(job->status() == CompileJobStatus::kFailed); | 248 ASSERT_TRUE(job->status() == CompileJobStatus::kFailed); |
245 ASSERT_TRUE(i_isolate()->has_pending_exception()); | 249 ASSERT_TRUE(i_isolate()->has_pending_exception()); |
246 | 250 |
247 i_isolate()->clear_pending_exception(); | 251 i_isolate()->clear_pending_exception(); |
248 job->ResetOnMainThread(); | 252 job->ResetOnMainThread(); |
249 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); | 253 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
250 } | 254 } |
251 | 255 |
252 TEST_F(CompilerDispatcherJobTest, CompileFailureToFinalize) { | 256 TEST_F(CompilerDispatcherJobTest, CompileFailureToFinalize) { |
253 std::string raw_script("() { var a = "); | 257 std::string raw_script("() { var a = "); |
254 for (int i = 0; i < 1000; i++) { | 258 for (int i = 0; i < 1000; i++) { |
255 raw_script += "'x' + "; | 259 raw_script += "'x' + "; |
256 } | 260 } |
257 raw_script += " 'x'; }"; | 261 raw_script += " 'x'; }"; |
258 ScriptResource script(raw_script.c_str(), strlen(raw_script.c_str())); | 262 ScriptResource script(raw_script.c_str(), strlen(raw_script.c_str())); |
259 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( | 263 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( |
260 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script), | 264 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script), |
261 50)); | 265 50)); |
262 | 266 |
263 job->PrepareToParseOnMainThread(); | 267 job->PrepareToParseOnMainThread(); |
264 job->Parse(); | 268 job->Parse(); |
265 job->FinalizeParsingOnMainThread(); | 269 job->FinalizeParsingOnMainThread(); |
| 270 job->AnalyzeOnMainThread(); |
266 job->PrepareToCompileOnMainThread(); | 271 job->PrepareToCompileOnMainThread(); |
267 job->Compile(); | 272 job->Compile(); |
268 ASSERT_FALSE(job->FinalizeCompilingOnMainThread()); | 273 ASSERT_FALSE(job->FinalizeCompilingOnMainThread()); |
269 ASSERT_TRUE(job->status() == CompileJobStatus::kFailed); | 274 ASSERT_TRUE(job->status() == CompileJobStatus::kFailed); |
270 ASSERT_TRUE(i_isolate()->has_pending_exception()); | 275 ASSERT_TRUE(i_isolate()->has_pending_exception()); |
271 | 276 |
272 i_isolate()->clear_pending_exception(); | 277 i_isolate()->clear_pending_exception(); |
273 job->ResetOnMainThread(); | 278 job->ResetOnMainThread(); |
274 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); | 279 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
275 } | 280 } |
(...skipping 24 matching lines...) Expand all Loading... |
300 " return bar;" | 305 " return bar;" |
301 "}"; | 306 "}"; |
302 ScriptResource script(raw_script, strlen(raw_script)); | 307 ScriptResource script(raw_script, strlen(raw_script)); |
303 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( | 308 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( |
304 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script), | 309 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script), |
305 100)); | 310 100)); |
306 | 311 |
307 job->PrepareToParseOnMainThread(); | 312 job->PrepareToParseOnMainThread(); |
308 job->Parse(); | 313 job->Parse(); |
309 job->FinalizeParsingOnMainThread(); | 314 job->FinalizeParsingOnMainThread(); |
| 315 job->AnalyzeOnMainThread(); |
310 job->PrepareToCompileOnMainThread(); | 316 job->PrepareToCompileOnMainThread(); |
311 ASSERT_TRUE(job->can_compile_on_background_thread()); | 317 ASSERT_TRUE(job->can_compile_on_background_thread()); |
312 | 318 |
313 base::Semaphore semaphore(0); | 319 base::Semaphore semaphore(0); |
314 CompileTask* background_task = new CompileTask(job.get(), &semaphore); | 320 CompileTask* background_task = new CompileTask(job.get(), &semaphore); |
315 V8::GetCurrentPlatform()->CallOnBackgroundThread(background_task, | 321 V8::GetCurrentPlatform()->CallOnBackgroundThread(background_task, |
316 Platform::kShortRunningTask); | 322 Platform::kShortRunningTask); |
317 semaphore.Wait(); | 323 semaphore.Wait(); |
318 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); | 324 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); |
319 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); | 325 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); |
(...skipping 13 matching lines...) Expand all Loading... |
333 "}\n" | 339 "}\n" |
334 "g();"; | 340 "g();"; |
335 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); | 341 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); |
336 | 342 |
337 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( | 343 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( |
338 i_isolate(), tracer(), handle(f->shared()), FLAG_stack_size)); | 344 i_isolate(), tracer(), handle(f->shared()), FLAG_stack_size)); |
339 | 345 |
340 job->PrepareToParseOnMainThread(); | 346 job->PrepareToParseOnMainThread(); |
341 job->Parse(); | 347 job->Parse(); |
342 ASSERT_TRUE(job->FinalizeParsingOnMainThread()); | 348 ASSERT_TRUE(job->FinalizeParsingOnMainThread()); |
| 349 ASSERT_TRUE(job->AnalyzeOnMainThread()); |
343 ASSERT_TRUE(job->PrepareToCompileOnMainThread()); | 350 ASSERT_TRUE(job->PrepareToCompileOnMainThread()); |
344 job->Compile(); | 351 job->Compile(); |
345 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); | 352 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); |
346 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); | 353 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); |
347 | 354 |
348 Handle<JSFunction> e = Handle<JSFunction>::cast(RunJS(isolate(), "f();")); | 355 Handle<JSFunction> e = Handle<JSFunction>::cast(RunJS(isolate(), "f();")); |
349 | 356 |
350 ASSERT_FALSE(e->shared()->HasBaselineCode()); | 357 ASSERT_FALSE(e->shared()->HasBaselineCode()); |
351 | 358 |
352 job->ResetOnMainThread(); | 359 job->ResetOnMainThread(); |
353 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); | 360 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
354 } | 361 } |
355 | 362 |
356 } // namespace internal | 363 } // namespace internal |
357 } // namespace v8 | 364 } // namespace v8 |
OLD | NEW |