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/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/parsing/parsing.h" |
16 #include "src/v8.h" | 17 #include "src/v8.h" |
17 #include "test/unittests/compiler-dispatcher/compiler-dispatcher-helper.h" | 18 #include "test/unittests/compiler-dispatcher/compiler-dispatcher-helper.h" |
18 #include "test/unittests/test-utils.h" | 19 #include "test/unittests/test-utils.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
20 | 21 |
21 namespace v8 { | 22 namespace v8 { |
22 namespace internal { | 23 namespace internal { |
23 | 24 |
24 class CompilerDispatcherTest : public TestWithContext { | 25 class CompilerDispatcherTest : public TestWithContext { |
25 public: | 26 public: |
(...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
809 CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size); | 810 CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size); |
810 | 811 |
811 const char script[] = | 812 const char script[] = |
812 "function g() { var y = 1; function f17(x) { return x * y }; return f17; " | 813 "function g() { var y = 1; function f17(x) { return x * y }; return f17; " |
813 "} g();"; | 814 "} g();"; |
814 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); | 815 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); |
815 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); | 816 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); |
816 | 817 |
817 ParseInfo parse_info(shared); | 818 ParseInfo parse_info(shared); |
818 ASSERT_TRUE(Compiler::ParseAndAnalyze(&parse_info)); | 819 ASSERT_TRUE(Compiler::ParseAndAnalyze(&parse_info)); |
| 820 std::shared_ptr<DeferredHandles> handles; |
819 | 821 |
820 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); | 822 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); |
821 ASSERT_TRUE(dispatcher.Enqueue(shared, parse_info.literal())); | 823 ASSERT_TRUE(dispatcher.Enqueue(shared, parse_info.literal(), |
| 824 parse_info.zone_shared(), handles, handles)); |
822 ASSERT_TRUE(dispatcher.IsEnqueued(shared)); | 825 ASSERT_TRUE(dispatcher.IsEnqueued(shared)); |
823 | 826 |
824 ASSERT_TRUE(dispatcher.jobs_.begin()->second->status() == | 827 ASSERT_TRUE(dispatcher.jobs_.begin()->second->status() == |
825 CompileJobStatus::kAnalyzed); | 828 CompileJobStatus::kAnalyzed); |
826 | 829 |
827 ASSERT_TRUE(platform.IdleTaskPending()); | 830 ASSERT_TRUE(platform.IdleTaskPending()); |
828 platform.ClearIdleTask(); | 831 platform.ClearIdleTask(); |
829 ASSERT_FALSE(platform.BackgroundTasksPending()); | 832 ASSERT_FALSE(platform.BackgroundTasksPending()); |
830 } | 833 } |
831 | 834 |
832 TEST_F(CompilerDispatcherTest, EnqueueAndStepParsed) { | 835 TEST_F(CompilerDispatcherTest, EnqueueAndStepParsed) { |
833 MockPlatform platform; | 836 MockPlatform platform; |
834 CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size); | 837 CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size); |
835 | 838 |
836 const char script[] = | 839 const char script[] = |
837 "function g() { var y = 1; function f18(x) { return x * y }; return f18; " | 840 "function g() { var y = 1; function f18(x) { return x * y }; return f18; " |
838 "} g();"; | 841 "} g();"; |
839 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); | 842 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); |
840 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); | 843 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); |
841 | 844 |
842 ParseInfo parse_info(shared); | 845 ParseInfo parse_info(shared); |
843 ASSERT_TRUE(Compiler::ParseAndAnalyze(&parse_info)); | 846 ASSERT_TRUE(Compiler::ParseAndAnalyze(&parse_info)); |
| 847 std::shared_ptr<DeferredHandles> handles; |
844 | 848 |
845 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); | 849 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); |
846 ASSERT_TRUE(dispatcher.EnqueueAndStep(shared, parse_info.literal())); | 850 ASSERT_TRUE(dispatcher.EnqueueAndStep(shared, parse_info.literal(), |
| 851 parse_info.zone_shared(), handles, |
| 852 handles)); |
847 ASSERT_TRUE(dispatcher.IsEnqueued(shared)); | 853 ASSERT_TRUE(dispatcher.IsEnqueued(shared)); |
848 | 854 |
849 ASSERT_TRUE(dispatcher.jobs_.begin()->second->status() == | 855 ASSERT_TRUE(dispatcher.jobs_.begin()->second->status() == |
850 CompileJobStatus::kReadyToCompile); | 856 CompileJobStatus::kReadyToCompile); |
851 | 857 |
852 ASSERT_TRUE(platform.IdleTaskPending()); | 858 ASSERT_TRUE(platform.IdleTaskPending()); |
853 ASSERT_TRUE(platform.BackgroundTasksPending()); | 859 ASSERT_TRUE(platform.BackgroundTasksPending()); |
854 platform.ClearIdleTask(); | 860 platform.ClearIdleTask(); |
855 platform.ClearBackgroundTasks(); | 861 platform.ClearBackgroundTasks(); |
856 } | 862 } |
(...skipping 13 matching lines...) Expand all Loading... |
870 "} g();"; | 876 "} g();"; |
871 Handle<JSFunction> f2 = Handle<JSFunction>::cast(RunJS(isolate(), script2)); | 877 Handle<JSFunction> f2 = Handle<JSFunction>::cast(RunJS(isolate(), script2)); |
872 Handle<SharedFunctionInfo> shared2(f2->shared(), i_isolate()); | 878 Handle<SharedFunctionInfo> shared2(f2->shared(), i_isolate()); |
873 | 879 |
874 ASSERT_FALSE(shared1->is_compiled()); | 880 ASSERT_FALSE(shared1->is_compiled()); |
875 ASSERT_FALSE(shared2->is_compiled()); | 881 ASSERT_FALSE(shared2->is_compiled()); |
876 | 882 |
877 // Enqueue shared1 as already parsed. | 883 // Enqueue shared1 as already parsed. |
878 ParseInfo parse_info(shared1); | 884 ParseInfo parse_info(shared1); |
879 ASSERT_TRUE(Compiler::ParseAndAnalyze(&parse_info)); | 885 ASSERT_TRUE(Compiler::ParseAndAnalyze(&parse_info)); |
880 ASSERT_TRUE(dispatcher.Enqueue(shared1, parse_info.literal())); | 886 std::shared_ptr<DeferredHandles> handles; |
| 887 ASSERT_TRUE(dispatcher.Enqueue(shared1, parse_info.literal(), |
| 888 parse_info.zone_shared(), handles, handles)); |
881 | 889 |
882 // Enqueue shared2 for parsing and compiling | 890 // Enqueue shared2 for parsing and compiling |
883 ASSERT_TRUE(dispatcher.Enqueue(shared2)); | 891 ASSERT_TRUE(dispatcher.Enqueue(shared2)); |
884 | 892 |
885 ASSERT_TRUE(dispatcher.FinishAllNow()); | 893 ASSERT_TRUE(dispatcher.FinishAllNow()); |
886 | 894 |
887 // Finishing removes the SFI from the queue. | 895 // Finishing removes the SFI from the queue. |
888 ASSERT_FALSE(dispatcher.IsEnqueued(shared1)); | 896 ASSERT_FALSE(dispatcher.IsEnqueued(shared1)); |
889 ASSERT_FALSE(dispatcher.IsEnqueued(shared2)); | 897 ASSERT_FALSE(dispatcher.IsEnqueued(shared2)); |
890 ASSERT_TRUE(shared1->is_compiled()); | 898 ASSERT_TRUE(shared1->is_compiled()); |
891 ASSERT_TRUE(shared2->is_compiled()); | 899 ASSERT_TRUE(shared2->is_compiled()); |
892 ASSERT_TRUE(platform.IdleTaskPending()); | 900 ASSERT_TRUE(platform.IdleTaskPending()); |
893 platform.ClearIdleTask(); | 901 platform.ClearIdleTask(); |
894 } | 902 } |
895 | 903 |
| 904 TEST_F(CompilerDispatcherTest, CompileParsedOutOfScope) { |
| 905 MockPlatform platform; |
| 906 CompilerDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size); |
| 907 |
| 908 const char script[] = |
| 909 "function g() { var y = 1; function f20(x) { return x + y }; return f20; " |
| 910 "} g();"; |
| 911 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); |
| 912 Handle<SharedFunctionInfo> shared(f->shared(), i_isolate()); |
| 913 |
| 914 { |
| 915 HandleScope scope(i_isolate()); // Create handles scope for parsing. |
| 916 |
| 917 ASSERT_FALSE(shared->is_compiled()); |
| 918 ParseInfo parse_info(shared); |
| 919 |
| 920 ASSERT_TRUE(parsing::ParseAny(&parse_info)); |
| 921 DeferredHandleScope handles_scope(i_isolate()); |
| 922 { ASSERT_TRUE(Compiler::Analyze(&parse_info)); } |
| 923 std::shared_ptr<DeferredHandles> compilation_handles( |
| 924 handles_scope.Detach()); |
| 925 |
| 926 ASSERT_FALSE(platform.IdleTaskPending()); |
| 927 ASSERT_TRUE(dispatcher.Enqueue( |
| 928 shared, parse_info.literal(), parse_info.zone_shared(), |
| 929 parse_info.deferred_handles(), compilation_handles)); |
| 930 ASSERT_TRUE(platform.IdleTaskPending()); |
| 931 } |
| 932 // Exit the handles scope and destroy ParseInfo before running the idle task. |
| 933 |
| 934 // Since time doesn't progress on the MockPlatform, this is enough idle time |
| 935 // to finish compiling the function. |
| 936 platform.RunIdleTask(1000.0, 0.0); |
| 937 |
| 938 ASSERT_FALSE(dispatcher.IsEnqueued(shared)); |
| 939 ASSERT_TRUE(shared->is_compiled()); |
| 940 } |
| 941 |
896 } // namespace internal | 942 } // namespace internal |
897 } // namespace v8 | 943 } // namespace v8 |
OLD | NEW |