| 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/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
| 6 | 6 |
| 7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/compiler/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
| 9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
| 10 #include "src/compiler/js-type-feedback.h" | 10 #include "src/compiler/js-type-feedback.h" |
| (...skipping 1347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1358 PrepareFrameState(value, stmt->FilterId(), | 1358 PrepareFrameState(value, stmt->FilterId(), |
| 1359 OutputFrameStateCombine::Push()); | 1359 OutputFrameStateCombine::Push()); |
| 1360 IfBuilder test_value(this); | 1360 IfBuilder test_value(this); |
| 1361 Node* test_value_cond = NewNode(javascript()->StrictEqual(), value, | 1361 Node* test_value_cond = NewNode(javascript()->StrictEqual(), value, |
| 1362 jsgraph()->UndefinedConstant()); | 1362 jsgraph()->UndefinedConstant()); |
| 1363 test_value.If(test_value_cond, BranchHint::kFalse); | 1363 test_value.If(test_value_cond, BranchHint::kFalse); |
| 1364 test_value.Then(); | 1364 test_value.Then(); |
| 1365 test_value.Else(); | 1365 test_value.Else(); |
| 1366 { | 1366 { |
| 1367 // Bind value and do loop body. | 1367 // Bind value and do loop body. |
| 1368 ResolvedFeedbackSlot slot = | 1368 VectorSlotPair feedback = |
| 1369 ResolveFeedbackSlot(stmt->EachFeedbackSlot()); | 1369 CreateVectorSlotPair(stmt->EachFeedbackSlot()); |
| 1370 VisitForInAssignment(stmt->each(), value, slot, stmt->AssignmentId()); | 1370 VisitForInAssignment(stmt->each(), value, feedback, |
| 1371 stmt->AssignmentId()); |
| 1371 VisitIterationBody(stmt, &for_loop); | 1372 VisitIterationBody(stmt, &for_loop); |
| 1372 } | 1373 } |
| 1373 test_value.End(); | 1374 test_value.End(); |
| 1374 index = environment()->Peek(0); | 1375 index = environment()->Peek(0); |
| 1375 for_loop.EndBody(); | 1376 for_loop.EndBody(); |
| 1376 | 1377 |
| 1377 // Increment counter and continue. | 1378 // Increment counter and continue. |
| 1378 index = NewNode(javascript()->ForInStep(), index); | 1379 index = NewNode(javascript()->ForInStep(), index); |
| 1379 environment()->Poke(0, index); | 1380 environment()->Poke(0, index); |
| 1380 } | 1381 } |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1604 if (property->is_static() && property->is_computed_name()) { | 1605 if (property->is_static() && property->is_computed_name()) { |
| 1605 Node* check = BuildThrowIfStaticPrototype(environment()->Pop(), | 1606 Node* check = BuildThrowIfStaticPrototype(environment()->Pop(), |
| 1606 expr->GetIdForProperty(i)); | 1607 expr->GetIdForProperty(i)); |
| 1607 environment()->Push(check); | 1608 environment()->Push(check); |
| 1608 } | 1609 } |
| 1609 | 1610 |
| 1610 VisitForValue(property->value()); | 1611 VisitForValue(property->value()); |
| 1611 Node* value = environment()->Pop(); | 1612 Node* value = environment()->Pop(); |
| 1612 Node* key = environment()->Pop(); | 1613 Node* key = environment()->Pop(); |
| 1613 Node* receiver = environment()->Pop(); | 1614 Node* receiver = environment()->Pop(); |
| 1614 ResolvedFeedbackSlot slot = ResolveFeedbackSlot( | 1615 VectorSlotPair feedback = CreateVectorSlotPair( |
| 1615 expr->SlotForHomeObject(property->value(), &store_slot_index)); | 1616 expr->SlotForHomeObject(property->value(), &store_slot_index)); |
| 1616 BuildSetHomeObject(value, receiver, property->value(), slot); | 1617 BuildSetHomeObject(value, receiver, property->value(), feedback); |
| 1617 | 1618 |
| 1618 switch (property->kind()) { | 1619 switch (property->kind()) { |
| 1619 case ObjectLiteral::Property::CONSTANT: | 1620 case ObjectLiteral::Property::CONSTANT: |
| 1620 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 1621 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
| 1621 case ObjectLiteral::Property::PROTOTYPE: | 1622 case ObjectLiteral::Property::PROTOTYPE: |
| 1622 UNREACHABLE(); | 1623 UNREACHABLE(); |
| 1623 case ObjectLiteral::Property::COMPUTED: { | 1624 case ObjectLiteral::Property::COMPUTED: { |
| 1624 const Operator* op = | 1625 const Operator* op = |
| 1625 javascript()->CallRuntime(Runtime::kDefineClassMethod, 3); | 1626 javascript()->CallRuntime(Runtime::kDefineClassMethod, 3); |
| 1626 NewNode(op, receiver, key, value); | 1627 NewNode(op, receiver, key, value); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1646 // Transform both the class literal and the prototype to fast properties. | 1647 // Transform both the class literal and the prototype to fast properties. |
| 1647 const Operator* op = javascript()->CallRuntime(Runtime::kToFastProperties, 1); | 1648 const Operator* op = javascript()->CallRuntime(Runtime::kToFastProperties, 1); |
| 1648 NewNode(op, environment()->Pop()); // prototype | 1649 NewNode(op, environment()->Pop()); // prototype |
| 1649 NewNode(op, environment()->Pop()); // literal | 1650 NewNode(op, environment()->Pop()); // literal |
| 1650 | 1651 |
| 1651 // Assign to class variable. | 1652 // Assign to class variable. |
| 1652 if (expr->scope() != NULL) { | 1653 if (expr->scope() != NULL) { |
| 1653 DCHECK_NOT_NULL(expr->class_variable_proxy()); | 1654 DCHECK_NOT_NULL(expr->class_variable_proxy()); |
| 1654 Variable* var = expr->class_variable_proxy()->var(); | 1655 Variable* var = expr->class_variable_proxy()->var(); |
| 1655 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 1656 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
| 1656 ResolvedFeedbackSlot slot = ResolveFeedbackSlot( | 1657 VectorSlotPair feedback = CreateVectorSlotPair( |
| 1657 FLAG_vector_stores ? expr->GetNthSlot(store_slot_index++) | 1658 FLAG_vector_stores ? expr->GetNthSlot(store_slot_index++) |
| 1658 : FeedbackVectorICSlot::Invalid()); | 1659 : FeedbackVectorICSlot::Invalid()); |
| 1659 BuildVariableAssignment(var, literal, Token::INIT_CONST, slot, | 1660 BuildVariableAssignment(var, literal, Token::INIT_CONST, feedback, |
| 1660 BailoutId::None(), states); | 1661 BailoutId::None(), states); |
| 1661 } | 1662 } |
| 1662 | 1663 |
| 1663 ast_context()->ProduceValue(literal); | 1664 ast_context()->ProduceValue(literal); |
| 1664 } | 1665 } |
| 1665 | 1666 |
| 1666 | 1667 |
| 1667 void AstGraphBuilder::VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) { | 1668 void AstGraphBuilder::VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) { |
| 1668 UNREACHABLE(); | 1669 UNREACHABLE(); |
| 1669 } | 1670 } |
| 1670 | 1671 |
| 1671 | 1672 |
| 1672 void AstGraphBuilder::VisitConditional(Conditional* expr) { | 1673 void AstGraphBuilder::VisitConditional(Conditional* expr) { |
| 1673 IfBuilder compare_if(this); | 1674 IfBuilder compare_if(this); |
| 1674 VisitForTest(expr->condition()); | 1675 VisitForTest(expr->condition()); |
| 1675 Node* condition = environment()->Pop(); | 1676 Node* condition = environment()->Pop(); |
| 1676 compare_if.If(condition); | 1677 compare_if.If(condition); |
| 1677 compare_if.Then(); | 1678 compare_if.Then(); |
| 1678 Visit(expr->then_expression()); | 1679 Visit(expr->then_expression()); |
| 1679 compare_if.Else(); | 1680 compare_if.Else(); |
| 1680 Visit(expr->else_expression()); | 1681 Visit(expr->else_expression()); |
| 1681 compare_if.End(); | 1682 compare_if.End(); |
| 1682 ast_context()->ReplaceValue(); | 1683 ast_context()->ReplaceValue(); |
| 1683 } | 1684 } |
| 1684 | 1685 |
| 1685 | 1686 |
| 1686 void AstGraphBuilder::VisitVariableProxy(VariableProxy* expr) { | 1687 void AstGraphBuilder::VisitVariableProxy(VariableProxy* expr) { |
| 1687 ResolvedFeedbackSlot slot = ResolveFeedbackSlot(expr->VariableFeedbackSlot()); | 1688 VectorSlotPair pair = CreateVectorSlotPair(expr->VariableFeedbackSlot()); |
| 1688 FrameStateBeforeAndAfter states(this, BeforeId(expr)); | 1689 FrameStateBeforeAndAfter states(this, BeforeId(expr)); |
| 1689 Node* value = BuildVariableLoad(expr->var(), expr->id(), states, slot, | 1690 Node* value = BuildVariableLoad(expr->var(), expr->id(), states, pair, |
| 1690 ast_context()->GetStateCombine()); | 1691 ast_context()->GetStateCombine()); |
| 1691 ast_context()->ProduceValue(value); | 1692 ast_context()->ProduceValue(value); |
| 1692 } | 1693 } |
| 1693 | 1694 |
| 1694 | 1695 |
| 1695 void AstGraphBuilder::VisitLiteral(Literal* expr) { | 1696 void AstGraphBuilder::VisitLiteral(Literal* expr) { |
| 1696 Node* value = jsgraph()->Constant(expr->value()); | 1697 Node* value = jsgraph()->Constant(expr->value()); |
| 1697 ast_context()->ProduceValue(value); | 1698 ast_context()->ProduceValue(value); |
| 1698 } | 1699 } |
| 1699 | 1700 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1751 // Fall through. | 1752 // Fall through. |
| 1752 case ObjectLiteral::Property::COMPUTED: { | 1753 case ObjectLiteral::Property::COMPUTED: { |
| 1753 // It is safe to use [[Put]] here because the boilerplate already | 1754 // It is safe to use [[Put]] here because the boilerplate already |
| 1754 // contains computed properties with an uninitialized value. | 1755 // contains computed properties with an uninitialized value. |
| 1755 if (key->value()->IsInternalizedString()) { | 1756 if (key->value()->IsInternalizedString()) { |
| 1756 if (property->emit_store()) { | 1757 if (property->emit_store()) { |
| 1757 VisitForValue(property->value()); | 1758 VisitForValue(property->value()); |
| 1758 FrameStateBeforeAndAfter states(this, property->value()->id()); | 1759 FrameStateBeforeAndAfter states(this, property->value()->id()); |
| 1759 Node* value = environment()->Pop(); | 1760 Node* value = environment()->Pop(); |
| 1760 Handle<Name> name = key->AsPropertyName(); | 1761 Handle<Name> name = key->AsPropertyName(); |
| 1761 ResolvedFeedbackSlot slot = | 1762 VectorSlotPair feedback = |
| 1762 FLAG_vector_stores | 1763 FLAG_vector_stores |
| 1763 ? ResolveFeedbackSlot(expr->GetNthSlot(store_slot_index++)) | 1764 ? CreateVectorSlotPair(expr->GetNthSlot(store_slot_index++)) |
| 1764 : ResolvedFeedbackSlot(); | 1765 : VectorSlotPair(); |
| 1765 Node* store = BuildNamedStore(literal, name, value, slot, | 1766 Node* store = BuildNamedStore(literal, name, value, feedback, |
| 1766 TypeFeedbackId::None()); | 1767 TypeFeedbackId::None()); |
| 1767 states.AddToNode(store, key->id(), | 1768 states.AddToNode(store, key->id(), |
| 1768 OutputFrameStateCombine::Ignore()); | 1769 OutputFrameStateCombine::Ignore()); |
| 1769 ResolvedFeedbackSlot home_slot = ResolveFeedbackSlot( | 1770 VectorSlotPair home_feedback = CreateVectorSlotPair( |
| 1770 expr->SlotForHomeObject(property->value(), &store_slot_index)); | 1771 expr->SlotForHomeObject(property->value(), &store_slot_index)); |
| 1771 BuildSetHomeObject(value, literal, property->value(), home_slot); | 1772 BuildSetHomeObject(value, literal, property->value(), |
| 1773 home_feedback); |
| 1772 } else { | 1774 } else { |
| 1773 VisitForEffect(property->value()); | 1775 VisitForEffect(property->value()); |
| 1774 } | 1776 } |
| 1775 break; | 1777 break; |
| 1776 } | 1778 } |
| 1777 environment()->Push(literal); // Duplicate receiver. | 1779 environment()->Push(literal); // Duplicate receiver. |
| 1778 VisitForValue(property->key()); | 1780 VisitForValue(property->key()); |
| 1779 VisitForValue(property->value()); | 1781 VisitForValue(property->value()); |
| 1780 Node* value = environment()->Pop(); | 1782 Node* value = environment()->Pop(); |
| 1781 Node* key = environment()->Pop(); | 1783 Node* key = environment()->Pop(); |
| 1782 Node* receiver = environment()->Pop(); | 1784 Node* receiver = environment()->Pop(); |
| 1783 if (property->emit_store()) { | 1785 if (property->emit_store()) { |
| 1784 Node* language = jsgraph()->Constant(SLOPPY); | 1786 Node* language = jsgraph()->Constant(SLOPPY); |
| 1785 const Operator* op = | 1787 const Operator* op = |
| 1786 javascript()->CallRuntime(Runtime::kSetProperty, 4); | 1788 javascript()->CallRuntime(Runtime::kSetProperty, 4); |
| 1787 Node* set_property = NewNode(op, receiver, key, value, language); | 1789 Node* set_property = NewNode(op, receiver, key, value, language); |
| 1788 // SetProperty should not lazy deopt on an object literal. | 1790 // SetProperty should not lazy deopt on an object literal. |
| 1789 PrepareFrameState(set_property, BailoutId::None()); | 1791 PrepareFrameState(set_property, BailoutId::None()); |
| 1790 ResolvedFeedbackSlot home_slot = ResolveFeedbackSlot( | 1792 VectorSlotPair home_feedback = CreateVectorSlotPair( |
| 1791 expr->SlotForHomeObject(property->value(), &store_slot_index)); | 1793 expr->SlotForHomeObject(property->value(), &store_slot_index)); |
| 1792 BuildSetHomeObject(value, receiver, property->value(), home_slot); | 1794 BuildSetHomeObject(value, receiver, property->value(), home_feedback); |
| 1793 } | 1795 } |
| 1794 break; | 1796 break; |
| 1795 } | 1797 } |
| 1796 case ObjectLiteral::Property::PROTOTYPE: { | 1798 case ObjectLiteral::Property::PROTOTYPE: { |
| 1797 environment()->Push(literal); // Duplicate receiver. | 1799 environment()->Push(literal); // Duplicate receiver. |
| 1798 VisitForValue(property->value()); | 1800 VisitForValue(property->value()); |
| 1799 Node* value = environment()->Pop(); | 1801 Node* value = environment()->Pop(); |
| 1800 Node* receiver = environment()->Pop(); | 1802 Node* receiver = environment()->Pop(); |
| 1801 DCHECK(property->emit_store()); | 1803 DCHECK(property->emit_store()); |
| 1802 const Operator* op = | 1804 const Operator* op = |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1818 break; | 1820 break; |
| 1819 } | 1821 } |
| 1820 } | 1822 } |
| 1821 | 1823 |
| 1822 // Create nodes to define accessors, using only a single call to the runtime | 1824 // Create nodes to define accessors, using only a single call to the runtime |
| 1823 // for each pair of corresponding getters and setters. | 1825 // for each pair of corresponding getters and setters. |
| 1824 for (AccessorTable::Iterator it = accessor_table.begin(); | 1826 for (AccessorTable::Iterator it = accessor_table.begin(); |
| 1825 it != accessor_table.end(); ++it) { | 1827 it != accessor_table.end(); ++it) { |
| 1826 VisitForValue(it->first); | 1828 VisitForValue(it->first); |
| 1827 VisitForValueOrNull(it->second->getter); | 1829 VisitForValueOrNull(it->second->getter); |
| 1828 ResolvedFeedbackSlot slot_getter = ResolveFeedbackSlot( | 1830 VectorSlotPair feedback_getter = CreateVectorSlotPair( |
| 1829 expr->SlotForHomeObject(it->second->getter, &store_slot_index)); | 1831 expr->SlotForHomeObject(it->second->getter, &store_slot_index)); |
| 1830 BuildSetHomeObject(environment()->Top(), literal, it->second->getter, | 1832 BuildSetHomeObject(environment()->Top(), literal, it->second->getter, |
| 1831 slot_getter); | 1833 feedback_getter); |
| 1832 VisitForValueOrNull(it->second->setter); | 1834 VisitForValueOrNull(it->second->setter); |
| 1833 ResolvedFeedbackSlot slot_setter = ResolveFeedbackSlot( | 1835 VectorSlotPair feedback_setter = CreateVectorSlotPair( |
| 1834 expr->SlotForHomeObject(it->second->getter, &store_slot_index)); | 1836 expr->SlotForHomeObject(it->second->getter, &store_slot_index)); |
| 1835 BuildSetHomeObject(environment()->Top(), literal, it->second->setter, | 1837 BuildSetHomeObject(environment()->Top(), literal, it->second->setter, |
| 1836 slot_setter); | 1838 feedback_setter); |
| 1837 Node* setter = environment()->Pop(); | 1839 Node* setter = environment()->Pop(); |
| 1838 Node* getter = environment()->Pop(); | 1840 Node* getter = environment()->Pop(); |
| 1839 Node* name = environment()->Pop(); | 1841 Node* name = environment()->Pop(); |
| 1840 Node* attr = jsgraph()->Constant(NONE); | 1842 Node* attr = jsgraph()->Constant(NONE); |
| 1841 const Operator* op = | 1843 const Operator* op = |
| 1842 javascript()->CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); | 1844 javascript()->CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); |
| 1843 Node* call = NewNode(op, literal, name, getter, setter, attr); | 1845 Node* call = NewNode(op, literal, name, getter, setter, attr); |
| 1844 // This should not lazy deopt on a new literal. | 1846 // This should not lazy deopt on a new literal. |
| 1845 PrepareFrameState(call, BailoutId::None()); | 1847 PrepareFrameState(call, BailoutId::None()); |
| 1846 } | 1848 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1871 | 1873 |
| 1872 environment()->Push(literal); // Duplicate receiver. | 1874 environment()->Push(literal); // Duplicate receiver. |
| 1873 VisitForValue(property->key()); | 1875 VisitForValue(property->key()); |
| 1874 Node* name = BuildToName(environment()->Pop(), | 1876 Node* name = BuildToName(environment()->Pop(), |
| 1875 expr->GetIdForProperty(property_index)); | 1877 expr->GetIdForProperty(property_index)); |
| 1876 environment()->Push(name); | 1878 environment()->Push(name); |
| 1877 VisitForValue(property->value()); | 1879 VisitForValue(property->value()); |
| 1878 Node* value = environment()->Pop(); | 1880 Node* value = environment()->Pop(); |
| 1879 Node* key = environment()->Pop(); | 1881 Node* key = environment()->Pop(); |
| 1880 Node* receiver = environment()->Pop(); | 1882 Node* receiver = environment()->Pop(); |
| 1881 ResolvedFeedbackSlot slot = ResolveFeedbackSlot( | 1883 VectorSlotPair feedback = CreateVectorSlotPair( |
| 1882 expr->SlotForHomeObject(property->value(), &store_slot_index)); | 1884 expr->SlotForHomeObject(property->value(), &store_slot_index)); |
| 1883 BuildSetHomeObject(value, receiver, property->value(), slot); | 1885 BuildSetHomeObject(value, receiver, property->value(), feedback); |
| 1884 switch (property->kind()) { | 1886 switch (property->kind()) { |
| 1885 case ObjectLiteral::Property::CONSTANT: | 1887 case ObjectLiteral::Property::CONSTANT: |
| 1886 case ObjectLiteral::Property::COMPUTED: | 1888 case ObjectLiteral::Property::COMPUTED: |
| 1887 case ObjectLiteral::Property::MATERIALIZED_LITERAL: { | 1889 case ObjectLiteral::Property::MATERIALIZED_LITERAL: { |
| 1888 Node* attr = jsgraph()->Constant(NONE); | 1890 Node* attr = jsgraph()->Constant(NONE); |
| 1889 const Operator* op = | 1891 const Operator* op = |
| 1890 javascript()->CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); | 1892 javascript()->CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); |
| 1891 Node* call = NewNode(op, receiver, key, value, attr); | 1893 Node* call = NewNode(op, receiver, key, value, attr); |
| 1892 PrepareFrameState(call, BailoutId::None()); | 1894 PrepareFrameState(call, BailoutId::None()); |
| 1893 break; | 1895 break; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1955 for (; array_index < expr->values()->length(); array_index++) { | 1957 for (; array_index < expr->values()->length(); array_index++) { |
| 1956 Expression* subexpr = expr->values()->at(array_index); | 1958 Expression* subexpr = expr->values()->at(array_index); |
| 1957 if (subexpr->IsSpread()) break; | 1959 if (subexpr->IsSpread()) break; |
| 1958 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; | 1960 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; |
| 1959 | 1961 |
| 1960 VisitForValue(subexpr); | 1962 VisitForValue(subexpr); |
| 1961 { | 1963 { |
| 1962 FrameStateBeforeAndAfter states(this, subexpr->id()); | 1964 FrameStateBeforeAndAfter states(this, subexpr->id()); |
| 1963 Node* value = environment()->Pop(); | 1965 Node* value = environment()->Pop(); |
| 1964 Node* index = jsgraph()->Constant(array_index); | 1966 Node* index = jsgraph()->Constant(array_index); |
| 1965 Node* store = | 1967 Node* store = BuildKeyedStore(literal, index, value, VectorSlotPair(), |
| 1966 BuildKeyedStore(literal, index, value, ResolvedFeedbackSlot(), | 1968 TypeFeedbackId::None()); |
| 1967 TypeFeedbackId::None()); | |
| 1968 states.AddToNode(store, expr->GetIdForElement(array_index), | 1969 states.AddToNode(store, expr->GetIdForElement(array_index), |
| 1969 OutputFrameStateCombine::Ignore()); | 1970 OutputFrameStateCombine::Ignore()); |
| 1970 } | 1971 } |
| 1971 } | 1972 } |
| 1972 | 1973 |
| 1973 // In case the array literal contains spread expressions it has two parts. The | 1974 // In case the array literal contains spread expressions it has two parts. The |
| 1974 // first part is the "static" array which has a literal index is handled | 1975 // first part is the "static" array which has a literal index is handled |
| 1975 // above. The second part is the part after the first spread expression | 1976 // above. The second part is the part after the first spread expression |
| 1976 // (inclusive) and these elements gets appended to the array. Note that the | 1977 // (inclusive) and these elements gets appended to the array. Note that the |
| 1977 // number elements an iterable produces is unknown ahead of time. | 1978 // number elements an iterable produces is unknown ahead of time. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2001 | 2002 |
| 2002 PrepareFrameState(result, expr->GetIdForElement(array_index)); | 2003 PrepareFrameState(result, expr->GetIdForElement(array_index)); |
| 2003 environment()->Push(result); | 2004 environment()->Push(result); |
| 2004 } | 2005 } |
| 2005 | 2006 |
| 2006 ast_context()->ProduceValue(environment()->Pop()); | 2007 ast_context()->ProduceValue(environment()->Pop()); |
| 2007 } | 2008 } |
| 2008 | 2009 |
| 2009 | 2010 |
| 2010 void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value, | 2011 void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value, |
| 2011 const ResolvedFeedbackSlot& slot, | 2012 const VectorSlotPair& feedback, |
| 2012 BailoutId bailout_id) { | 2013 BailoutId bailout_id) { |
| 2013 DCHECK(expr->IsValidReferenceExpression()); | 2014 DCHECK(expr->IsValidReferenceExpression()); |
| 2014 | 2015 |
| 2015 // Left-hand side can only be a property, a global or a variable slot. | 2016 // Left-hand side can only be a property, a global or a variable slot. |
| 2016 Property* property = expr->AsProperty(); | 2017 Property* property = expr->AsProperty(); |
| 2017 LhsKind assign_type = Property::GetAssignType(property); | 2018 LhsKind assign_type = Property::GetAssignType(property); |
| 2018 | 2019 |
| 2019 // Evaluate LHS expression and store the value. | 2020 // Evaluate LHS expression and store the value. |
| 2020 switch (assign_type) { | 2021 switch (assign_type) { |
| 2021 case VARIABLE: { | 2022 case VARIABLE: { |
| 2022 Variable* var = expr->AsVariableProxy()->var(); | 2023 Variable* var = expr->AsVariableProxy()->var(); |
| 2023 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 2024 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
| 2024 BuildVariableAssignment(var, value, Token::ASSIGN, slot, bailout_id, | 2025 BuildVariableAssignment(var, value, Token::ASSIGN, feedback, bailout_id, |
| 2025 states); | 2026 states); |
| 2026 break; | 2027 break; |
| 2027 } | 2028 } |
| 2028 case NAMED_PROPERTY: { | 2029 case NAMED_PROPERTY: { |
| 2029 environment()->Push(value); | 2030 environment()->Push(value); |
| 2030 VisitForValue(property->obj()); | 2031 VisitForValue(property->obj()); |
| 2031 FrameStateBeforeAndAfter states(this, property->obj()->id()); | 2032 FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| 2032 Node* object = environment()->Pop(); | 2033 Node* object = environment()->Pop(); |
| 2033 value = environment()->Pop(); | 2034 value = environment()->Pop(); |
| 2034 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2035 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2035 Node* store = | 2036 Node* store = BuildNamedStore(object, name, value, feedback, |
| 2036 BuildNamedStore(object, name, value, slot, TypeFeedbackId::None()); | 2037 TypeFeedbackId::None()); |
| 2037 states.AddToNode(store, bailout_id, OutputFrameStateCombine::Ignore()); | 2038 states.AddToNode(store, bailout_id, OutputFrameStateCombine::Ignore()); |
| 2038 break; | 2039 break; |
| 2039 } | 2040 } |
| 2040 case KEYED_PROPERTY: { | 2041 case KEYED_PROPERTY: { |
| 2041 environment()->Push(value); | 2042 environment()->Push(value); |
| 2042 VisitForValue(property->obj()); | 2043 VisitForValue(property->obj()); |
| 2043 VisitForValue(property->key()); | 2044 VisitForValue(property->key()); |
| 2044 FrameStateBeforeAndAfter states(this, property->key()->id()); | 2045 FrameStateBeforeAndAfter states(this, property->key()->id()); |
| 2045 Node* key = environment()->Pop(); | 2046 Node* key = environment()->Pop(); |
| 2046 Node* object = environment()->Pop(); | 2047 Node* object = environment()->Pop(); |
| 2047 value = environment()->Pop(); | 2048 value = environment()->Pop(); |
| 2048 Node* store = | 2049 Node* store = |
| 2049 BuildKeyedStore(object, key, value, slot, TypeFeedbackId::None()); | 2050 BuildKeyedStore(object, key, value, feedback, TypeFeedbackId::None()); |
| 2050 states.AddToNode(store, bailout_id, OutputFrameStateCombine::Ignore()); | 2051 states.AddToNode(store, bailout_id, OutputFrameStateCombine::Ignore()); |
| 2051 break; | 2052 break; |
| 2052 } | 2053 } |
| 2053 case NAMED_SUPER_PROPERTY: { | 2054 case NAMED_SUPER_PROPERTY: { |
| 2054 environment()->Push(value); | 2055 environment()->Push(value); |
| 2055 VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); | 2056 VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); |
| 2056 VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); | 2057 VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); |
| 2057 FrameStateBeforeAndAfter states(this, property->obj()->id()); | 2058 FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| 2058 Node* home_object = environment()->Pop(); | 2059 Node* home_object = environment()->Pop(); |
| 2059 Node* receiver = environment()->Pop(); | 2060 Node* receiver = environment()->Pop(); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2121 } | 2122 } |
| 2122 | 2123 |
| 2123 BailoutId before_store_id = BailoutId::None(); | 2124 BailoutId before_store_id = BailoutId::None(); |
| 2124 // Evaluate the value and potentially handle compound assignments by loading | 2125 // Evaluate the value and potentially handle compound assignments by loading |
| 2125 // the left-hand side value and performing a binary operation. | 2126 // the left-hand side value and performing a binary operation. |
| 2126 if (expr->is_compound()) { | 2127 if (expr->is_compound()) { |
| 2127 Node* old_value = NULL; | 2128 Node* old_value = NULL; |
| 2128 switch (assign_type) { | 2129 switch (assign_type) { |
| 2129 case VARIABLE: { | 2130 case VARIABLE: { |
| 2130 VariableProxy* proxy = expr->target()->AsVariableProxy(); | 2131 VariableProxy* proxy = expr->target()->AsVariableProxy(); |
| 2131 ResolvedFeedbackSlot slot = | 2132 VectorSlotPair pair = |
| 2132 ResolveFeedbackSlot(proxy->VariableFeedbackSlot()); | 2133 CreateVectorSlotPair(proxy->VariableFeedbackSlot()); |
| 2133 FrameStateBeforeAndAfter states(this, BeforeId(proxy)); | 2134 FrameStateBeforeAndAfter states(this, BeforeId(proxy)); |
| 2134 old_value = | 2135 old_value = |
| 2135 BuildVariableLoad(proxy->var(), expr->target()->id(), states, slot, | 2136 BuildVariableLoad(proxy->var(), expr->target()->id(), states, pair, |
| 2136 OutputFrameStateCombine::Push()); | 2137 OutputFrameStateCombine::Push()); |
| 2137 break; | 2138 break; |
| 2138 } | 2139 } |
| 2139 case NAMED_PROPERTY: { | 2140 case NAMED_PROPERTY: { |
| 2140 Node* object = environment()->Top(); | 2141 Node* object = environment()->Top(); |
| 2141 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2142 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2142 ResolvedFeedbackSlot slot = | 2143 VectorSlotPair pair = |
| 2143 ResolveFeedbackSlot(property->PropertyFeedbackSlot()); | 2144 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 2144 FrameStateBeforeAndAfter states(this, property->obj()->id()); | 2145 FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| 2145 old_value = BuildNamedLoad(object, name, slot); | 2146 old_value = BuildNamedLoad(object, name, pair); |
| 2146 states.AddToNode(old_value, property->LoadId(), | 2147 states.AddToNode(old_value, property->LoadId(), |
| 2147 OutputFrameStateCombine::Push()); | 2148 OutputFrameStateCombine::Push()); |
| 2148 break; | 2149 break; |
| 2149 } | 2150 } |
| 2150 case KEYED_PROPERTY: { | 2151 case KEYED_PROPERTY: { |
| 2151 Node* key = environment()->Top(); | 2152 Node* key = environment()->Top(); |
| 2152 Node* object = environment()->Peek(1); | 2153 Node* object = environment()->Peek(1); |
| 2153 ResolvedFeedbackSlot slot = | 2154 VectorSlotPair pair = |
| 2154 ResolveFeedbackSlot(property->PropertyFeedbackSlot()); | 2155 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 2155 FrameStateBeforeAndAfter states(this, property->key()->id()); | 2156 FrameStateBeforeAndAfter states(this, property->key()->id()); |
| 2156 old_value = BuildKeyedLoad(object, key, slot); | 2157 old_value = BuildKeyedLoad(object, key, pair); |
| 2157 states.AddToNode(old_value, property->LoadId(), | 2158 states.AddToNode(old_value, property->LoadId(), |
| 2158 OutputFrameStateCombine::Push()); | 2159 OutputFrameStateCombine::Push()); |
| 2159 break; | 2160 break; |
| 2160 } | 2161 } |
| 2161 case NAMED_SUPER_PROPERTY: { | 2162 case NAMED_SUPER_PROPERTY: { |
| 2162 Node* home_object = environment()->Top(); | 2163 Node* home_object = environment()->Top(); |
| 2163 Node* receiver = environment()->Peek(1); | 2164 Node* receiver = environment()->Peek(1); |
| 2164 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2165 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2165 ResolvedFeedbackSlot slot = | 2166 VectorSlotPair pair = |
| 2166 ResolveFeedbackSlot(property->PropertyFeedbackSlot()); | 2167 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 2167 FrameStateBeforeAndAfter states(this, property->obj()->id()); | 2168 FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| 2168 old_value = BuildNamedSuperLoad(receiver, home_object, name, slot); | 2169 old_value = BuildNamedSuperLoad(receiver, home_object, name, pair); |
| 2169 states.AddToNode(old_value, property->LoadId(), | 2170 states.AddToNode(old_value, property->LoadId(), |
| 2170 OutputFrameStateCombine::Push()); | 2171 OutputFrameStateCombine::Push()); |
| 2171 break; | 2172 break; |
| 2172 } | 2173 } |
| 2173 case KEYED_SUPER_PROPERTY: { | 2174 case KEYED_SUPER_PROPERTY: { |
| 2174 Node* key = environment()->Top(); | 2175 Node* key = environment()->Top(); |
| 2175 Node* home_object = environment()->Peek(1); | 2176 Node* home_object = environment()->Peek(1); |
| 2176 Node* receiver = environment()->Peek(2); | 2177 Node* receiver = environment()->Peek(2); |
| 2177 ResolvedFeedbackSlot slot = | 2178 VectorSlotPair pair = |
| 2178 ResolveFeedbackSlot(property->PropertyFeedbackSlot()); | 2179 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 2179 FrameStateBeforeAndAfter states(this, property->key()->id()); | 2180 FrameStateBeforeAndAfter states(this, property->key()->id()); |
| 2180 old_value = BuildKeyedSuperLoad(receiver, home_object, key, slot); | 2181 old_value = BuildKeyedSuperLoad(receiver, home_object, key, pair); |
| 2181 states.AddToNode(old_value, property->LoadId(), | 2182 states.AddToNode(old_value, property->LoadId(), |
| 2182 OutputFrameStateCombine::Push()); | 2183 OutputFrameStateCombine::Push()); |
| 2183 break; | 2184 break; |
| 2184 } | 2185 } |
| 2185 } | 2186 } |
| 2186 environment()->Push(old_value); | 2187 environment()->Push(old_value); |
| 2187 VisitForValue(expr->value()); | 2188 VisitForValue(expr->value()); |
| 2188 Node* value; | 2189 Node* value; |
| 2189 { | 2190 { |
| 2190 FrameStateBeforeAndAfter states(this, expr->value()->id()); | 2191 FrameStateBeforeAndAfter states(this, expr->value()->id()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2201 } else { | 2202 } else { |
| 2202 VisitForValue(expr->value()); | 2203 VisitForValue(expr->value()); |
| 2203 if (needs_frame_state_before) { | 2204 if (needs_frame_state_before) { |
| 2204 before_store_id = expr->value()->id(); | 2205 before_store_id = expr->value()->id(); |
| 2205 } | 2206 } |
| 2206 } | 2207 } |
| 2207 | 2208 |
| 2208 FrameStateBeforeAndAfter store_states(this, before_store_id); | 2209 FrameStateBeforeAndAfter store_states(this, before_store_id); |
| 2209 // Store the value. | 2210 // Store the value. |
| 2210 Node* value = environment()->Pop(); | 2211 Node* value = environment()->Pop(); |
| 2211 ResolvedFeedbackSlot slot = ResolveFeedbackSlot(expr->AssignmentSlot()); | 2212 VectorSlotPair feedback = CreateVectorSlotPair(expr->AssignmentSlot()); |
| 2212 switch (assign_type) { | 2213 switch (assign_type) { |
| 2213 case VARIABLE: { | 2214 case VARIABLE: { |
| 2214 Variable* variable = expr->target()->AsVariableProxy()->var(); | 2215 Variable* variable = expr->target()->AsVariableProxy()->var(); |
| 2215 BuildVariableAssignment(variable, value, expr->op(), slot, expr->id(), | 2216 BuildVariableAssignment(variable, value, expr->op(), feedback, expr->id(), |
| 2216 store_states, ast_context()->GetStateCombine()); | 2217 store_states, ast_context()->GetStateCombine()); |
| 2217 break; | 2218 break; |
| 2218 } | 2219 } |
| 2219 case NAMED_PROPERTY: { | 2220 case NAMED_PROPERTY: { |
| 2220 Node* object = environment()->Pop(); | 2221 Node* object = environment()->Pop(); |
| 2221 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2222 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2222 Node* store = BuildNamedStore(object, name, value, slot, | 2223 Node* store = BuildNamedStore(object, name, value, feedback, |
| 2223 expr->AssignmentFeedbackId()); | 2224 expr->AssignmentFeedbackId()); |
| 2224 store_states.AddToNode(store, expr->id(), | 2225 store_states.AddToNode(store, expr->id(), |
| 2225 ast_context()->GetStateCombine()); | 2226 ast_context()->GetStateCombine()); |
| 2226 break; | 2227 break; |
| 2227 } | 2228 } |
| 2228 case KEYED_PROPERTY: { | 2229 case KEYED_PROPERTY: { |
| 2229 Node* key = environment()->Pop(); | 2230 Node* key = environment()->Pop(); |
| 2230 Node* object = environment()->Pop(); | 2231 Node* object = environment()->Pop(); |
| 2231 Node* store = BuildKeyedStore(object, key, value, slot, | 2232 Node* store = BuildKeyedStore(object, key, value, feedback, |
| 2232 expr->AssignmentFeedbackId()); | 2233 expr->AssignmentFeedbackId()); |
| 2233 store_states.AddToNode(store, expr->id(), | 2234 store_states.AddToNode(store, expr->id(), |
| 2234 ast_context()->GetStateCombine()); | 2235 ast_context()->GetStateCombine()); |
| 2235 break; | 2236 break; |
| 2236 } | 2237 } |
| 2237 case NAMED_SUPER_PROPERTY: { | 2238 case NAMED_SUPER_PROPERTY: { |
| 2238 Node* home_object = environment()->Pop(); | 2239 Node* home_object = environment()->Pop(); |
| 2239 Node* receiver = environment()->Pop(); | 2240 Node* receiver = environment()->Pop(); |
| 2240 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2241 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2241 Node* store = BuildNamedSuperStore(receiver, home_object, name, value, | 2242 Node* store = BuildNamedSuperStore(receiver, home_object, name, value, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2271 VisitForValue(expr->exception()); | 2272 VisitForValue(expr->exception()); |
| 2272 Node* exception = environment()->Pop(); | 2273 Node* exception = environment()->Pop(); |
| 2273 Node* value = BuildThrowError(exception, expr->id()); | 2274 Node* value = BuildThrowError(exception, expr->id()); |
| 2274 ast_context()->ProduceValue(value); | 2275 ast_context()->ProduceValue(value); |
| 2275 } | 2276 } |
| 2276 | 2277 |
| 2277 | 2278 |
| 2278 void AstGraphBuilder::VisitProperty(Property* expr) { | 2279 void AstGraphBuilder::VisitProperty(Property* expr) { |
| 2279 Node* value = nullptr; | 2280 Node* value = nullptr; |
| 2280 LhsKind property_kind = Property::GetAssignType(expr); | 2281 LhsKind property_kind = Property::GetAssignType(expr); |
| 2281 ResolvedFeedbackSlot slot = ResolveFeedbackSlot(expr->PropertyFeedbackSlot()); | 2282 VectorSlotPair pair = CreateVectorSlotPair(expr->PropertyFeedbackSlot()); |
| 2282 switch (property_kind) { | 2283 switch (property_kind) { |
| 2283 case VARIABLE: | 2284 case VARIABLE: |
| 2284 UNREACHABLE(); | 2285 UNREACHABLE(); |
| 2285 break; | 2286 break; |
| 2286 case NAMED_PROPERTY: { | 2287 case NAMED_PROPERTY: { |
| 2287 VisitForValue(expr->obj()); | 2288 VisitForValue(expr->obj()); |
| 2288 FrameStateBeforeAndAfter states(this, expr->obj()->id()); | 2289 FrameStateBeforeAndAfter states(this, expr->obj()->id()); |
| 2289 Node* object = environment()->Pop(); | 2290 Node* object = environment()->Pop(); |
| 2290 Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName(); | 2291 Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName(); |
| 2291 value = BuildNamedLoad(object, name, slot); | 2292 value = BuildNamedLoad(object, name, pair); |
| 2292 states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); | 2293 states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); |
| 2293 break; | 2294 break; |
| 2294 } | 2295 } |
| 2295 case KEYED_PROPERTY: { | 2296 case KEYED_PROPERTY: { |
| 2296 VisitForValue(expr->obj()); | 2297 VisitForValue(expr->obj()); |
| 2297 VisitForValue(expr->key()); | 2298 VisitForValue(expr->key()); |
| 2298 FrameStateBeforeAndAfter states(this, expr->key()->id()); | 2299 FrameStateBeforeAndAfter states(this, expr->key()->id()); |
| 2299 Node* key = environment()->Pop(); | 2300 Node* key = environment()->Pop(); |
| 2300 Node* object = environment()->Pop(); | 2301 Node* object = environment()->Pop(); |
| 2301 value = BuildKeyedLoad(object, key, slot); | 2302 value = BuildKeyedLoad(object, key, pair); |
| 2302 states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); | 2303 states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); |
| 2303 break; | 2304 break; |
| 2304 } | 2305 } |
| 2305 case NAMED_SUPER_PROPERTY: { | 2306 case NAMED_SUPER_PROPERTY: { |
| 2306 VisitForValue(expr->obj()->AsSuperPropertyReference()->this_var()); | 2307 VisitForValue(expr->obj()->AsSuperPropertyReference()->this_var()); |
| 2307 VisitForValue(expr->obj()->AsSuperPropertyReference()->home_object()); | 2308 VisitForValue(expr->obj()->AsSuperPropertyReference()->home_object()); |
| 2308 FrameStateBeforeAndAfter states(this, expr->obj()->id()); | 2309 FrameStateBeforeAndAfter states(this, expr->obj()->id()); |
| 2309 Node* home_object = environment()->Pop(); | 2310 Node* home_object = environment()->Pop(); |
| 2310 Node* receiver = environment()->Pop(); | 2311 Node* receiver = environment()->Pop(); |
| 2311 Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName(); | 2312 Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName(); |
| 2312 value = BuildNamedSuperLoad(receiver, home_object, name, slot); | 2313 value = BuildNamedSuperLoad(receiver, home_object, name, pair); |
| 2313 states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); | 2314 states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); |
| 2314 break; | 2315 break; |
| 2315 } | 2316 } |
| 2316 case KEYED_SUPER_PROPERTY: { | 2317 case KEYED_SUPER_PROPERTY: { |
| 2317 VisitForValue(expr->obj()->AsSuperPropertyReference()->this_var()); | 2318 VisitForValue(expr->obj()->AsSuperPropertyReference()->this_var()); |
| 2318 VisitForValue(expr->obj()->AsSuperPropertyReference()->home_object()); | 2319 VisitForValue(expr->obj()->AsSuperPropertyReference()->home_object()); |
| 2319 VisitForValue(expr->key()); | 2320 VisitForValue(expr->key()); |
| 2320 FrameStateBeforeAndAfter states(this, expr->key()->id()); | 2321 FrameStateBeforeAndAfter states(this, expr->key()->id()); |
| 2321 Node* key = environment()->Pop(); | 2322 Node* key = environment()->Pop(); |
| 2322 Node* home_object = environment()->Pop(); | 2323 Node* home_object = environment()->Pop(); |
| 2323 Node* receiver = environment()->Pop(); | 2324 Node* receiver = environment()->Pop(); |
| 2324 value = BuildKeyedSuperLoad(receiver, home_object, key, slot); | 2325 value = BuildKeyedSuperLoad(receiver, home_object, key, pair); |
| 2325 states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); | 2326 states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); |
| 2326 break; | 2327 break; |
| 2327 } | 2328 } |
| 2328 } | 2329 } |
| 2329 ast_context()->ProduceValue(value); | 2330 ast_context()->ProduceValue(value); |
| 2330 } | 2331 } |
| 2331 | 2332 |
| 2332 | 2333 |
| 2333 void AstGraphBuilder::VisitCall(Call* expr) { | 2334 void AstGraphBuilder::VisitCall(Call* expr) { |
| 2334 Expression* callee = expr->expression(); | 2335 Expression* callee = expr->expression(); |
| 2335 Call::CallType call_type = expr->GetCallType(isolate()); | 2336 Call::CallType call_type = expr->GetCallType(isolate()); |
| 2336 | 2337 |
| 2337 // Prepare the callee and the receiver to the function call. This depends on | 2338 // Prepare the callee and the receiver to the function call. This depends on |
| 2338 // the semantics of the underlying call type. | 2339 // the semantics of the underlying call type. |
| 2339 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; | 2340 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; |
| 2340 Node* receiver_value = NULL; | 2341 Node* receiver_value = NULL; |
| 2341 Node* callee_value = NULL; | 2342 Node* callee_value = NULL; |
| 2342 bool possibly_eval = false; | 2343 bool possibly_eval = false; |
| 2343 switch (call_type) { | 2344 switch (call_type) { |
| 2344 case Call::GLOBAL_CALL: { | 2345 case Call::GLOBAL_CALL: { |
| 2345 VariableProxy* proxy = callee->AsVariableProxy(); | 2346 VariableProxy* proxy = callee->AsVariableProxy(); |
| 2346 ResolvedFeedbackSlot slot = | 2347 VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot()); |
| 2347 ResolveFeedbackSlot(proxy->VariableFeedbackSlot()); | |
| 2348 FrameStateBeforeAndAfter states(this, BeforeId(proxy)); | 2348 FrameStateBeforeAndAfter states(this, BeforeId(proxy)); |
| 2349 callee_value = | 2349 callee_value = |
| 2350 BuildVariableLoad(proxy->var(), expr->expression()->id(), states, | 2350 BuildVariableLoad(proxy->var(), expr->expression()->id(), states, |
| 2351 slot, OutputFrameStateCombine::Push()); | 2351 pair, OutputFrameStateCombine::Push()); |
| 2352 receiver_value = jsgraph()->UndefinedConstant(); | 2352 receiver_value = jsgraph()->UndefinedConstant(); |
| 2353 break; | 2353 break; |
| 2354 } | 2354 } |
| 2355 case Call::LOOKUP_SLOT_CALL: { | 2355 case Call::LOOKUP_SLOT_CALL: { |
| 2356 Variable* variable = callee->AsVariableProxy()->var(); | 2356 Variable* variable = callee->AsVariableProxy()->var(); |
| 2357 DCHECK(variable->location() == Variable::LOOKUP); | 2357 DCHECK(variable->location() == Variable::LOOKUP); |
| 2358 Node* name = jsgraph()->Constant(variable->name()); | 2358 Node* name = jsgraph()->Constant(variable->name()); |
| 2359 const Operator* op = | 2359 const Operator* op = |
| 2360 javascript()->CallRuntime(Runtime::kLoadLookupSlot, 2); | 2360 javascript()->CallRuntime(Runtime::kLoadLookupSlot, 2); |
| 2361 Node* pair = NewNode(op, current_context(), name); | 2361 Node* pair = NewNode(op, current_context(), name); |
| 2362 callee_value = NewNode(common()->Projection(0), pair); | 2362 callee_value = NewNode(common()->Projection(0), pair); |
| 2363 receiver_value = NewNode(common()->Projection(1), pair); | 2363 receiver_value = NewNode(common()->Projection(1), pair); |
| 2364 | 2364 |
| 2365 PrepareFrameState(pair, expr->EvalOrLookupId(), | 2365 PrepareFrameState(pair, expr->EvalOrLookupId(), |
| 2366 OutputFrameStateCombine::Push(2)); | 2366 OutputFrameStateCombine::Push(2)); |
| 2367 break; | 2367 break; |
| 2368 } | 2368 } |
| 2369 case Call::PROPERTY_CALL: { | 2369 case Call::PROPERTY_CALL: { |
| 2370 Property* property = callee->AsProperty(); | 2370 Property* property = callee->AsProperty(); |
| 2371 ResolvedFeedbackSlot slot = | 2371 VectorSlotPair pair = |
| 2372 ResolveFeedbackSlot(property->PropertyFeedbackSlot()); | 2372 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 2373 if (!property->IsSuperAccess()) { | 2373 if (!property->IsSuperAccess()) { |
| 2374 VisitForValue(property->obj()); | 2374 VisitForValue(property->obj()); |
| 2375 Node* object = environment()->Top(); | 2375 Node* object = environment()->Top(); |
| 2376 | 2376 |
| 2377 if (property->key()->IsPropertyName()) { | 2377 if (property->key()->IsPropertyName()) { |
| 2378 FrameStateBeforeAndAfter states(this, property->obj()->id()); | 2378 FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| 2379 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2379 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2380 callee_value = BuildNamedLoad(object, name, slot); | 2380 callee_value = BuildNamedLoad(object, name, pair); |
| 2381 states.AddToNode(callee_value, property->LoadId(), | 2381 states.AddToNode(callee_value, property->LoadId(), |
| 2382 OutputFrameStateCombine::Push()); | 2382 OutputFrameStateCombine::Push()); |
| 2383 } else { | 2383 } else { |
| 2384 VisitForValue(property->key()); | 2384 VisitForValue(property->key()); |
| 2385 FrameStateBeforeAndAfter states(this, property->key()->id()); | 2385 FrameStateBeforeAndAfter states(this, property->key()->id()); |
| 2386 Node* key = environment()->Pop(); | 2386 Node* key = environment()->Pop(); |
| 2387 callee_value = BuildKeyedLoad(object, key, slot); | 2387 callee_value = BuildKeyedLoad(object, key, pair); |
| 2388 states.AddToNode(callee_value, property->LoadId(), | 2388 states.AddToNode(callee_value, property->LoadId(), |
| 2389 OutputFrameStateCombine::Push()); | 2389 OutputFrameStateCombine::Push()); |
| 2390 } | 2390 } |
| 2391 receiver_value = environment()->Pop(); | 2391 receiver_value = environment()->Pop(); |
| 2392 // Note that a PROPERTY_CALL requires the receiver to be wrapped into an | 2392 // Note that a PROPERTY_CALL requires the receiver to be wrapped into an |
| 2393 // object for sloppy callees. This could also be modeled explicitly | 2393 // object for sloppy callees. This could also be modeled explicitly |
| 2394 // here, | 2394 // here, |
| 2395 // thereby obsoleting the need for a flag to the call operator. | 2395 // thereby obsoleting the need for a flag to the call operator. |
| 2396 flags = CALL_AS_METHOD; | 2396 flags = CALL_AS_METHOD; |
| 2397 | 2397 |
| 2398 } else { | 2398 } else { |
| 2399 VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); | 2399 VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); |
| 2400 VisitForValue( | 2400 VisitForValue( |
| 2401 property->obj()->AsSuperPropertyReference()->home_object()); | 2401 property->obj()->AsSuperPropertyReference()->home_object()); |
| 2402 Node* home_object = environment()->Pop(); | 2402 Node* home_object = environment()->Pop(); |
| 2403 receiver_value = environment()->Pop(); | 2403 receiver_value = environment()->Pop(); |
| 2404 if (property->key()->IsPropertyName()) { | 2404 if (property->key()->IsPropertyName()) { |
| 2405 FrameStateBeforeAndAfter states(this, property->obj()->id()); | 2405 FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| 2406 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2406 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2407 callee_value = | 2407 callee_value = |
| 2408 BuildNamedSuperLoad(receiver_value, home_object, name, slot); | 2408 BuildNamedSuperLoad(receiver_value, home_object, name, pair); |
| 2409 states.AddToNode(callee_value, property->LoadId(), | 2409 states.AddToNode(callee_value, property->LoadId(), |
| 2410 OutputFrameStateCombine::Push()); | 2410 OutputFrameStateCombine::Push()); |
| 2411 | 2411 |
| 2412 } else { | 2412 } else { |
| 2413 VisitForValue(property->key()); | 2413 VisitForValue(property->key()); |
| 2414 FrameStateBeforeAndAfter states(this, property->key()->id()); | 2414 FrameStateBeforeAndAfter states(this, property->key()->id()); |
| 2415 Node* key = environment()->Pop(); | 2415 Node* key = environment()->Pop(); |
| 2416 callee_value = | 2416 callee_value = |
| 2417 BuildKeyedSuperLoad(receiver_value, home_object, key, slot); | 2417 BuildKeyedSuperLoad(receiver_value, home_object, key, pair); |
| 2418 states.AddToNode(callee_value, property->LoadId(), | 2418 states.AddToNode(callee_value, property->LoadId(), |
| 2419 OutputFrameStateCombine::Push()); | 2419 OutputFrameStateCombine::Push()); |
| 2420 } | 2420 } |
| 2421 } | 2421 } |
| 2422 | 2422 |
| 2423 break; | 2423 break; |
| 2424 } | 2424 } |
| 2425 case Call::SUPER_CALL: | 2425 case Call::SUPER_CALL: |
| 2426 // TODO(dslomov): Implement super calls. | 2426 // TODO(dslomov): Implement super calls. |
| 2427 callee_value = jsgraph()->UndefinedConstant(); | 2427 callee_value = jsgraph()->UndefinedConstant(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2466 Node* new_callee = | 2466 Node* new_callee = |
| 2467 NewNode(op, callee, source, function, language, position); | 2467 NewNode(op, callee, source, function, language, position); |
| 2468 PrepareFrameState(new_callee, expr->EvalOrLookupId(), | 2468 PrepareFrameState(new_callee, expr->EvalOrLookupId(), |
| 2469 OutputFrameStateCombine::PokeAt(arg_count + 1)); | 2469 OutputFrameStateCombine::PokeAt(arg_count + 1)); |
| 2470 | 2470 |
| 2471 // Patch callee on the environment. | 2471 // Patch callee on the environment. |
| 2472 environment()->Poke(arg_count + 1, new_callee); | 2472 environment()->Poke(arg_count + 1, new_callee); |
| 2473 } | 2473 } |
| 2474 | 2474 |
| 2475 // Create node to perform the function call. | 2475 // Create node to perform the function call. |
| 2476 const Operator* call = | 2476 VectorSlotPair feedback = CreateVectorSlotPair(expr->CallFeedbackICSlot()); |
| 2477 javascript()->CallFunction(args->length() + 2, flags, language_mode()); | 2477 const Operator* call = javascript()->CallFunction(args->length() + 2, flags, |
| 2478 language_mode(), feedback); |
| 2478 Node* value = ProcessArguments(call, args->length() + 2); | 2479 Node* value = ProcessArguments(call, args->length() + 2); |
| 2479 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); | 2480 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
| 2480 ast_context()->ProduceValue(value); | 2481 ast_context()->ProduceValue(value); |
| 2481 } | 2482 } |
| 2482 | 2483 |
| 2483 | 2484 |
| 2484 void AstGraphBuilder::VisitCallNew(CallNew* expr) { | 2485 void AstGraphBuilder::VisitCallNew(CallNew* expr) { |
| 2485 VisitForValue(expr->expression()); | 2486 VisitForValue(expr->expression()); |
| 2486 | 2487 |
| 2487 // Evaluate all arguments to the construct call. | 2488 // Evaluate all arguments to the construct call. |
| 2488 ZoneList<Expression*>* args = expr->arguments(); | 2489 ZoneList<Expression*>* args = expr->arguments(); |
| 2489 VisitForValues(args); | 2490 VisitForValues(args); |
| 2490 | 2491 |
| 2491 // Create node to perform the construct call. | 2492 // Create node to perform the construct call. |
| 2492 const Operator* call = javascript()->CallConstruct(args->length() + 1); | 2493 const Operator* call = javascript()->CallConstruct(args->length() + 1); |
| 2493 Node* value = ProcessArguments(call, args->length() + 1); | 2494 Node* value = ProcessArguments(call, args->length() + 1); |
| 2494 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); | 2495 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
| 2495 ast_context()->ProduceValue(value); | 2496 ast_context()->ProduceValue(value); |
| 2496 } | 2497 } |
| 2497 | 2498 |
| 2498 | 2499 |
| 2499 void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) { | 2500 void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) { |
| 2500 Handle<String> name = expr->name(); | 2501 Handle<String> name = expr->name(); |
| 2501 | 2502 |
| 2502 // The callee and the receiver both have to be pushed onto the operand stack | 2503 // The callee and the receiver both have to be pushed onto the operand stack |
| 2503 // before arguments are being evaluated. | 2504 // before arguments are being evaluated. |
| 2504 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; | 2505 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; |
| 2505 Node* receiver_value = BuildLoadBuiltinsObject(); | 2506 Node* receiver_value = BuildLoadBuiltinsObject(); |
| 2506 ResolvedFeedbackSlot slot = | 2507 VectorSlotPair pair = CreateVectorSlotPair(expr->CallRuntimeFeedbackSlot()); |
| 2507 ResolveFeedbackSlot(expr->CallRuntimeFeedbackSlot()); | |
| 2508 // TODO(jarin): bailout ids for runtime calls. | 2508 // TODO(jarin): bailout ids for runtime calls. |
| 2509 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 2509 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
| 2510 Node* callee_value = BuildNamedLoad(receiver_value, name, slot); | 2510 Node* callee_value = BuildNamedLoad(receiver_value, name, pair); |
| 2511 states.AddToNode(callee_value, BailoutId::None(), | 2511 states.AddToNode(callee_value, BailoutId::None(), |
| 2512 OutputFrameStateCombine::Push()); | 2512 OutputFrameStateCombine::Push()); |
| 2513 environment()->Push(callee_value); | 2513 environment()->Push(callee_value); |
| 2514 environment()->Push(receiver_value); | 2514 environment()->Push(receiver_value); |
| 2515 | 2515 |
| 2516 // Evaluate all arguments to the JS runtime call. | 2516 // Evaluate all arguments to the JS runtime call. |
| 2517 ZoneList<Expression*>* args = expr->arguments(); | 2517 ZoneList<Expression*>* args = expr->arguments(); |
| 2518 VisitForValues(args); | 2518 VisitForValues(args); |
| 2519 | 2519 |
| 2520 // Create node to perform the JS runtime call. | 2520 // Create node to perform the JS runtime call. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2578 // Reserve space for result of postfix operation. | 2578 // Reserve space for result of postfix operation. |
| 2579 bool is_postfix = expr->is_postfix() && !ast_context()->IsEffect(); | 2579 bool is_postfix = expr->is_postfix() && !ast_context()->IsEffect(); |
| 2580 if (is_postfix) environment()->Push(jsgraph()->UndefinedConstant()); | 2580 if (is_postfix) environment()->Push(jsgraph()->UndefinedConstant()); |
| 2581 | 2581 |
| 2582 // Evaluate LHS expression and get old value. | 2582 // Evaluate LHS expression and get old value. |
| 2583 Node* old_value = NULL; | 2583 Node* old_value = NULL; |
| 2584 int stack_depth = -1; | 2584 int stack_depth = -1; |
| 2585 switch (assign_type) { | 2585 switch (assign_type) { |
| 2586 case VARIABLE: { | 2586 case VARIABLE: { |
| 2587 VariableProxy* proxy = expr->expression()->AsVariableProxy(); | 2587 VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
| 2588 ResolvedFeedbackSlot slot = | 2588 VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot()); |
| 2589 ResolveFeedbackSlot(proxy->VariableFeedbackSlot()); | |
| 2590 FrameStateBeforeAndAfter states(this, BeforeId(proxy)); | 2589 FrameStateBeforeAndAfter states(this, BeforeId(proxy)); |
| 2591 old_value = | 2590 old_value = |
| 2592 BuildVariableLoad(proxy->var(), expr->expression()->id(), states, | 2591 BuildVariableLoad(proxy->var(), expr->expression()->id(), states, |
| 2593 slot, OutputFrameStateCombine::Push()); | 2592 pair, OutputFrameStateCombine::Push()); |
| 2594 stack_depth = 0; | 2593 stack_depth = 0; |
| 2595 break; | 2594 break; |
| 2596 } | 2595 } |
| 2597 case NAMED_PROPERTY: { | 2596 case NAMED_PROPERTY: { |
| 2598 VisitForValue(property->obj()); | 2597 VisitForValue(property->obj()); |
| 2599 FrameStateBeforeAndAfter states(this, property->obj()->id()); | 2598 FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| 2600 Node* object = environment()->Top(); | 2599 Node* object = environment()->Top(); |
| 2601 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2600 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2602 ResolvedFeedbackSlot slot = | 2601 VectorSlotPair pair = |
| 2603 ResolveFeedbackSlot(property->PropertyFeedbackSlot()); | 2602 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 2604 old_value = BuildNamedLoad(object, name, slot); | 2603 old_value = BuildNamedLoad(object, name, pair); |
| 2605 states.AddToNode(old_value, property->LoadId(), | 2604 states.AddToNode(old_value, property->LoadId(), |
| 2606 OutputFrameStateCombine::Push()); | 2605 OutputFrameStateCombine::Push()); |
| 2607 stack_depth = 1; | 2606 stack_depth = 1; |
| 2608 break; | 2607 break; |
| 2609 } | 2608 } |
| 2610 case KEYED_PROPERTY: { | 2609 case KEYED_PROPERTY: { |
| 2611 VisitForValue(property->obj()); | 2610 VisitForValue(property->obj()); |
| 2612 VisitForValue(property->key()); | 2611 VisitForValue(property->key()); |
| 2613 FrameStateBeforeAndAfter states(this, property->key()->id()); | 2612 FrameStateBeforeAndAfter states(this, property->key()->id()); |
| 2614 Node* key = environment()->Top(); | 2613 Node* key = environment()->Top(); |
| 2615 Node* object = environment()->Peek(1); | 2614 Node* object = environment()->Peek(1); |
| 2616 ResolvedFeedbackSlot slot = | 2615 VectorSlotPair pair = |
| 2617 ResolveFeedbackSlot(property->PropertyFeedbackSlot()); | 2616 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 2618 old_value = BuildKeyedLoad(object, key, slot); | 2617 old_value = BuildKeyedLoad(object, key, pair); |
| 2619 states.AddToNode(old_value, property->LoadId(), | 2618 states.AddToNode(old_value, property->LoadId(), |
| 2620 OutputFrameStateCombine::Push()); | 2619 OutputFrameStateCombine::Push()); |
| 2621 stack_depth = 2; | 2620 stack_depth = 2; |
| 2622 break; | 2621 break; |
| 2623 } | 2622 } |
| 2624 case NAMED_SUPER_PROPERTY: { | 2623 case NAMED_SUPER_PROPERTY: { |
| 2625 VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); | 2624 VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); |
| 2626 VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); | 2625 VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); |
| 2627 FrameStateBeforeAndAfter states(this, property->obj()->id()); | 2626 FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| 2628 Node* home_object = environment()->Top(); | 2627 Node* home_object = environment()->Top(); |
| 2629 Node* receiver = environment()->Peek(1); | 2628 Node* receiver = environment()->Peek(1); |
| 2630 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2629 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2631 ResolvedFeedbackSlot slot = | 2630 VectorSlotPair pair = |
| 2632 ResolveFeedbackSlot(property->PropertyFeedbackSlot()); | 2631 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 2633 old_value = BuildNamedSuperLoad(receiver, home_object, name, slot); | 2632 old_value = BuildNamedSuperLoad(receiver, home_object, name, pair); |
| 2634 states.AddToNode(old_value, property->LoadId(), | 2633 states.AddToNode(old_value, property->LoadId(), |
| 2635 OutputFrameStateCombine::Push()); | 2634 OutputFrameStateCombine::Push()); |
| 2636 stack_depth = 2; | 2635 stack_depth = 2; |
| 2637 break; | 2636 break; |
| 2638 } | 2637 } |
| 2639 case KEYED_SUPER_PROPERTY: { | 2638 case KEYED_SUPER_PROPERTY: { |
| 2640 VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); | 2639 VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); |
| 2641 VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); | 2640 VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); |
| 2642 VisitForValue(property->key()); | 2641 VisitForValue(property->key()); |
| 2643 FrameStateBeforeAndAfter states(this, property->obj()->id()); | 2642 FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| 2644 Node* key = environment()->Top(); | 2643 Node* key = environment()->Top(); |
| 2645 Node* home_object = environment()->Peek(1); | 2644 Node* home_object = environment()->Peek(1); |
| 2646 Node* receiver = environment()->Peek(2); | 2645 Node* receiver = environment()->Peek(2); |
| 2647 ResolvedFeedbackSlot slot = | 2646 VectorSlotPair pair = |
| 2648 ResolveFeedbackSlot(property->PropertyFeedbackSlot()); | 2647 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 2649 old_value = BuildKeyedSuperLoad(receiver, home_object, key, slot); | 2648 old_value = BuildKeyedSuperLoad(receiver, home_object, key, pair); |
| 2650 states.AddToNode(old_value, property->LoadId(), | 2649 states.AddToNode(old_value, property->LoadId(), |
| 2651 OutputFrameStateCombine::Push()); | 2650 OutputFrameStateCombine::Push()); |
| 2652 stack_depth = 3; | 2651 stack_depth = 3; |
| 2653 break; | 2652 break; |
| 2654 } | 2653 } |
| 2655 } | 2654 } |
| 2656 | 2655 |
| 2657 // Convert old value into a number. | 2656 // Convert old value into a number. |
| 2658 old_value = NewNode(javascript()->ToNumber(), old_value); | 2657 old_value = NewNode(javascript()->ToNumber(), old_value); |
| 2659 PrepareFrameState(old_value, expr->ToNumberId(), | 2658 PrepareFrameState(old_value, expr->ToNumberId(), |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2673 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 2672 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
| 2674 value = | 2673 value = |
| 2675 BuildBinaryOp(old_value, jsgraph()->OneConstant(), expr->binary_op()); | 2674 BuildBinaryOp(old_value, jsgraph()->OneConstant(), expr->binary_op()); |
| 2676 // This should never deoptimize because we have converted to number | 2675 // This should never deoptimize because we have converted to number |
| 2677 // before. | 2676 // before. |
| 2678 states.AddToNode(value, BailoutId::None(), | 2677 states.AddToNode(value, BailoutId::None(), |
| 2679 OutputFrameStateCombine::Ignore()); | 2678 OutputFrameStateCombine::Ignore()); |
| 2680 } | 2679 } |
| 2681 | 2680 |
| 2682 // Store the value. | 2681 // Store the value. |
| 2683 ResolvedFeedbackSlot slot = ResolveFeedbackSlot(expr->CountSlot()); | 2682 VectorSlotPair feedback = CreateVectorSlotPair(expr->CountSlot()); |
| 2684 switch (assign_type) { | 2683 switch (assign_type) { |
| 2685 case VARIABLE: { | 2684 case VARIABLE: { |
| 2686 Variable* variable = expr->expression()->AsVariableProxy()->var(); | 2685 Variable* variable = expr->expression()->AsVariableProxy()->var(); |
| 2687 environment()->Push(value); | 2686 environment()->Push(value); |
| 2688 BuildVariableAssignment(variable, value, expr->op(), slot, | 2687 BuildVariableAssignment(variable, value, expr->op(), feedback, |
| 2689 expr->AssignmentId(), store_states); | 2688 expr->AssignmentId(), store_states); |
| 2690 environment()->Pop(); | 2689 environment()->Pop(); |
| 2691 break; | 2690 break; |
| 2692 } | 2691 } |
| 2693 case NAMED_PROPERTY: { | 2692 case NAMED_PROPERTY: { |
| 2694 Node* object = environment()->Pop(); | 2693 Node* object = environment()->Pop(); |
| 2695 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2694 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2696 Node* store = BuildNamedStore(object, name, value, slot, | 2695 Node* store = BuildNamedStore(object, name, value, feedback, |
| 2697 expr->CountStoreFeedbackId()); | 2696 expr->CountStoreFeedbackId()); |
| 2698 environment()->Push(value); | 2697 environment()->Push(value); |
| 2699 store_states.AddToNode(store, expr->AssignmentId(), | 2698 store_states.AddToNode(store, expr->AssignmentId(), |
| 2700 OutputFrameStateCombine::Ignore()); | 2699 OutputFrameStateCombine::Ignore()); |
| 2701 environment()->Pop(); | 2700 environment()->Pop(); |
| 2702 break; | 2701 break; |
| 2703 } | 2702 } |
| 2704 case KEYED_PROPERTY: { | 2703 case KEYED_PROPERTY: { |
| 2705 Node* key = environment()->Pop(); | 2704 Node* key = environment()->Pop(); |
| 2706 Node* object = environment()->Pop(); | 2705 Node* object = environment()->Pop(); |
| 2707 Node* store = BuildKeyedStore(object, key, value, slot, | 2706 Node* store = BuildKeyedStore(object, key, value, feedback, |
| 2708 expr->CountStoreFeedbackId()); | 2707 expr->CountStoreFeedbackId()); |
| 2709 environment()->Push(value); | 2708 environment()->Push(value); |
| 2710 store_states.AddToNode(store, expr->AssignmentId(), | 2709 store_states.AddToNode(store, expr->AssignmentId(), |
| 2711 OutputFrameStateCombine::Ignore()); | 2710 OutputFrameStateCombine::Ignore()); |
| 2712 environment()->Pop(); | 2711 environment()->Pop(); |
| 2713 break; | 2712 break; |
| 2714 } | 2713 } |
| 2715 case NAMED_SUPER_PROPERTY: { | 2714 case NAMED_SUPER_PROPERTY: { |
| 2716 Node* home_object = environment()->Pop(); | 2715 Node* home_object = environment()->Pop(); |
| 2717 Node* receiver = environment()->Pop(); | 2716 Node* receiver = environment()->Pop(); |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2920 ast_context()->ProduceValue(value); | 2919 ast_context()->ProduceValue(value); |
| 2921 } | 2920 } |
| 2922 | 2921 |
| 2923 | 2922 |
| 2924 void AstGraphBuilder::VisitTypeof(UnaryOperation* expr) { | 2923 void AstGraphBuilder::VisitTypeof(UnaryOperation* expr) { |
| 2925 Node* operand; | 2924 Node* operand; |
| 2926 if (expr->expression()->IsVariableProxy()) { | 2925 if (expr->expression()->IsVariableProxy()) { |
| 2927 // Typeof does not throw a reference error on global variables, hence we | 2926 // Typeof does not throw a reference error on global variables, hence we |
| 2928 // perform a non-contextual load in case the operand is a variable proxy. | 2927 // perform a non-contextual load in case the operand is a variable proxy. |
| 2929 VariableProxy* proxy = expr->expression()->AsVariableProxy(); | 2928 VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
| 2930 ResolvedFeedbackSlot slot = | 2929 VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot()); |
| 2931 ResolveFeedbackSlot(proxy->VariableFeedbackSlot()); | |
| 2932 FrameStateBeforeAndAfter states(this, BeforeId(proxy)); | 2930 FrameStateBeforeAndAfter states(this, BeforeId(proxy)); |
| 2933 operand = | 2931 operand = |
| 2934 BuildVariableLoad(proxy->var(), expr->expression()->id(), states, slot, | 2932 BuildVariableLoad(proxy->var(), expr->expression()->id(), states, pair, |
| 2935 OutputFrameStateCombine::Push(), NOT_CONTEXTUAL); | 2933 OutputFrameStateCombine::Push(), NOT_CONTEXTUAL); |
| 2936 } else { | 2934 } else { |
| 2937 VisitForValue(expr->expression()); | 2935 VisitForValue(expr->expression()); |
| 2938 operand = environment()->Pop(); | 2936 operand = environment()->Pop(); |
| 2939 } | 2937 } |
| 2940 Node* value = NewNode(javascript()->TypeOf(), operand); | 2938 Node* value = NewNode(javascript()->TypeOf(), operand); |
| 2941 ast_context()->ProduceValue(value); | 2939 ast_context()->ProduceValue(value); |
| 2942 } | 2940 } |
| 2943 | 2941 |
| 2944 | 2942 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2985 compare_if.End(); | 2983 compare_if.End(); |
| 2986 ast_context()->ReplaceValue(); | 2984 ast_context()->ReplaceValue(); |
| 2987 } | 2985 } |
| 2988 | 2986 |
| 2989 | 2987 |
| 2990 LanguageMode AstGraphBuilder::language_mode() const { | 2988 LanguageMode AstGraphBuilder::language_mode() const { |
| 2991 return info()->language_mode(); | 2989 return info()->language_mode(); |
| 2992 } | 2990 } |
| 2993 | 2991 |
| 2994 | 2992 |
| 2995 ResolvedFeedbackSlot AstGraphBuilder::ResolveFeedbackSlot( | 2993 VectorSlotPair AstGraphBuilder::CreateVectorSlotPair( |
| 2996 FeedbackVectorICSlot slot) const { | 2994 FeedbackVectorICSlot slot) const { |
| 2997 return ResolvedFeedbackSlot(handle(info()->shared_info()->feedback_vector()), | 2995 return VectorSlotPair(handle(info()->shared_info()->feedback_vector()), slot); |
| 2998 slot); | |
| 2999 } | 2996 } |
| 3000 | 2997 |
| 3001 | 2998 |
| 3002 uint32_t AstGraphBuilder::ComputeBitsetForDynamicGlobal(Variable* variable) { | 2999 uint32_t AstGraphBuilder::ComputeBitsetForDynamicGlobal(Variable* variable) { |
| 3003 DCHECK_EQ(DYNAMIC_GLOBAL, variable->mode()); | 3000 DCHECK_EQ(DYNAMIC_GLOBAL, variable->mode()); |
| 3004 bool found_eval_scope = false; | 3001 bool found_eval_scope = false; |
| 3005 EnumSet<int, uint32_t> check_depths; | 3002 EnumSet<int, uint32_t> check_depths; |
| 3006 for (Scope* s = current_scope(); s != nullptr; s = s->outer_scope()) { | 3003 for (Scope* s = current_scope(); s != nullptr; s = s->outer_scope()) { |
| 3007 if (s->num_heap_slots() <= 0) continue; | 3004 if (s->num_heap_slots() <= 0) continue; |
| 3008 // TODO(mstarzinger): If we have reached an eval scope, we check all | 3005 // TODO(mstarzinger): If we have reached an eval scope, we check all |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3139 | 3136 |
| 3140 // Allocate and initialize a new arguments object. | 3137 // Allocate and initialize a new arguments object. |
| 3141 Node* callee = GetFunctionClosure(); | 3138 Node* callee = GetFunctionClosure(); |
| 3142 const Operator* op = javascript()->CallRuntime(Runtime::kNewArguments, 1); | 3139 const Operator* op = javascript()->CallRuntime(Runtime::kNewArguments, 1); |
| 3143 Node* object = NewNode(op, callee); | 3140 Node* object = NewNode(op, callee); |
| 3144 | 3141 |
| 3145 // Assign the object to the arguments variable. | 3142 // Assign the object to the arguments variable. |
| 3146 DCHECK(arguments->IsContextSlot() || arguments->IsStackAllocated()); | 3143 DCHECK(arguments->IsContextSlot() || arguments->IsStackAllocated()); |
| 3147 // This should never lazy deopt, so it is fine to send invalid bailout id. | 3144 // This should never lazy deopt, so it is fine to send invalid bailout id. |
| 3148 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 3145 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
| 3149 ResolvedFeedbackSlot slot; | 3146 VectorSlotPair feedback; |
| 3150 BuildVariableAssignment(arguments, object, Token::ASSIGN, slot, | 3147 BuildVariableAssignment(arguments, object, Token::ASSIGN, feedback, |
| 3151 BailoutId::None(), states); | 3148 BailoutId::None(), states); |
| 3152 | 3149 |
| 3153 return object; | 3150 return object; |
| 3154 } | 3151 } |
| 3155 | 3152 |
| 3156 | 3153 |
| 3157 Node* AstGraphBuilder::BuildRestArgumentsArray(Variable* rest, int index) { | 3154 Node* AstGraphBuilder::BuildRestArgumentsArray(Variable* rest, int index) { |
| 3158 if (rest == NULL) return NULL; | 3155 if (rest == NULL) return NULL; |
| 3159 | 3156 |
| 3160 DCHECK(index >= 0); | 3157 DCHECK(index >= 0); |
| 3161 const Operator* op = javascript()->CallRuntime(Runtime::kNewRestParamSlow, 2); | 3158 const Operator* op = javascript()->CallRuntime(Runtime::kNewRestParamSlow, 2); |
| 3162 Node* object = NewNode(op, jsgraph()->SmiConstant(index), | 3159 Node* object = NewNode(op, jsgraph()->SmiConstant(index), |
| 3163 jsgraph()->SmiConstant(language_mode())); | 3160 jsgraph()->SmiConstant(language_mode())); |
| 3164 | 3161 |
| 3165 // Assign the object to the rest array | 3162 // Assign the object to the rest array |
| 3166 DCHECK(rest->IsContextSlot() || rest->IsStackAllocated()); | 3163 DCHECK(rest->IsContextSlot() || rest->IsStackAllocated()); |
| 3167 // This should never lazy deopt, so it is fine to send invalid bailout id. | 3164 // This should never lazy deopt, so it is fine to send invalid bailout id. |
| 3168 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 3165 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
| 3169 ResolvedFeedbackSlot slot; | 3166 VectorSlotPair feedback; |
| 3170 BuildVariableAssignment(rest, object, Token::ASSIGN, slot, BailoutId::None(), | 3167 BuildVariableAssignment(rest, object, Token::ASSIGN, feedback, |
| 3171 states); | 3168 BailoutId::None(), states); |
| 3172 | 3169 |
| 3173 return object; | 3170 return object; |
| 3174 } | 3171 } |
| 3175 | 3172 |
| 3176 | 3173 |
| 3177 Node* AstGraphBuilder::BuildThisFunctionVar(Variable* this_function_var) { | 3174 Node* AstGraphBuilder::BuildThisFunctionVar(Variable* this_function_var) { |
| 3178 if (this_function_var == nullptr) return nullptr; | 3175 if (this_function_var == nullptr) return nullptr; |
| 3179 | 3176 |
| 3180 Node* this_function = GetFunctionClosure(); | 3177 Node* this_function = GetFunctionClosure(); |
| 3181 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 3178 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
| 3182 ResolvedFeedbackSlot slot; | 3179 VectorSlotPair feedback; |
| 3183 BuildVariableAssignment(this_function_var, this_function, Token::INIT_CONST, | 3180 BuildVariableAssignment(this_function_var, this_function, Token::INIT_CONST, |
| 3184 slot, BailoutId::None(), states); | 3181 feedback, BailoutId::None(), states); |
| 3185 return this_function; | 3182 return this_function; |
| 3186 } | 3183 } |
| 3187 | 3184 |
| 3188 | 3185 |
| 3189 Node* AstGraphBuilder::BuildHoleCheckSilent(Node* value, Node* for_hole, | 3186 Node* AstGraphBuilder::BuildHoleCheckSilent(Node* value, Node* for_hole, |
| 3190 Node* not_hole) { | 3187 Node* not_hole) { |
| 3191 Node* the_hole = jsgraph()->TheHoleConstant(); | 3188 Node* the_hole = jsgraph()->TheHoleConstant(); |
| 3192 Node* check = NewNode(javascript()->StrictEqual(), value, the_hole); | 3189 Node* check = NewNode(javascript()->StrictEqual(), value, the_hole); |
| 3193 return NewNode(common()->Select(kMachAnyTagged, BranchHint::kFalse), check, | 3190 return NewNode(common()->Select(kMachAnyTagged, BranchHint::kFalse), check, |
| 3194 for_hole, not_hole); | 3191 for_hole, not_hole); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 3225 prototype_check.Else(); | 3222 prototype_check.Else(); |
| 3226 environment()->Push(name); | 3223 environment()->Push(name); |
| 3227 prototype_check.End(); | 3224 prototype_check.End(); |
| 3228 return environment()->Pop(); | 3225 return environment()->Pop(); |
| 3229 } | 3226 } |
| 3230 | 3227 |
| 3231 | 3228 |
| 3232 Node* AstGraphBuilder::BuildVariableLoad(Variable* variable, | 3229 Node* AstGraphBuilder::BuildVariableLoad(Variable* variable, |
| 3233 BailoutId bailout_id, | 3230 BailoutId bailout_id, |
| 3234 FrameStateBeforeAndAfter& states, | 3231 FrameStateBeforeAndAfter& states, |
| 3235 const ResolvedFeedbackSlot& feedback, | 3232 const VectorSlotPair& feedback, |
| 3236 OutputFrameStateCombine combine, | 3233 OutputFrameStateCombine combine, |
| 3237 ContextualMode contextual_mode) { | 3234 ContextualMode contextual_mode) { |
| 3238 Node* the_hole = jsgraph()->TheHoleConstant(); | 3235 Node* the_hole = jsgraph()->TheHoleConstant(); |
| 3239 VariableMode mode = variable->mode(); | 3236 VariableMode mode = variable->mode(); |
| 3240 switch (variable->location()) { | 3237 switch (variable->location()) { |
| 3241 case Variable::UNALLOCATED: { | 3238 case Variable::UNALLOCATED: { |
| 3242 // Global var, const, or let variable. | 3239 // Global var, const, or let variable. |
| 3243 Node* global = BuildLoadGlobalObject(); | 3240 Node* global = BuildLoadGlobalObject(); |
| 3244 Handle<Name> name = variable->name(); | 3241 Handle<Name> name = variable->name(); |
| 3245 Node* value = BuildNamedLoad(global, name, feedback, contextual_mode); | 3242 Node* value = BuildNamedLoad(global, name, feedback, contextual_mode); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3360 return result; | 3357 return result; |
| 3361 } | 3358 } |
| 3362 } | 3359 } |
| 3363 UNREACHABLE(); | 3360 UNREACHABLE(); |
| 3364 return NULL; | 3361 return NULL; |
| 3365 } | 3362 } |
| 3366 | 3363 |
| 3367 | 3364 |
| 3368 Node* AstGraphBuilder::BuildVariableAssignment( | 3365 Node* AstGraphBuilder::BuildVariableAssignment( |
| 3369 Variable* variable, Node* value, Token::Value op, | 3366 Variable* variable, Node* value, Token::Value op, |
| 3370 const ResolvedFeedbackSlot& slot, BailoutId bailout_id, | 3367 const VectorSlotPair& feedback, BailoutId bailout_id, |
| 3371 FrameStateBeforeAndAfter& states, OutputFrameStateCombine combine) { | 3368 FrameStateBeforeAndAfter& states, OutputFrameStateCombine combine) { |
| 3372 Node* the_hole = jsgraph()->TheHoleConstant(); | 3369 Node* the_hole = jsgraph()->TheHoleConstant(); |
| 3373 VariableMode mode = variable->mode(); | 3370 VariableMode mode = variable->mode(); |
| 3374 switch (variable->location()) { | 3371 switch (variable->location()) { |
| 3375 case Variable::UNALLOCATED: { | 3372 case Variable::UNALLOCATED: { |
| 3376 // Global var, const, or let variable. | 3373 // Global var, const, or let variable. |
| 3377 Node* global = BuildLoadGlobalObject(); | 3374 Node* global = BuildLoadGlobalObject(); |
| 3378 Handle<Name> name = variable->name(); | 3375 Handle<Name> name = variable->name(); |
| 3379 Node* store = | 3376 Node* store = BuildNamedStore(global, name, value, feedback, |
| 3380 BuildNamedStore(global, name, value, slot, TypeFeedbackId::None()); | 3377 TypeFeedbackId::None()); |
| 3381 states.AddToNode(store, bailout_id, combine); | 3378 states.AddToNode(store, bailout_id, combine); |
| 3382 return store; | 3379 return store; |
| 3383 } | 3380 } |
| 3384 case Variable::PARAMETER: | 3381 case Variable::PARAMETER: |
| 3385 case Variable::LOCAL: | 3382 case Variable::LOCAL: |
| 3386 // Local var, const, or let variable. | 3383 // Local var, const, or let variable. |
| 3387 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { | 3384 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { |
| 3388 // Perform an initialization check for legacy const variables. | 3385 // Perform an initialization check for legacy const variables. |
| 3389 Node* current = environment()->Lookup(variable); | 3386 Node* current = environment()->Lookup(variable); |
| 3390 if (current->op() != the_hole->op()) { | 3387 if (current->op() != the_hole->op()) { |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3485 static inline Node* Record(JSTypeFeedbackTable* js_type_feedback, Node* node, | 3482 static inline Node* Record(JSTypeFeedbackTable* js_type_feedback, Node* node, |
| 3486 TypeFeedbackId id) { | 3483 TypeFeedbackId id) { |
| 3487 if (js_type_feedback) { | 3484 if (js_type_feedback) { |
| 3488 js_type_feedback->Record(node, id); | 3485 js_type_feedback->Record(node, id); |
| 3489 } | 3486 } |
| 3490 return node; | 3487 return node; |
| 3491 } | 3488 } |
| 3492 | 3489 |
| 3493 | 3490 |
| 3494 Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key, | 3491 Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key, |
| 3495 const ResolvedFeedbackSlot& feedback) { | 3492 const VectorSlotPair& feedback) { |
| 3496 const Operator* op = javascript()->LoadProperty(feedback); | 3493 const Operator* op = javascript()->LoadProperty(feedback); |
| 3497 return Record(js_type_feedback_, | 3494 return Record(js_type_feedback_, |
| 3498 NewNode(op, object, key, GetFeedbackVector()), feedback.slot()); | 3495 NewNode(op, object, key, GetFeedbackVector()), feedback.slot()); |
| 3499 } | 3496 } |
| 3500 | 3497 |
| 3501 | 3498 |
| 3502 Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name, | 3499 Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name, |
| 3503 const ResolvedFeedbackSlot& feedback, | 3500 const VectorSlotPair& feedback, |
| 3504 ContextualMode mode) { | 3501 ContextualMode mode) { |
| 3505 const Operator* op = | 3502 const Operator* op = |
| 3506 javascript()->LoadNamed(MakeUnique(name), feedback, mode); | 3503 javascript()->LoadNamed(MakeUnique(name), feedback, mode); |
| 3507 return Record(js_type_feedback_, NewNode(op, object, GetFeedbackVector()), | 3504 return Record(js_type_feedback_, NewNode(op, object, GetFeedbackVector()), |
| 3508 feedback.slot()); | 3505 feedback.slot()); |
| 3509 } | 3506 } |
| 3510 | 3507 |
| 3511 | 3508 |
| 3512 Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node* value, | 3509 Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node* value, |
| 3513 const ResolvedFeedbackSlot& feedback, | 3510 const VectorSlotPair& feedback, |
| 3514 TypeFeedbackId id) { | 3511 TypeFeedbackId id) { |
| 3515 const Operator* op = javascript()->StoreProperty(language_mode(), feedback); | 3512 const Operator* op = javascript()->StoreProperty(language_mode(), feedback); |
| 3516 return Record(js_type_feedback_, NewNode(op, object, key, value), id); | 3513 return Record(js_type_feedback_, NewNode(op, object, key, value), id); |
| 3517 } | 3514 } |
| 3518 | 3515 |
| 3519 | 3516 |
| 3520 Node* AstGraphBuilder::BuildNamedStore(Node* object, Handle<Name> name, | 3517 Node* AstGraphBuilder::BuildNamedStore(Node* object, Handle<Name> name, |
| 3521 Node* value, | 3518 Node* value, |
| 3522 const ResolvedFeedbackSlot& feedback, | 3519 const VectorSlotPair& feedback, |
| 3523 TypeFeedbackId id) { | 3520 TypeFeedbackId id) { |
| 3524 const Operator* op = | 3521 const Operator* op = |
| 3525 javascript()->StoreNamed(language_mode(), MakeUnique(name), feedback); | 3522 javascript()->StoreNamed(language_mode(), MakeUnique(name), feedback); |
| 3526 return Record(js_type_feedback_, NewNode(op, object, value), id); | 3523 return Record(js_type_feedback_, NewNode(op, object, value), id); |
| 3527 } | 3524 } |
| 3528 | 3525 |
| 3529 | 3526 |
| 3530 Node* AstGraphBuilder::BuildNamedSuperLoad( | 3527 Node* AstGraphBuilder::BuildNamedSuperLoad(Node* receiver, Node* home_object, |
| 3531 Node* receiver, Node* home_object, Handle<Name> name, | 3528 Handle<Name> name, |
| 3532 const ResolvedFeedbackSlot& feedback) { | 3529 const VectorSlotPair& feedback) { |
| 3533 Node* name_node = jsgraph()->Constant(name); | 3530 Node* name_node = jsgraph()->Constant(name); |
| 3534 const Operator* op = javascript()->CallRuntime(Runtime::kLoadFromSuper, 3); | 3531 const Operator* op = javascript()->CallRuntime(Runtime::kLoadFromSuper, 3); |
| 3535 Node* value = NewNode(op, receiver, home_object, name_node); | 3532 Node* value = NewNode(op, receiver, home_object, name_node); |
| 3536 return Record(js_type_feedback_, value, feedback.slot()); | 3533 return Record(js_type_feedback_, value, feedback.slot()); |
| 3537 } | 3534 } |
| 3538 | 3535 |
| 3539 | 3536 |
| 3540 Node* AstGraphBuilder::BuildKeyedSuperLoad( | 3537 Node* AstGraphBuilder::BuildKeyedSuperLoad(Node* receiver, Node* home_object, |
| 3541 Node* receiver, Node* home_object, Node* key, | 3538 Node* key, |
| 3542 const ResolvedFeedbackSlot& feedback) { | 3539 const VectorSlotPair& feedback) { |
| 3543 const Operator* op = | 3540 const Operator* op = |
| 3544 javascript()->CallRuntime(Runtime::kLoadKeyedFromSuper, 3); | 3541 javascript()->CallRuntime(Runtime::kLoadKeyedFromSuper, 3); |
| 3545 Node* value = NewNode(op, receiver, home_object, key); | 3542 Node* value = NewNode(op, receiver, home_object, key); |
| 3546 return Record(js_type_feedback_, value, feedback.slot()); | 3543 return Record(js_type_feedback_, value, feedback.slot()); |
| 3547 } | 3544 } |
| 3548 | 3545 |
| 3549 | 3546 |
| 3550 Node* AstGraphBuilder::BuildKeyedSuperStore(Node* receiver, Node* home_object, | 3547 Node* AstGraphBuilder::BuildKeyedSuperStore(Node* receiver, Node* home_object, |
| 3551 Node* key, Node* value, | 3548 Node* key, Node* value, |
| 3552 TypeFeedbackId id) { | 3549 TypeFeedbackId id) { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3661 | 3658 |
| 3662 Node* AstGraphBuilder::BuildToObject(Node* input, BailoutId bailout_id) { | 3659 Node* AstGraphBuilder::BuildToObject(Node* input, BailoutId bailout_id) { |
| 3663 Node* object = NewNode(javascript()->ToObject(), input); | 3660 Node* object = NewNode(javascript()->ToObject(), input); |
| 3664 PrepareFrameState(object, bailout_id, OutputFrameStateCombine::Push()); | 3661 PrepareFrameState(object, bailout_id, OutputFrameStateCombine::Push()); |
| 3665 return object; | 3662 return object; |
| 3666 } | 3663 } |
| 3667 | 3664 |
| 3668 | 3665 |
| 3669 Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object, | 3666 Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object, |
| 3670 Expression* expr, | 3667 Expression* expr, |
| 3671 const ResolvedFeedbackSlot& slot) { | 3668 const VectorSlotPair& feedback) { |
| 3672 if (!FunctionLiteral::NeedsHomeObject(expr)) return value; | 3669 if (!FunctionLiteral::NeedsHomeObject(expr)) return value; |
| 3673 Handle<Name> name = isolate()->factory()->home_object_symbol(); | 3670 Handle<Name> name = isolate()->factory()->home_object_symbol(); |
| 3674 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 3671 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
| 3675 Node* store = | 3672 Node* store = BuildNamedStore(value, name, home_object, feedback, |
| 3676 BuildNamedStore(value, name, home_object, slot, TypeFeedbackId::None()); | 3673 TypeFeedbackId::None()); |
| 3677 states.AddToNode(store, BailoutId::None(), OutputFrameStateCombine::Ignore()); | 3674 states.AddToNode(store, BailoutId::None(), OutputFrameStateCombine::Ignore()); |
| 3678 return store; | 3675 return store; |
| 3679 } | 3676 } |
| 3680 | 3677 |
| 3681 | 3678 |
| 3682 Node* AstGraphBuilder::BuildThrowError(Node* exception, BailoutId bailout_id) { | 3679 Node* AstGraphBuilder::BuildThrowError(Node* exception, BailoutId bailout_id) { |
| 3683 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); | 3680 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); |
| 3684 Node* call = NewNode(op, exception); | 3681 Node* call = NewNode(op, exception); |
| 3685 PrepareFrameState(call, bailout_id); | 3682 PrepareFrameState(call, bailout_id); |
| 3686 Node* control = NewNode(common()->Throw(), call); | 3683 Node* control = NewNode(common()->Throw(), call); |
| (...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4115 // Phi does not exist yet, introduce one. | 4112 // Phi does not exist yet, introduce one. |
| 4116 value = NewPhi(inputs, value, control); | 4113 value = NewPhi(inputs, value, control); |
| 4117 value->ReplaceInput(inputs - 1, other); | 4114 value->ReplaceInput(inputs - 1, other); |
| 4118 } | 4115 } |
| 4119 return value; | 4116 return value; |
| 4120 } | 4117 } |
| 4121 | 4118 |
| 4122 } // namespace compiler | 4119 } // namespace compiler |
| 4123 } // namespace internal | 4120 } // namespace internal |
| 4124 } // namespace v8 | 4121 } // namespace v8 |
| OLD | NEW |