| 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 |