| 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 |