Chromium Code Reviews| 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 "src/compiler/js-native-context-specialization.h" | 5 #include "src/compiler/js-native-context-specialization.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.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 727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 738 | 738 |
| 739 // Compute property access infos for the receiver maps. | 739 // Compute property access infos for the receiver maps. |
| 740 AccessInfoFactory access_info_factory(dependencies(), native_context(), | 740 AccessInfoFactory access_info_factory(dependencies(), native_context(), |
| 741 graph()->zone()); | 741 graph()->zone()); |
| 742 ZoneVector<PropertyAccessInfo> access_infos(zone()); | 742 ZoneVector<PropertyAccessInfo> access_infos(zone()); |
| 743 if (!access_info_factory.ComputePropertyAccessInfos( | 743 if (!access_info_factory.ComputePropertyAccessInfos( |
| 744 receiver_maps, name, access_mode, &access_infos)) { | 744 receiver_maps, name, access_mode, &access_infos)) { |
| 745 return NoChange(); | 745 return NoChange(); |
| 746 } | 746 } |
| 747 | 747 |
| 748 // TODO(turbofan): Add support for inlining into try blocks. | |
| 749 bool is_exceptional = NodeProperties::IsExceptionalCall(node); | |
| 750 for (const auto& access_info : access_infos) { | |
| 751 if (access_info.IsAccessorConstant()) { | |
| 752 // Accessor in try-blocks are not supported yet. | |
| 753 if (is_exceptional || !(flags() & kAccessorInliningEnabled)) { | |
| 754 return NoChange(); | |
| 755 } | |
| 756 } | |
| 757 } | |
| 758 | |
| 759 // Nothing to do if we have no non-deprecated maps. | 748 // Nothing to do if we have no non-deprecated maps. |
| 760 if (access_infos.empty()) { | 749 if (access_infos.empty()) { |
| 761 return ReduceSoftDeoptimize( | 750 return ReduceSoftDeoptimize( |
| 762 node, DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess); | 751 node, DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess); |
| 763 } | 752 } |
| 764 | 753 |
| 765 // Ensure that {index} matches the specified {name} (if {index} is given). | 754 // Ensure that {index} matches the specified {name} (if {index} is given). |
| 766 if (index != nullptr) { | 755 if (index != nullptr) { |
| 767 Node* check = graph()->NewNode(simplified()->ReferenceEqual(), index, | 756 Node* check = graph()->NewNode(simplified()->ReferenceEqual(), index, |
| 768 jsgraph()->HeapConstant(name)); | 757 jsgraph()->HeapConstant(name)); |
| 769 effect = graph()->NewNode(simplified()->CheckIf(), check, effect, control); | 758 effect = graph()->NewNode(simplified()->CheckIf(), check, effect, control); |
| 770 } | 759 } |
| 771 | 760 |
| 761 // Collect call nodes to rewire exception edges. | |
| 762 ZoneVector<Node*> if_exception_nodes(zone()); | |
| 763 ZoneVector<Node*>* if_exceptions = nullptr; | |
| 764 Node* if_exception = nullptr; | |
| 765 if (NodeProperties::IsExceptionalCall(node, &if_exception)) { | |
| 766 if_exceptions = &if_exception_nodes; | |
| 767 } | |
| 768 | |
| 772 // Check for the monomorphic cases. | 769 // Check for the monomorphic cases. |
| 773 if (access_infos.size() == 1) { | 770 if (access_infos.size() == 1) { |
| 774 PropertyAccessInfo access_info = access_infos.front(); | 771 PropertyAccessInfo access_info = access_infos.front(); |
| 775 if (HasOnlyStringMaps(access_info.receiver_maps())) { | 772 if (HasOnlyStringMaps(access_info.receiver_maps())) { |
| 776 // Monormorphic string access (ignoring the fact that there are multiple | 773 // Monormorphic string access (ignoring the fact that there are multiple |
| 777 // String maps). | 774 // String maps). |
| 778 receiver = effect = graph()->NewNode(simplified()->CheckString(), | 775 receiver = effect = graph()->NewNode(simplified()->CheckString(), |
| 779 receiver, effect, control); | 776 receiver, effect, control); |
| 780 } else if (HasOnlyNumberMaps(access_info.receiver_maps())) { | 777 } else if (HasOnlyNumberMaps(access_info.receiver_maps())) { |
| 781 // Monomorphic number access (we also deal with Smis here). | 778 // Monomorphic number access (we also deal with Smis here). |
| 782 receiver = effect = graph()->NewNode(simplified()->CheckNumber(), | 779 receiver = effect = graph()->NewNode(simplified()->CheckNumber(), |
| 783 receiver, effect, control); | 780 receiver, effect, control); |
| 784 } else { | 781 } else { |
| 785 // Monomorphic property access. | 782 // Monomorphic property access. |
| 786 receiver = BuildCheckHeapObject(receiver, &effect, control); | 783 receiver = BuildCheckHeapObject(receiver, &effect, control); |
| 787 effect = BuildCheckMaps(receiver, effect, control, | 784 effect = BuildCheckMaps(receiver, effect, control, |
| 788 access_info.receiver_maps()); | 785 access_info.receiver_maps()); |
| 789 } | 786 } |
| 790 | 787 |
| 791 // Generate the actual property access. | 788 // Generate the actual property access. |
| 792 ValueEffectControl continuation = BuildPropertyAccess( | 789 ValueEffectControl continuation = BuildPropertyAccess( |
| 793 receiver, value, context, frame_state, effect, control, name, | 790 receiver, value, context, frame_state, effect, control, name, |
| 794 access_info, access_mode, language_mode); | 791 if_exceptions, access_info, access_mode, language_mode); |
| 795 value = continuation.value(); | 792 value = continuation.value(); |
| 796 effect = continuation.effect(); | 793 effect = continuation.effect(); |
| 797 control = continuation.control(); | 794 control = continuation.control(); |
| 798 } else { | 795 } else { |
| 799 // The final states for every polymorphic branch. We join them with | 796 // The final states for every polymorphic branch. We join them with |
| 800 // Merge+Phi+EffectPhi at the bottom. | 797 // Merge+Phi+EffectPhi at the bottom. |
| 801 ZoneVector<Node*> values(zone()); | 798 ZoneVector<Node*> values(zone()); |
| 802 ZoneVector<Node*> effects(zone()); | 799 ZoneVector<Node*> effects(zone()); |
| 803 ZoneVector<Node*> controls(zone()); | 800 ZoneVector<Node*> controls(zone()); |
| 804 | 801 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 887 graph()->NewNode(common()->Merge(this_control_count), | 884 graph()->NewNode(common()->Merge(this_control_count), |
| 888 this_control_count, &this_controls.front()); | 885 this_control_count, &this_controls.front()); |
| 889 this_effects.push_back(this_control); | 886 this_effects.push_back(this_control); |
| 890 this_effect = | 887 this_effect = |
| 891 graph()->NewNode(common()->EffectPhi(this_control_count), | 888 graph()->NewNode(common()->EffectPhi(this_control_count), |
| 892 this_control_count + 1, &this_effects.front()); | 889 this_control_count + 1, &this_effects.front()); |
| 893 } | 890 } |
| 894 } | 891 } |
| 895 | 892 |
| 896 // Generate the actual property access. | 893 // Generate the actual property access. |
| 897 ValueEffectControl continuation = BuildPropertyAccess( | 894 ValueEffectControl continuation = |
| 898 this_receiver, this_value, context, frame_state, this_effect, | 895 BuildPropertyAccess(this_receiver, this_value, context, frame_state, |
| 899 this_control, name, access_info, access_mode, language_mode); | 896 this_effect, this_control, name, if_exceptions, |
| 897 access_info, access_mode, language_mode); | |
| 900 values.push_back(continuation.value()); | 898 values.push_back(continuation.value()); |
| 901 effects.push_back(continuation.effect()); | 899 effects.push_back(continuation.effect()); |
| 902 controls.push_back(continuation.control()); | 900 controls.push_back(continuation.control()); |
| 903 } | 901 } |
| 904 | 902 |
| 905 DCHECK_NULL(fallthrough_control); | 903 DCHECK_NULL(fallthrough_control); |
| 906 | 904 |
| 907 // Generate the final merge point for all (polymorphic) branches. | 905 // Generate the final merge point for all (polymorphic) branches. |
| 908 int const control_count = static_cast<int>(controls.size()); | 906 int const control_count = static_cast<int>(controls.size()); |
| 909 if (control_count == 0) { | 907 if (control_count == 0) { |
| 910 value = effect = control = jsgraph()->Dead(); | 908 value = effect = control = jsgraph()->Dead(); |
| 911 } else if (control_count == 1) { | 909 } else if (control_count == 1) { |
| 912 value = values.front(); | 910 value = values.front(); |
| 913 effect = effects.front(); | 911 effect = effects.front(); |
| 914 control = controls.front(); | 912 control = controls.front(); |
| 915 } else { | 913 } else { |
| 916 control = graph()->NewNode(common()->Merge(control_count), control_count, | 914 control = graph()->NewNode(common()->Merge(control_count), control_count, |
| 917 &controls.front()); | 915 &controls.front()); |
| 918 values.push_back(control); | 916 values.push_back(control); |
| 919 value = graph()->NewNode( | 917 value = graph()->NewNode( |
| 920 common()->Phi(MachineRepresentation::kTagged, control_count), | 918 common()->Phi(MachineRepresentation::kTagged, control_count), |
| 921 control_count + 1, &values.front()); | 919 control_count + 1, &values.front()); |
| 922 effects.push_back(control); | 920 effects.push_back(control); |
| 923 effect = graph()->NewNode(common()->EffectPhi(control_count), | 921 effect = graph()->NewNode(common()->EffectPhi(control_count), |
| 924 control_count + 1, &effects.front()); | 922 control_count + 1, &effects.front()); |
| 925 } | 923 } |
| 926 } | 924 } |
| 925 | |
| 926 // Properly rewire IfException edges if {node} is inside a try-block. | |
| 927 if (!if_exception_nodes.empty()) { | |
| 928 DCHECK_NOT_NULL(if_exception); | |
| 929 DCHECK_NOT_NULL(if_exceptions); | |
|
Jarin
2017/05/22 20:23:37
DCHECK(&if_exception_nodes == if_exceptions);
Benedikt Meurer
2017/05/23 11:06:25
Done.
| |
| 930 int const if_exception_count = static_cast<int>(if_exceptions->size()); | |
| 931 Node* merge = graph()->NewNode(common()->Merge(if_exception_count), | |
| 932 if_exception_count, &if_exceptions->front()); | |
| 933 if_exceptions->push_back(merge); | |
| 934 Node* ephi = | |
| 935 graph()->NewNode(common()->EffectPhi(if_exception_count), | |
| 936 if_exception_count + 1, &if_exceptions->front()); | |
| 937 Node* phi = graph()->NewNode( | |
| 938 common()->Phi(MachineRepresentation::kTagged, if_exception_count), | |
| 939 if_exception_count + 1, &if_exceptions->front()); | |
| 940 ReplaceWithValue(if_exception, phi, ephi, merge); | |
| 941 } | |
| 942 | |
| 927 ReplaceWithValue(node, value, effect, control); | 943 ReplaceWithValue(node, value, effect, control); |
| 928 return Replace(value); | 944 return Replace(value); |
| 929 } | 945 } |
| 930 | 946 |
| 931 Reduction JSNativeContextSpecialization::ReduceNamedAccessFromNexus( | 947 Reduction JSNativeContextSpecialization::ReduceNamedAccessFromNexus( |
| 932 Node* node, Node* value, FeedbackNexus const& nexus, Handle<Name> name, | 948 Node* node, Node* value, FeedbackNexus const& nexus, Handle<Name> name, |
| 933 AccessMode access_mode, LanguageMode language_mode) { | 949 AccessMode access_mode, LanguageMode language_mode) { |
| 934 DCHECK(node->opcode() == IrOpcode::kJSLoadNamed || | 950 DCHECK(node->opcode() == IrOpcode::kJSLoadNamed || |
| 935 node->opcode() == IrOpcode::kJSStoreNamed || | 951 node->opcode() == IrOpcode::kJSStoreNamed || |
| 936 node->opcode() == IrOpcode::kJSStoreNamedOwn); | 952 node->opcode() == IrOpcode::kJSStoreNamedOwn); |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1446 KeyedAccessStoreMode store_mode = nexus.GetKeyedAccessStoreMode(); | 1462 KeyedAccessStoreMode store_mode = nexus.GetKeyedAccessStoreMode(); |
| 1447 | 1463 |
| 1448 // Try to lower the keyed access based on the {nexus}. | 1464 // Try to lower the keyed access based on the {nexus}. |
| 1449 return ReduceKeyedAccess(node, index, value, nexus, AccessMode::kStore, | 1465 return ReduceKeyedAccess(node, index, value, nexus, AccessMode::kStore, |
| 1450 p.language_mode(), store_mode); | 1466 p.language_mode(), store_mode); |
| 1451 } | 1467 } |
| 1452 | 1468 |
| 1453 JSNativeContextSpecialization::ValueEffectControl | 1469 JSNativeContextSpecialization::ValueEffectControl |
| 1454 JSNativeContextSpecialization::BuildPropertyAccess( | 1470 JSNativeContextSpecialization::BuildPropertyAccess( |
| 1455 Node* receiver, Node* value, Node* context, Node* frame_state, Node* effect, | 1471 Node* receiver, Node* value, Node* context, Node* frame_state, Node* effect, |
| 1456 Node* control, Handle<Name> name, PropertyAccessInfo const& access_info, | 1472 Node* control, Handle<Name> name, ZoneVector<Node*>* if_exceptions, |
| 1457 AccessMode access_mode, LanguageMode language_mode) { | 1473 PropertyAccessInfo const& access_info, AccessMode access_mode, |
| 1474 LanguageMode language_mode) { | |
| 1458 // Determine actual holder and perform prototype chain checks. | 1475 // Determine actual holder and perform prototype chain checks. |
| 1459 Handle<JSObject> holder; | 1476 Handle<JSObject> holder; |
| 1460 if (access_info.holder().ToHandle(&holder)) { | 1477 if (access_info.holder().ToHandle(&holder)) { |
| 1461 DCHECK_NE(AccessMode::kStoreInLiteral, access_mode); | 1478 DCHECK_NE(AccessMode::kStoreInLiteral, access_mode); |
| 1462 AssumePrototypesStable(access_info.receiver_maps(), holder); | 1479 AssumePrototypesStable(access_info.receiver_maps(), holder); |
| 1463 } | 1480 } |
| 1464 | 1481 |
| 1465 // Generate the actual property access. | 1482 // Generate the actual property access. |
| 1466 if (access_info.IsNotFound()) { | 1483 if (access_info.IsNotFound()) { |
| 1467 DCHECK_EQ(AccessMode::kLoad, access_mode); | 1484 DCHECK_EQ(AccessMode::kLoad, access_mode); |
| 1468 value = jsgraph()->UndefinedConstant(); | 1485 value = jsgraph()->UndefinedConstant(); |
| 1469 } else if (access_info.IsDataConstant()) { | 1486 } else if (access_info.IsDataConstant()) { |
| 1470 DCHECK(!FLAG_track_constant_fields); | 1487 DCHECK(!FLAG_track_constant_fields); |
| 1471 Node* constant_value = jsgraph()->Constant(access_info.constant()); | 1488 Node* constant_value = jsgraph()->Constant(access_info.constant()); |
| 1472 if (access_mode == AccessMode::kStore) { | 1489 if (access_mode == AccessMode::kStore) { |
| 1473 Node* check = graph()->NewNode(simplified()->ReferenceEqual(), value, | 1490 Node* check = graph()->NewNode(simplified()->ReferenceEqual(), value, |
| 1474 constant_value); | 1491 constant_value); |
| 1475 effect = | 1492 effect = |
| 1476 graph()->NewNode(simplified()->CheckIf(), check, effect, control); | 1493 graph()->NewNode(simplified()->CheckIf(), check, effect, control); |
| 1477 } | 1494 } |
| 1478 value = constant_value; | 1495 value = constant_value; |
| 1479 } else if (access_info.IsAccessorConstant()) { | 1496 } else if (access_info.IsAccessorConstant()) { |
| 1480 // TODO(bmeurer): Properly rewire the IfException edge here if there's any. | |
| 1481 Node* target = jsgraph()->Constant(access_info.constant()); | 1497 Node* target = jsgraph()->Constant(access_info.constant()); |
| 1482 FrameStateInfo const& frame_info = OpParameter<FrameStateInfo>(frame_state); | 1498 FrameStateInfo const& frame_info = OpParameter<FrameStateInfo>(frame_state); |
| 1483 Handle<SharedFunctionInfo> shared_info = | 1499 Handle<SharedFunctionInfo> shared_info = |
| 1484 frame_info.shared_info().ToHandleChecked(); | 1500 frame_info.shared_info().ToHandleChecked(); |
| 1485 switch (access_mode) { | 1501 switch (access_mode) { |
| 1486 case AccessMode::kLoad: { | 1502 case AccessMode::kLoad: { |
| 1487 // We need a FrameState for the getter stub to restore the correct | 1503 // We need a FrameState for the getter stub to restore the correct |
| 1488 // context before returning to fullcodegen. | 1504 // context before returning to fullcodegen. |
| 1489 FrameStateFunctionInfo const* frame_info0 = | 1505 FrameStateFunctionInfo const* frame_info0 = |
| 1490 common()->CreateFrameStateFunctionInfo(FrameStateType::kGetterStub, | 1506 common()->CreateFrameStateFunctionInfo(FrameStateType::kGetterStub, |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1511 DCHECK(!function_template_info->call_code()->IsUndefined(isolate())); | 1527 DCHECK(!function_template_info->call_code()->IsUndefined(isolate())); |
| 1512 ValueEffectControl value_effect_control = InlineApiCall( | 1528 ValueEffectControl value_effect_control = InlineApiCall( |
| 1513 receiver, context, target, frame_state0, nullptr, effect, control, | 1529 receiver, context, target, frame_state0, nullptr, effect, control, |
| 1514 shared_info, function_template_info); | 1530 shared_info, function_template_info); |
| 1515 value = value_effect_control.value(); | 1531 value = value_effect_control.value(); |
| 1516 effect = value_effect_control.effect(); | 1532 effect = value_effect_control.effect(); |
| 1517 control = value_effect_control.control(); | 1533 control = value_effect_control.control(); |
| 1518 } | 1534 } |
| 1519 break; | 1535 break; |
| 1520 } | 1536 } |
| 1521 case AccessMode::kStoreInLiteral: | |
| 1522 case AccessMode::kStore: { | 1537 case AccessMode::kStore: { |
| 1523 // We need a FrameState for the setter stub to restore the correct | 1538 // We need a FrameState for the setter stub to restore the correct |
| 1524 // context and return the appropriate value to fullcodegen. | 1539 // context and return the appropriate value to fullcodegen. |
| 1525 FrameStateFunctionInfo const* frame_info0 = | 1540 FrameStateFunctionInfo const* frame_info0 = |
| 1526 common()->CreateFrameStateFunctionInfo(FrameStateType::kSetterStub, | 1541 common()->CreateFrameStateFunctionInfo(FrameStateType::kSetterStub, |
| 1527 2, 0, shared_info); | 1542 2, 0, shared_info); |
| 1528 Node* frame_state0 = graph()->NewNode( | 1543 Node* frame_state0 = graph()->NewNode( |
| 1529 common()->FrameState(BailoutId::None(), | 1544 common()->FrameState(BailoutId::None(), |
| 1530 OutputFrameStateCombine::Ignore(), | 1545 OutputFrameStateCombine::Ignore(), |
| 1531 frame_info0), | 1546 frame_info0), |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1547 DCHECK(!function_template_info->call_code()->IsUndefined(isolate())); | 1562 DCHECK(!function_template_info->call_code()->IsUndefined(isolate())); |
| 1548 ValueEffectControl value_effect_control = InlineApiCall( | 1563 ValueEffectControl value_effect_control = InlineApiCall( |
| 1549 receiver, context, target, frame_state0, value, effect, control, | 1564 receiver, context, target, frame_state0, value, effect, control, |
| 1550 shared_info, function_template_info); | 1565 shared_info, function_template_info); |
| 1551 value = value_effect_control.value(); | 1566 value = value_effect_control.value(); |
| 1552 effect = value_effect_control.effect(); | 1567 effect = value_effect_control.effect(); |
| 1553 control = value_effect_control.control(); | 1568 control = value_effect_control.control(); |
| 1554 } | 1569 } |
| 1555 break; | 1570 break; |
| 1556 } | 1571 } |
| 1572 case AccessMode::kStoreInLiteral: { | |
| 1573 UNREACHABLE(); | |
| 1574 break; | |
| 1575 } | |
| 1576 } | |
| 1577 // Remember to rewire the IfException edge if this is inside a try-block. | |
| 1578 if (if_exceptions != nullptr) { | |
| 1579 // Create the appropriate IfException/IfSuccess projections. | |
| 1580 Node* const if_exception = | |
| 1581 graph()->NewNode(common()->IfException(), control, effect); | |
| 1582 Node* const if_success = graph()->NewNode(common()->IfSuccess(), control); | |
| 1583 if_exceptions->push_back(if_exception); | |
| 1584 control = if_success; | |
| 1557 } | 1585 } |
| 1558 } else { | 1586 } else { |
| 1559 DCHECK(access_info.IsDataField() || access_info.IsDataConstantField()); | 1587 DCHECK(access_info.IsDataField() || access_info.IsDataConstantField()); |
| 1560 FieldIndex const field_index = access_info.field_index(); | 1588 FieldIndex const field_index = access_info.field_index(); |
| 1561 Type* const field_type = access_info.field_type(); | 1589 Type* const field_type = access_info.field_type(); |
| 1562 MachineRepresentation const field_representation = | 1590 MachineRepresentation const field_representation = |
| 1563 access_info.field_representation(); | 1591 access_info.field_representation(); |
| 1564 if (access_mode == AccessMode::kLoad) { | 1592 if (access_mode == AccessMode::kLoad) { |
| 1565 if (access_info.holder().ToHandle(&holder)) { | 1593 if (access_info.holder().ToHandle(&holder)) { |
| 1566 receiver = jsgraph()->Constant(holder); | 1594 receiver = jsgraph()->Constant(holder); |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1866 jsgraph()->HeapConstant(cached_name)); | 1894 jsgraph()->HeapConstant(cached_name)); |
| 1867 effect = graph()->NewNode(simplified()->CheckIf(), check, effect, control); | 1895 effect = graph()->NewNode(simplified()->CheckIf(), check, effect, control); |
| 1868 | 1896 |
| 1869 Node* value = NodeProperties::GetValueInput(node, 2); | 1897 Node* value = NodeProperties::GetValueInput(node, 2); |
| 1870 Node* context = NodeProperties::GetContextInput(node); | 1898 Node* context = NodeProperties::GetContextInput(node); |
| 1871 Node* frame_state_lazy = NodeProperties::GetFrameStateInput(node); | 1899 Node* frame_state_lazy = NodeProperties::GetFrameStateInput(node); |
| 1872 | 1900 |
| 1873 // Generate the actual property access. | 1901 // Generate the actual property access. |
| 1874 ValueEffectControl continuation = BuildPropertyAccess( | 1902 ValueEffectControl continuation = BuildPropertyAccess( |
| 1875 receiver, value, context, frame_state_lazy, effect, control, cached_name, | 1903 receiver, value, context, frame_state_lazy, effect, control, cached_name, |
| 1876 access_info, AccessMode::kStoreInLiteral, LanguageMode::SLOPPY); | 1904 nullptr, access_info, AccessMode::kStoreInLiteral, LanguageMode::SLOPPY); |
| 1877 value = continuation.value(); | 1905 value = continuation.value(); |
| 1878 effect = continuation.effect(); | 1906 effect = continuation.effect(); |
| 1879 control = continuation.control(); | 1907 control = continuation.control(); |
| 1880 | 1908 |
| 1881 ReplaceWithValue(node, value, effect, control); | 1909 ReplaceWithValue(node, value, effect, control); |
| 1882 return Replace(value); | 1910 return Replace(value); |
| 1883 } | 1911 } |
| 1884 | 1912 |
| 1885 namespace { | 1913 namespace { |
| 1886 | 1914 |
| (...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2570 return jsgraph()->javascript(); | 2598 return jsgraph()->javascript(); |
| 2571 } | 2599 } |
| 2572 | 2600 |
| 2573 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { | 2601 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { |
| 2574 return jsgraph()->simplified(); | 2602 return jsgraph()->simplified(); |
| 2575 } | 2603 } |
| 2576 | 2604 |
| 2577 } // namespace compiler | 2605 } // namespace compiler |
| 2578 } // namespace internal | 2606 } // namespace internal |
| 2579 } // namespace v8 | 2607 } // namespace v8 |
| OLD | NEW |