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

Side by Side Diff: test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc

Issue 2679193004: [Compiler] Ensure we enter the correct context for compiler-dispatcher jobs. (Closed)
Patch Set: 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 unified diff | Download patch
« no previous file with comments | « src/compiler-dispatcher/compiler-dispatcher-job.cc ('k') | test/unittests/test-utils.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/base/platform/semaphore.h" 8 #include "src/base/platform/semaphore.h"
9 #include "src/compiler-dispatcher/compiler-dispatcher-job.h" 9 #include "src/compiler-dispatcher/compiler-dispatcher-job.h"
10 #include "src/compiler-dispatcher/compiler-dispatcher-tracer.h" 10 #include "src/compiler-dispatcher/compiler-dispatcher-tracer.h"
11 #include "src/compiler.h" 11 #include "src/compiler.h"
12 #include "src/flags.h" 12 #include "src/flags.h"
13 #include "src/handles.h" 13 #include "src/handles.h"
14 #include "src/objects-inl.h" 14 #include "src/objects-inl.h"
15 #include "src/parsing/parse-info.h" 15 #include "src/parsing/parse-info.h"
16 #include "src/v8.h" 16 #include "src/v8.h"
17 #include "test/unittests/compiler-dispatcher/compiler-dispatcher-helper.h" 17 #include "test/unittests/compiler-dispatcher/compiler-dispatcher-helper.h"
18 #include "test/unittests/test-utils.h" 18 #include "test/unittests/test-utils.h"
19 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
20 20
21 namespace v8 { 21 namespace v8 {
22 namespace internal { 22 namespace internal {
23 23
24 class CompilerDispatcherTestFlags {
25 public:
26 static void SetFlagsForTest() {
27 old_compiler_dispatcher_flag_ = i::FLAG_compiler_dispatcher;
28 i::FLAG_compiler_dispatcher = true;
29 old_ignition_flag_ = i::FLAG_ignition;
30 i::FLAG_ignition = true;
31 old_allow_natives_syntax_flag_ = i::FLAG_allow_natives_syntax;
32 i::FLAG_allow_natives_syntax = true;
33 }
34
35 static void RestoreFlags() {
36 i::FLAG_compiler_dispatcher = old_compiler_dispatcher_flag_;
37 i::FLAG_ignition = old_ignition_flag_;
38 i::FLAG_allow_natives_syntax = old_allow_natives_syntax_flag_;
39 }
40
41 private:
42 static bool old_compiler_dispatcher_flag_;
43 static bool old_ignition_flag_;
44 static bool old_allow_natives_syntax_flag_;
45
46 DISALLOW_IMPLICIT_CONSTRUCTORS(CompilerDispatcherTestFlags);
47 };
48
49 bool CompilerDispatcherTestFlags::old_compiler_dispatcher_flag_;
50 bool CompilerDispatcherTestFlags::old_ignition_flag_;
51 bool CompilerDispatcherTestFlags::old_allow_natives_syntax_flag_;
52
24 class CompilerDispatcherTest : public TestWithContext { 53 class CompilerDispatcherTest : public TestWithContext {
25 public: 54 public:
26 CompilerDispatcherTest() = default; 55 CompilerDispatcherTest() = default;
27 ~CompilerDispatcherTest() override = default; 56 ~CompilerDispatcherTest() override = default;
28 57
29 static void SetUpTestCase() { 58 static void SetUpTestCase() {
30 old_flag_ = i::FLAG_ignition; 59 CompilerDispatcherTestFlags::SetFlagsForTest();
31 i::FLAG_compiler_dispatcher = true;
32 old_ignition_flag_ = i::FLAG_ignition;
33 i::FLAG_ignition = true;
34 TestWithContext::SetUpTestCase(); 60 TestWithContext::SetUpTestCase();
35 } 61 }
36 62
37 static void TearDownTestCase() { 63 static void TearDownTestCase() {
38 TestWithContext::TearDownTestCase(); 64 TestWithContext::TearDownTestCase();
39 i::FLAG_compiler_dispatcher = old_flag_; 65 CompilerDispatcherTestFlags::RestoreFlags();
40 i::FLAG_ignition = old_ignition_flag_;
41 } 66 }
42 67
43 private: 68 private:
44 static bool old_flag_;
45 static bool old_ignition_flag_;
46
47 DISALLOW_COPY_AND_ASSIGN(CompilerDispatcherTest); 69 DISALLOW_COPY_AND_ASSIGN(CompilerDispatcherTest);
48 }; 70 };
49 71
50 bool CompilerDispatcherTest::old_flag_; 72 class CompilerDispatcherTestWithoutContext : public v8::TestWithIsolate {
51 bool CompilerDispatcherTest::old_ignition_flag_; 73 public:
74 CompilerDispatcherTestWithoutContext() = default;
75 ~CompilerDispatcherTestWithoutContext() override = default;
76
77 static void SetUpTestCase() {
78 CompilerDispatcherTestFlags::SetFlagsForTest();
79 TestWithContext::SetUpTestCase();
80 }
81
82 static void TearDownTestCase() {
83 TestWithContext::TearDownTestCase();
84 CompilerDispatcherTestFlags::RestoreFlags();
85 }
86
87 private:
88 DISALLOW_COPY_AND_ASSIGN(CompilerDispatcherTestWithoutContext);
89 };
52 90
53 namespace { 91 namespace {
54 92
55 class MockPlatform : public v8::Platform { 93 class MockPlatform : public v8::Platform {
56 public: 94 public:
57 MockPlatform() : time_(0.0), time_step_(0.0), idle_task_(nullptr), sem_(0) {} 95 MockPlatform() : time_(0.0), time_step_(0.0), idle_task_(nullptr), sem_(0) {}
58 ~MockPlatform() override { 96 ~MockPlatform() override {
59 base::LockGuard<base::Mutex> lock(&mutex_); 97 base::LockGuard<base::Mutex> lock(&mutex_);
60 EXPECT_TRUE(foreground_tasks_.empty()); 98 EXPECT_TRUE(foreground_tasks_.empty());
61 EXPECT_TRUE(background_tasks_.empty()); 99 EXPECT_TRUE(background_tasks_.empty());
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 931
894 // Finishing removes the SFI from the queue. 932 // Finishing removes the SFI from the queue.
895 ASSERT_FALSE(dispatcher.IsEnqueued(shared1)); 933 ASSERT_FALSE(dispatcher.IsEnqueued(shared1));
896 ASSERT_FALSE(dispatcher.IsEnqueued(shared2)); 934 ASSERT_FALSE(dispatcher.IsEnqueued(shared2));
897 ASSERT_TRUE(shared1->is_compiled()); 935 ASSERT_TRUE(shared1->is_compiled());
898 ASSERT_TRUE(shared2->is_compiled()); 936 ASSERT_TRUE(shared2->is_compiled());
899 ASSERT_TRUE(platform.IdleTaskPending()); 937 ASSERT_TRUE(platform.IdleTaskPending());
900 platform.ClearIdleTask(); 938 platform.ClearIdleTask();
901 } 939 }
902 940
941 static const char kExtensionSource[] = "native function Dummy();";
jochen (gone - plz use gerrit) 2017/02/08 18:52:58 put this (and the class) in an anonymous namespace
rmcilroy 2017/02/08 22:49:23 Done.
942
943 class MockNativeFunctionExtension : public Extension {
944 public:
945 MockNativeFunctionExtension()
946 : Extension("mock-extension", kExtensionSource), function_(&Dummy) {}
947
948 virtual v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate(
949 v8::Isolate* isolate, v8::Local<v8::String> name) {
950 return v8::FunctionTemplate::New(isolate, function_);
951 }
952
953 static void Dummy(const v8::FunctionCallbackInfo<v8::Value>& args) { return; }
954
955 private:
956 v8::FunctionCallback function_;
957 };
jochen (gone - plz use gerrit) 2017/02/08 18:52:58 disallow copy/assign
rmcilroy 2017/02/08 22:49:23 Done.
958
959 TEST_F(CompilerDispatcherTestWithoutContext, CompileExtensionWithoutContext) {
960 MockPlatform platform;
961 CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
962 Local<v8::Context> context = v8::Context::New(isolate());
963
964 MockNativeFunctionExtension extension;
965 Handle<String> script_str =
966 i_isolate()
967 ->factory()
968 ->NewStringFromUtf8(CStrVector(kExtensionSource))
969 .ToHandleChecked();
970 Handle<Script> script = i_isolate()->factory()->NewScript(script_str);
971 script->set_type(Script::TYPE_EXTENSION);
972
973 ParseInfo parse_info(script);
974 parse_info.set_extension(&extension);
975
976 std::shared_ptr<DeferredHandles> handles;
977 Handle<SharedFunctionInfo> shared;
978 {
979 v8::Context::Scope scope(context);
980 ASSERT_TRUE(Compiler::ParseAndAnalyze(&parse_info));
981
982 shared = i_isolate()->factory()->NewSharedFunctionInfoForLiteral(
983 parse_info.literal(), script);
984 parse_info.set_shared_info(shared);
985
986 ASSERT_FALSE(platform.IdleTaskPending());
987 ASSERT_TRUE(dispatcher.Enqueue(shared, parse_info.literal(),
988 parse_info.zone_shared(), handles, handles));
989 ASSERT_TRUE(platform.IdleTaskPending());
990 }
991 // Exit the context scope before running the idle task.
992
993 // Since time doesn't progress on the MockPlatform, this is enough idle time
994 // to finish compiling the function.
995 platform.RunIdleTask(1000.0, 0.0);
996
997 ASSERT_FALSE(dispatcher.IsEnqueued(shared));
998 ASSERT_TRUE(shared->is_compiled());
999 }
1000
903 } // namespace internal 1001 } // namespace internal
904 } // namespace v8 1002 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler-dispatcher/compiler-dispatcher-job.cc ('k') | test/unittests/test-utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698