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

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

Issue 2650883002: Reland: [Compiler] Enable handles created during parsing and scope analysis to be deferred. (Closed)
Patch Set: Remove unused variable 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/pending-compilation-error-handler.cc ('k') | no next file » | 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/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
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
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
OLDNEW
« no previous file with comments | « src/pending-compilation-error-handler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698