| 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/js-create-lowering.h" | 5 #include "src/compiler/js-create-lowering.h" |
| 6 | 6 |
| 7 #include "src/allocation-site-scopes.h" | 7 #include "src/allocation-site-scopes.h" |
| 8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
| 9 #include "src/compilation-dependencies.h" | 9 #include "src/compilation-dependencies.h" |
| 10 #include "src/compiler/access-builder.h" | 10 #include "src/compiler/access-builder.h" |
| (...skipping 704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 a.Store(AccessBuilder::ForJSFunctionNextFunctionLink(), undefined); | 715 a.Store(AccessBuilder::ForJSFunctionNextFunctionLink(), undefined); |
| 716 RelaxControls(node); | 716 RelaxControls(node); |
| 717 a.FinishAndChange(node); | 717 a.FinishAndChange(node); |
| 718 return Changed(node); | 718 return Changed(node); |
| 719 } | 719 } |
| 720 | 720 |
| 721 Reduction JSCreateLowering::ReduceJSCreateIterResultObject(Node* node) { | 721 Reduction JSCreateLowering::ReduceJSCreateIterResultObject(Node* node) { |
| 722 DCHECK_EQ(IrOpcode::kJSCreateIterResultObject, node->opcode()); | 722 DCHECK_EQ(IrOpcode::kJSCreateIterResultObject, node->opcode()); |
| 723 Node* value = NodeProperties::GetValueInput(node, 0); | 723 Node* value = NodeProperties::GetValueInput(node, 0); |
| 724 Node* done = NodeProperties::GetValueInput(node, 1); | 724 Node* done = NodeProperties::GetValueInput(node, 1); |
| 725 Node* context = NodeProperties::GetContextInput(node); | |
| 726 Node* effect = NodeProperties::GetEffectInput(node); | 725 Node* effect = NodeProperties::GetEffectInput(node); |
| 727 | 726 |
| 728 // Load the JSIteratorResult map for the {context}. | 727 Node* iterator_result_map; |
| 729 Node* native_context = effect = graph()->NewNode( | 728 Handle<Context> native_context; |
| 730 javascript()->LoadContext(0, Context::NATIVE_CONTEXT_INDEX, true), | 729 if (GetSpecializationNativeContext(node).ToHandle(&native_context)) { |
| 731 context, context, effect); | 730 // Specialize to the constant JSIteratorResult map to enable map check |
| 732 Node* iterator_result_map = effect = graph()->NewNode( | 731 // elimination to eliminate subsequent checks in case of inlining. |
| 733 javascript()->LoadContext(0, Context::ITERATOR_RESULT_MAP_INDEX, true), | 732 iterator_result_map = jsgraph()->HeapConstant( |
| 734 native_context, native_context, effect); | 733 handle(native_context->iterator_result_map(), isolate())); |
| 734 } else { |
| 735 // Load the JSIteratorResult map for the {context}. |
| 736 Node* context = NodeProperties::GetContextInput(node); |
| 737 Node* native_context = effect = graph()->NewNode( |
| 738 javascript()->LoadContext(0, Context::NATIVE_CONTEXT_INDEX, true), |
| 739 context, context, effect); |
| 740 iterator_result_map = effect = graph()->NewNode( |
| 741 javascript()->LoadContext(0, Context::ITERATOR_RESULT_MAP_INDEX, true), |
| 742 native_context, native_context, effect); |
| 743 } |
| 735 | 744 |
| 736 // Emit code to allocate the JSIteratorResult instance. | 745 // Emit code to allocate the JSIteratorResult instance. |
| 737 AllocationBuilder a(jsgraph(), effect, graph()->start()); | 746 AllocationBuilder a(jsgraph(), effect, graph()->start()); |
| 738 a.Allocate(JSIteratorResult::kSize); | 747 a.Allocate(JSIteratorResult::kSize); |
| 739 a.Store(AccessBuilder::ForMap(), iterator_result_map); | 748 a.Store(AccessBuilder::ForMap(), iterator_result_map); |
| 740 a.Store(AccessBuilder::ForJSObjectProperties(), | 749 a.Store(AccessBuilder::ForJSObjectProperties(), |
| 741 jsgraph()->EmptyFixedArrayConstant()); | 750 jsgraph()->EmptyFixedArrayConstant()); |
| 742 a.Store(AccessBuilder::ForJSObjectElements(), | 751 a.Store(AccessBuilder::ForJSObjectElements(), |
| 743 jsgraph()->EmptyFixedArrayConstant()); | 752 jsgraph()->EmptyFixedArrayConstant()); |
| 744 a.Store(AccessBuilder::ForJSIteratorResultValue(), value); | 753 a.Store(AccessBuilder::ForJSIteratorResultValue(), value); |
| (...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1264 return literals_array_; | 1273 return literals_array_; |
| 1265 } | 1274 } |
| 1266 break; | 1275 break; |
| 1267 } | 1276 } |
| 1268 default: | 1277 default: |
| 1269 break; | 1278 break; |
| 1270 } | 1279 } |
| 1271 return MaybeHandle<LiteralsArray>(); | 1280 return MaybeHandle<LiteralsArray>(); |
| 1272 } | 1281 } |
| 1273 | 1282 |
| 1283 MaybeHandle<Context> JSCreateLowering::GetSpecializationNativeContext( |
| 1284 Node* node) { |
| 1285 Node* const context = NodeProperties::GetContextInput(node); |
| 1286 return NodeProperties::GetSpecializationNativeContext(context, |
| 1287 native_context_); |
| 1288 } |
| 1289 |
| 1274 Factory* JSCreateLowering::factory() const { return isolate()->factory(); } | 1290 Factory* JSCreateLowering::factory() const { return isolate()->factory(); } |
| 1275 | 1291 |
| 1276 Graph* JSCreateLowering::graph() const { return jsgraph()->graph(); } | 1292 Graph* JSCreateLowering::graph() const { return jsgraph()->graph(); } |
| 1277 | 1293 |
| 1278 Isolate* JSCreateLowering::isolate() const { return jsgraph()->isolate(); } | 1294 Isolate* JSCreateLowering::isolate() const { return jsgraph()->isolate(); } |
| 1279 | 1295 |
| 1280 JSOperatorBuilder* JSCreateLowering::javascript() const { | 1296 JSOperatorBuilder* JSCreateLowering::javascript() const { |
| 1281 return jsgraph()->javascript(); | 1297 return jsgraph()->javascript(); |
| 1282 } | 1298 } |
| 1283 | 1299 |
| 1284 CommonOperatorBuilder* JSCreateLowering::common() const { | 1300 CommonOperatorBuilder* JSCreateLowering::common() const { |
| 1285 return jsgraph()->common(); | 1301 return jsgraph()->common(); |
| 1286 } | 1302 } |
| 1287 | 1303 |
| 1288 SimplifiedOperatorBuilder* JSCreateLowering::simplified() const { | 1304 SimplifiedOperatorBuilder* JSCreateLowering::simplified() const { |
| 1289 return jsgraph()->simplified(); | 1305 return jsgraph()->simplified(); |
| 1290 } | 1306 } |
| 1291 | 1307 |
| 1292 MachineOperatorBuilder* JSCreateLowering::machine() const { | 1308 MachineOperatorBuilder* JSCreateLowering::machine() const { |
| 1293 return jsgraph()->machine(); | 1309 return jsgraph()->machine(); |
| 1294 } | 1310 } |
| 1295 | 1311 |
| 1296 } // namespace compiler | 1312 } // namespace compiler |
| 1297 } // namespace internal | 1313 } // namespace internal |
| 1298 } // namespace v8 | 1314 } // namespace v8 |
| OLD | NEW |