OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/js-builtin-reducer.h" | 5 #include "src/compiler/js-builtin-reducer.h" |
6 | 6 |
7 #include "src/compilation-dependencies.h" | 7 #include "src/compilation-dependencies.h" |
8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 // Skip first (i.e. callee) and second (i.e. receiver) operand. | 89 // Skip first (i.e. callee) and second (i.e. receiver) operand. |
90 return NodeProperties::GetValueInput(node_, index + 2); | 90 return NodeProperties::GetValueInput(node_, index + 2); |
91 } | 91 } |
92 | 92 |
93 private: | 93 private: |
94 Node* node_; | 94 Node* node_; |
95 }; | 95 }; |
96 | 96 |
97 JSBuiltinReducer::JSBuiltinReducer(Editor* editor, JSGraph* jsgraph, | 97 JSBuiltinReducer::JSBuiltinReducer(Editor* editor, JSGraph* jsgraph, |
98 Flags flags, | 98 Flags flags, |
99 CompilationDependencies* dependencies) | 99 CompilationDependencies* dependencies, |
| 100 Handle<Context> native_context) |
100 : AdvancedReducer(editor), | 101 : AdvancedReducer(editor), |
101 dependencies_(dependencies), | 102 dependencies_(dependencies), |
102 flags_(flags), | 103 flags_(flags), |
103 jsgraph_(jsgraph), | 104 jsgraph_(jsgraph), |
| 105 native_context_(native_context), |
104 type_cache_(TypeCache::Get()) {} | 106 type_cache_(TypeCache::Get()) {} |
105 | 107 |
106 namespace { | 108 namespace { |
107 | 109 |
108 MaybeHandle<Map> GetMapWitness(Node* node) { | 110 MaybeHandle<Map> GetMapWitness(Node* node) { |
109 Node* receiver = NodeProperties::GetValueInput(node, 1); | 111 Node* receiver = NodeProperties::GetValueInput(node, 1); |
110 Node* effect = NodeProperties::GetEffectInput(node); | 112 Node* effect = NodeProperties::GetEffectInput(node); |
111 // Check if the {node} is dominated by a CheckMaps with a single map | 113 // Check if the {node} is dominated by a CheckMaps with a single map |
112 // for the {receiver}, and if so use that map for the lowering below. | 114 // for the {receiver}, and if so use that map for the lowering below. |
113 for (Node* dominator = effect;;) { | 115 for (Node* dominator = effect;;) { |
(...skipping 912 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1026 } | 1028 } |
1027 } | 1029 } |
1028 | 1030 |
1029 return NoChange(); | 1031 return NoChange(); |
1030 } | 1032 } |
1031 | 1033 |
1032 Reduction JSBuiltinReducer::ReduceStringIterator(Node* node) { | 1034 Reduction JSBuiltinReducer::ReduceStringIterator(Node* node) { |
1033 if (Node* receiver = GetStringWitness(node)) { | 1035 if (Node* receiver = GetStringWitness(node)) { |
1034 Node* effect = NodeProperties::GetEffectInput(node); | 1036 Node* effect = NodeProperties::GetEffectInput(node); |
1035 Node* control = NodeProperties::GetControlInput(node); | 1037 Node* control = NodeProperties::GetControlInput(node); |
1036 Node* context = NodeProperties::GetContextInput(node); | |
1037 | 1038 |
1038 Node* native_context = effect = graph()->NewNode( | 1039 Node* map = jsgraph()->HeapConstant( |
1039 javascript()->LoadContext(0, Context::NATIVE_CONTEXT_INDEX, true), | 1040 handle(native_context()->string_iterator_map(), isolate())); |
1040 context, context, effect); | |
1041 Node* map = effect = graph()->NewNode( | |
1042 javascript()->LoadContext(0, Context::STRING_ITERATOR_MAP_INDEX, true), | |
1043 native_context, native_context, effect); | |
1044 | 1041 |
1045 // allocate new iterator | 1042 // allocate new iterator |
1046 effect = graph()->NewNode( | 1043 effect = graph()->NewNode( |
1047 common()->BeginRegion(RegionObservability::kNotObservable), effect); | 1044 common()->BeginRegion(RegionObservability::kNotObservable), effect); |
1048 Node* value = effect = graph()->NewNode( | 1045 Node* value = effect = graph()->NewNode( |
1049 simplified()->Allocate(NOT_TENURED), | 1046 simplified()->Allocate(NOT_TENURED), |
1050 jsgraph()->Int32Constant(JSStringIterator::kSize), effect, control); | 1047 jsgraph()->Int32Constant(JSStringIterator::kSize), effect, control); |
1051 effect = graph()->NewNode(simplified()->StoreField(AccessBuilder::ForMap()), | 1048 effect = graph()->NewNode(simplified()->StoreField(AccessBuilder::ForMap()), |
1052 value, map, effect, control); | 1049 value, map, effect, control); |
1053 effect = graph()->NewNode( | 1050 effect = graph()->NewNode( |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1446 return jsgraph()->simplified(); | 1443 return jsgraph()->simplified(); |
1447 } | 1444 } |
1448 | 1445 |
1449 JSOperatorBuilder* JSBuiltinReducer::javascript() const { | 1446 JSOperatorBuilder* JSBuiltinReducer::javascript() const { |
1450 return jsgraph()->javascript(); | 1447 return jsgraph()->javascript(); |
1451 } | 1448 } |
1452 | 1449 |
1453 } // namespace compiler | 1450 } // namespace compiler |
1454 } // namespace internal | 1451 } // namespace internal |
1455 } // namespace v8 | 1452 } // namespace v8 |
OLD | NEW |