OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 <iostream> | 5 #include <iostream> |
6 | 6 |
7 #include "src/compiler/bytecode-graph-builder.h" | 7 #include "src/compiler/bytecode-graph-builder.h" |
8 #include "src/compiler/common-operator.h" | 8 #include "src/compiler/common-operator.h" |
9 #include "src/compiler/graph-visualizer.h" | 9 #include "src/compiler/graph-visualizer.h" |
10 #include "src/compiler/instruction.h" | 10 #include "src/compiler/instruction.h" |
(...skipping 22 matching lines...) Expand all Loading... |
33 Handle<TypeFeedbackMetadata> vector_metadata = | 33 Handle<TypeFeedbackMetadata> vector_metadata = |
34 TypeFeedbackMetadata::New(isolate, spec); | 34 TypeFeedbackMetadata::New(isolate, spec); |
35 return TypeFeedbackVector::New(isolate, vector_metadata); | 35 return TypeFeedbackVector::New(isolate, vector_metadata); |
36 } | 36 } |
37 | 37 |
38 | 38 |
39 class BytecodeGraphBuilderTest : public TestWithIsolateAndZone { | 39 class BytecodeGraphBuilderTest : public TestWithIsolateAndZone { |
40 public: | 40 public: |
41 BytecodeGraphBuilderTest() {} | 41 BytecodeGraphBuilderTest() {} |
42 | 42 |
| 43 std::pair<Graph*, Handle<SharedFunctionInfo>> GetCompletedGraphAndSharedInfo( |
| 44 Handle<BytecodeArray> bytecode_array, |
| 45 MaybeHandle<TypeFeedbackVector> feedback_vector = |
| 46 MaybeHandle<TypeFeedbackVector>(), |
| 47 LanguageMode language_mode = LanguageMode::SLOPPY); |
| 48 |
43 Graph* GetCompletedGraph(Handle<BytecodeArray> bytecode_array, | 49 Graph* GetCompletedGraph(Handle<BytecodeArray> bytecode_array, |
44 MaybeHandle<TypeFeedbackVector> feedback_vector = | 50 MaybeHandle<TypeFeedbackVector> feedback_vector = |
45 MaybeHandle<TypeFeedbackVector>(), | 51 MaybeHandle<TypeFeedbackVector>(), |
46 LanguageMode language_mode = LanguageMode::SLOPPY); | 52 LanguageMode language_mode = LanguageMode::SLOPPY); |
47 | 53 |
48 Matcher<Node*> IsUndefinedConstant(); | 54 Matcher<Node*> IsUndefinedConstant(); |
49 Matcher<Node*> IsNullConstant(); | 55 Matcher<Node*> IsNullConstant(); |
50 Matcher<Node*> IsTheHoleConstant(); | 56 Matcher<Node*> IsTheHoleConstant(); |
51 Matcher<Node*> IsFalseConstant(); | 57 Matcher<Node*> IsFalseConstant(); |
52 Matcher<Node*> IsTrueConstant(); | 58 Matcher<Node*> IsTrueConstant(); |
53 Matcher<Node*> IsIntPtrConstant(int value); | 59 Matcher<Node*> IsIntPtrConstant(int value); |
54 Matcher<Node*> IsFeedbackVector(Node* effect, Node* control); | 60 Matcher<Node*> IsFeedbackVector(Node* effect, Node* control); |
55 | 61 |
56 static Handle<String> GetName(Isolate* isolate, const char* name) { | 62 static Handle<String> GetName(Isolate* isolate, const char* name) { |
57 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(name); | 63 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(name); |
58 return isolate->factory()->string_table()->LookupString(isolate, result); | 64 return isolate->factory()->string_table()->LookupString(isolate, result); |
59 } | 65 } |
60 | 66 |
61 private: | 67 private: |
62 DISALLOW_COPY_AND_ASSIGN(BytecodeGraphBuilderTest); | 68 DISALLOW_COPY_AND_ASSIGN(BytecodeGraphBuilderTest); |
63 }; | 69 }; |
64 | 70 |
65 | 71 |
66 Graph* BytecodeGraphBuilderTest::GetCompletedGraph( | 72 std::pair<Graph*, Handle<SharedFunctionInfo>> |
| 73 BytecodeGraphBuilderTest::GetCompletedGraphAndSharedInfo( |
67 Handle<BytecodeArray> bytecode_array, | 74 Handle<BytecodeArray> bytecode_array, |
68 MaybeHandle<TypeFeedbackVector> feedback_vector, | 75 MaybeHandle<TypeFeedbackVector> feedback_vector, |
69 LanguageMode language_mode) { | 76 LanguageMode language_mode) { |
70 MachineOperatorBuilder* machine = new (zone()) MachineOperatorBuilder( | 77 MachineOperatorBuilder* machine = new (zone()) MachineOperatorBuilder( |
71 zone(), kMachPtr, InstructionSelector::SupportedMachineOperatorFlags()); | 78 zone(), kMachPtr, InstructionSelector::SupportedMachineOperatorFlags()); |
72 CommonOperatorBuilder* common = new (zone()) CommonOperatorBuilder(zone()); | 79 CommonOperatorBuilder* common = new (zone()) CommonOperatorBuilder(zone()); |
73 JSOperatorBuilder* javascript = new (zone()) JSOperatorBuilder(zone()); | 80 JSOperatorBuilder* javascript = new (zone()) JSOperatorBuilder(zone()); |
74 Graph* graph = new (zone()) Graph(zone()); | 81 Graph* graph = new (zone()) Graph(zone()); |
75 JSGraph* jsgraph = new (zone()) | 82 JSGraph* jsgraph = new (zone()) |
76 JSGraph(isolate(), graph, common, javascript, nullptr, machine); | 83 JSGraph(isolate(), graph, common, javascript, nullptr, machine); |
77 | 84 |
78 Handle<String> name = factory()->NewStringFromStaticChars("test"); | 85 Handle<String> name = factory()->NewStringFromStaticChars("test"); |
79 Handle<String> script = factory()->NewStringFromStaticChars("test() {}"); | 86 Handle<String> script = factory()->NewStringFromStaticChars("test() {}"); |
80 Handle<SharedFunctionInfo> shared_info = | 87 Handle<SharedFunctionInfo> shared_info = |
81 factory()->NewSharedFunctionInfo(name, MaybeHandle<Code>(), true); | 88 factory()->NewSharedFunctionInfo(name, MaybeHandle<Code>(), true); |
82 shared_info->set_script(*factory()->NewScript(script)); | 89 shared_info->set_script(*factory()->NewScript(script)); |
83 if (!feedback_vector.is_null()) { | 90 if (!feedback_vector.is_null()) { |
84 shared_info->set_feedback_vector(*feedback_vector.ToHandleChecked()); | 91 shared_info->set_feedback_vector(*feedback_vector.ToHandleChecked()); |
85 } | 92 } |
86 | 93 |
87 ParseInfo parse_info(zone(), shared_info); | 94 ParseInfo parse_info(zone(), shared_info); |
88 parse_info.set_language_mode(language_mode); | 95 parse_info.set_language_mode(language_mode); |
89 CompilationInfo info(&parse_info); | 96 CompilationInfo info(&parse_info); |
90 info.shared_info()->set_function_data(*bytecode_array); | 97 info.shared_info()->set_function_data(*bytecode_array); |
91 | 98 |
92 BytecodeGraphBuilder graph_builder(zone(), &info, jsgraph); | 99 BytecodeGraphBuilder graph_builder(zone(), &info, jsgraph); |
93 graph_builder.CreateGraph(); | 100 graph_builder.CreateGraph(); |
94 return graph; | 101 return std::make_pair(graph_builder.graph(), shared_info); |
95 } | 102 } |
96 | 103 |
97 | 104 |
| 105 Graph* BytecodeGraphBuilderTest::GetCompletedGraph( |
| 106 Handle<BytecodeArray> bytecode_array, |
| 107 MaybeHandle<TypeFeedbackVector> feedback_vector, |
| 108 LanguageMode language_mode) { |
| 109 return GetCompletedGraphAndSharedInfo(bytecode_array, feedback_vector, |
| 110 language_mode) |
| 111 .first; |
| 112 } |
| 113 |
| 114 |
98 Matcher<Node*> BytecodeGraphBuilderTest::IsUndefinedConstant() { | 115 Matcher<Node*> BytecodeGraphBuilderTest::IsUndefinedConstant() { |
99 return IsHeapConstant(factory()->undefined_value()); | 116 return IsHeapConstant(factory()->undefined_value()); |
100 } | 117 } |
101 | 118 |
102 | 119 |
103 Matcher<Node*> BytecodeGraphBuilderTest::IsNullConstant() { | 120 Matcher<Node*> BytecodeGraphBuilderTest::IsNullConstant() { |
104 return IsHeapConstant(factory()->null_value()); | 121 return IsHeapConstant(factory()->null_value()); |
105 } | 122 } |
106 | 123 |
107 | 124 |
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
800 construct_inputs.push_back(IsParameter(1)); | 817 construct_inputs.push_back(IsParameter(1)); |
801 construct_inputs.push_back(IsParameter(2)); | 818 construct_inputs.push_back(IsParameter(2)); |
802 construct_inputs.push_back(IsParameter(3)); | 819 construct_inputs.push_back(IsParameter(3)); |
803 construct_inputs.push_back(IsParameter(4)); | 820 construct_inputs.push_back(IsParameter(4)); |
804 construct_inputs.push_back(IsParameter(1)); | 821 construct_inputs.push_back(IsParameter(1)); |
805 Matcher<Node*> call_construct = | 822 Matcher<Node*> call_construct = |
806 IsJSCallConstruct(construct_inputs, start, start); | 823 IsJSCallConstruct(construct_inputs, start, start); |
807 EXPECT_THAT(ret, IsReturn(call_construct, call_construct, IsIfSuccess(_))); | 824 EXPECT_THAT(ret, IsReturn(call_construct, call_construct, IsIfSuccess(_))); |
808 } | 825 } |
809 | 826 |
| 827 |
| 828 TEST_F(BytecodeGraphBuilderTest, CreateClosure) { |
| 829 PretenureFlag kPretenureFlags[] = {NOT_TENURED, TENURED}; |
| 830 TRACED_FOREACH(PretenureFlag, pretenure_flag, kPretenureFlags) { |
| 831 interpreter::BytecodeArrayBuilder inner_builder(isolate(), zone()); |
| 832 inner_builder.set_locals_count(0); |
| 833 inner_builder.set_context_count(0); |
| 834 inner_builder.set_parameter_count(3); |
| 835 inner_builder.LoadAccumulatorWithRegister(inner_builder.Parameter(2)) |
| 836 .BinaryOperation(Token::Value::ADD, inner_builder.Parameter(1), |
| 837 Strength::WEAK) |
| 838 .Return(); |
| 839 |
| 840 std::pair<Graph*, Handle<SharedFunctionInfo>> inner_graph_and_shared_info = |
| 841 GetCompletedGraphAndSharedInfo(inner_builder.ToBytecodeArray()); |
| 842 Handle<SharedFunctionInfo> shared_info = inner_graph_and_shared_info.second; |
| 843 |
| 844 interpreter::BytecodeArrayBuilder builder(isolate(), zone()); |
| 845 builder.set_locals_count(4); |
| 846 builder.set_context_count(0); |
| 847 builder.set_parameter_count(3); |
| 848 builder.CreateClosure(shared_info, pretenure_flag).Return(); |
| 849 |
| 850 Graph* graph = GetCompletedGraph(builder.ToBytecodeArray()); |
| 851 Node* start = graph->start(); |
| 852 Node* ret = graph->end()->InputAt(0); |
| 853 |
| 854 Matcher<Node*> create_closure = |
| 855 IsCreateClosure(shared_info, pretenure_flag, start, start); |
| 856 EXPECT_THAT(ret, IsReturn(create_closure, create_closure, start)); |
| 857 } |
| 858 } |
| 859 |
810 } // namespace compiler | 860 } // namespace compiler |
811 } // namespace internal | 861 } // namespace internal |
812 } // namespace v8 | 862 } // namespace v8 |
OLD | NEW |