| 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 11 matching lines...) Expand all Loading... |
| 22 namespace v8 { | 22 namespace v8 { |
| 23 namespace internal { | 23 namespace internal { |
| 24 | 24 |
| 25 class CompilerDispatcherJobTest : public TestWithContext { | 25 class CompilerDispatcherJobTest : public TestWithContext { |
| 26 public: | 26 public: |
| 27 CompilerDispatcherJobTest() : tracer_(i_isolate()) {} | 27 CompilerDispatcherJobTest() : tracer_(i_isolate()) {} |
| 28 ~CompilerDispatcherJobTest() override {} | 28 ~CompilerDispatcherJobTest() override {} |
| 29 | 29 |
| 30 CompilerDispatcherTracer* tracer() { return &tracer_; } | 30 CompilerDispatcherTracer* tracer() { return &tracer_; } |
| 31 | 31 |
| 32 private: | |
| 33 CompilerDispatcherTracer tracer_; | |
| 34 | |
| 35 DISALLOW_COPY_AND_ASSIGN(CompilerDispatcherJobTest); | |
| 36 }; | |
| 37 | |
| 38 class IgnitionCompilerDispatcherJobTest : public CompilerDispatcherJobTest { | |
| 39 public: | |
| 40 IgnitionCompilerDispatcherJobTest() {} | |
| 41 ~IgnitionCompilerDispatcherJobTest() override {} | |
| 42 | |
| 43 static void SetUpTestCase() { | 32 static void SetUpTestCase() { |
| 44 old_flag_ = i::FLAG_ignition; | 33 old_flag_ = i::FLAG_ignition; |
| 45 i::FLAG_ignition = true; | 34 i::FLAG_ignition = true; |
| 46 TestWithContext::SetUpTestCase(); | 35 TestWithContext::SetUpTestCase(); |
| 47 } | 36 } |
| 48 | 37 |
| 49 static void TearDownTestCase() { | 38 static void TearDownTestCase() { |
| 50 TestWithContext::TearDownTestCase(); | 39 TestWithContext::TearDownTestCase(); |
| 51 i::FLAG_ignition = old_flag_; | 40 i::FLAG_ignition = old_flag_; |
| 52 } | 41 } |
| 53 | 42 |
| 54 private: | 43 private: |
| 44 CompilerDispatcherTracer tracer_; |
| 55 static bool old_flag_; | 45 static bool old_flag_; |
| 56 DISALLOW_COPY_AND_ASSIGN(IgnitionCompilerDispatcherJobTest); | 46 |
| 47 DISALLOW_COPY_AND_ASSIGN(CompilerDispatcherJobTest); |
| 57 }; | 48 }; |
| 58 | 49 |
| 59 bool IgnitionCompilerDispatcherJobTest::old_flag_; | 50 bool CompilerDispatcherJobTest::old_flag_; |
| 60 | 51 |
| 61 namespace { | 52 namespace { |
| 62 | 53 |
| 63 const char test_script[] = "(x) { x*x; }"; | 54 const char test_script[] = "(x) { x*x; }"; |
| 64 | 55 |
| 65 class ScriptResource : public v8::String::ExternalOneByteStringResource { | 56 class ScriptResource : public v8::String::ExternalOneByteStringResource { |
| 66 public: | 57 public: |
| 67 ScriptResource(const char* data, size_t length) | 58 ScriptResource(const char* data, size_t length) |
| 68 : data_(data), length_(length) {} | 59 : data_(data), length_(length) {} |
| 69 ~ScriptResource() override = default; | 60 ~ScriptResource() override = default; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 } | 94 } |
| 104 | 95 |
| 105 } // namespace | 96 } // namespace |
| 106 | 97 |
| 107 TEST_F(CompilerDispatcherJobTest, Construct) { | 98 TEST_F(CompilerDispatcherJobTest, Construct) { |
| 108 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( | 99 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( |
| 109 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), nullptr), | 100 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), nullptr), |
| 110 FLAG_stack_size)); | 101 FLAG_stack_size)); |
| 111 } | 102 } |
| 112 | 103 |
| 113 TEST_F(CompilerDispatcherJobTest, CanParseOnBackgroundThread) { | |
| 114 { | |
| 115 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( | |
| 116 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), nullptr), | |
| 117 FLAG_stack_size)); | |
| 118 ASSERT_FALSE(job->can_parse_on_background_thread()); | |
| 119 } | |
| 120 { | |
| 121 ScriptResource script(test_script, strlen(test_script)); | |
| 122 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( | |
| 123 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script), | |
| 124 FLAG_stack_size)); | |
| 125 ASSERT_TRUE(job->can_parse_on_background_thread()); | |
| 126 } | |
| 127 } | |
| 128 | |
| 129 TEST_F(CompilerDispatcherJobTest, StateTransitions) { | 104 TEST_F(CompilerDispatcherJobTest, StateTransitions) { |
| 130 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( | 105 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( |
| 131 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), nullptr), | 106 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), nullptr), |
| 132 FLAG_stack_size)); | 107 FLAG_stack_size)); |
| 133 | 108 |
| 134 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); | 109 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
| 135 job->PrepareToParseOnMainThread(); | 110 job->PrepareToParseOnMainThread(); |
| 136 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToParse); | 111 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToParse); |
| 137 job->Parse(); | 112 job->Parse(); |
| 138 ASSERT_TRUE(job->status() == CompileJobStatus::kParsed); | 113 ASSERT_TRUE(job->status() == CompileJobStatus::kParsed); |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 job_->Compile(); | 259 job_->Compile(); |
| 285 semaphore_->Signal(); | 260 semaphore_->Signal(); |
| 286 } | 261 } |
| 287 | 262 |
| 288 private: | 263 private: |
| 289 CompilerDispatcherJob* job_; | 264 CompilerDispatcherJob* job_; |
| 290 base::Semaphore* semaphore_; | 265 base::Semaphore* semaphore_; |
| 291 DISALLOW_COPY_AND_ASSIGN(CompileTask); | 266 DISALLOW_COPY_AND_ASSIGN(CompileTask); |
| 292 }; | 267 }; |
| 293 | 268 |
| 294 TEST_F(IgnitionCompilerDispatcherJobTest, CompileOnBackgroundThread) { | 269 TEST_F(CompilerDispatcherJobTest, CompileOnBackgroundThread) { |
| 295 const char* raw_script = | 270 const char* raw_script = |
| 296 "(a, b) {\n" | 271 "(a, b) {\n" |
| 297 " var c = a + b;\n" | 272 " var c = a + b;\n" |
| 298 " function bar() { return b }\n" | 273 " function bar() { return b }\n" |
| 299 " var d = { foo: 100, bar : bar() }\n" | 274 " var d = { foo: 100, bar : bar() }\n" |
| 300 " return bar;" | 275 " return bar;" |
| 301 "}"; | 276 "}"; |
| 302 ScriptResource script(raw_script, strlen(raw_script)); | 277 ScriptResource script(raw_script, strlen(raw_script)); |
| 303 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( | 278 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( |
| 304 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script), | 279 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script), |
| 305 100)); | 280 100)); |
| 306 | 281 |
| 307 job->PrepareToParseOnMainThread(); | 282 job->PrepareToParseOnMainThread(); |
| 308 job->Parse(); | 283 job->Parse(); |
| 309 job->FinalizeParsingOnMainThread(); | 284 job->FinalizeParsingOnMainThread(); |
| 310 job->PrepareToCompileOnMainThread(); | 285 job->PrepareToCompileOnMainThread(); |
| 311 ASSERT_TRUE(job->can_compile_on_background_thread()); | |
| 312 | 286 |
| 313 base::Semaphore semaphore(0); | 287 base::Semaphore semaphore(0); |
| 314 CompileTask* background_task = new CompileTask(job.get(), &semaphore); | 288 CompileTask* background_task = new CompileTask(job.get(), &semaphore); |
| 315 V8::GetCurrentPlatform()->CallOnBackgroundThread(background_task, | 289 V8::GetCurrentPlatform()->CallOnBackgroundThread(background_task, |
| 316 Platform::kShortRunningTask); | 290 Platform::kShortRunningTask); |
| 317 semaphore.Wait(); | 291 semaphore.Wait(); |
| 318 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); | 292 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); |
| 319 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); | 293 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); |
| 320 | 294 |
| 321 job->ResetOnMainThread(); | 295 job->ResetOnMainThread(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 348 Handle<JSFunction> e = Handle<JSFunction>::cast(RunJS(isolate(), "f();")); | 322 Handle<JSFunction> e = Handle<JSFunction>::cast(RunJS(isolate(), "f();")); |
| 349 | 323 |
| 350 ASSERT_FALSE(e->shared()->HasBaselineCode()); | 324 ASSERT_FALSE(e->shared()->HasBaselineCode()); |
| 351 | 325 |
| 352 job->ResetOnMainThread(); | 326 job->ResetOnMainThread(); |
| 353 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); | 327 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
| 354 } | 328 } |
| 355 | 329 |
| 356 } // namespace internal | 330 } // namespace internal |
| 357 } // namespace v8 | 331 } // namespace v8 |
| OLD | NEW |