| 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/linkage.h" | 10 #include "src/compiler/linkage.h" |
| (...skipping 1538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1549 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 1549 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
| 1550 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value())); | 1550 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value())); |
| 1551 // Fall through. | 1551 // Fall through. |
| 1552 case ObjectLiteral::Property::COMPUTED: { | 1552 case ObjectLiteral::Property::COMPUTED: { |
| 1553 // It is safe to use [[Put]] here because the boilerplate already | 1553 // It is safe to use [[Put]] here because the boilerplate already |
| 1554 // contains computed properties with an uninitialized value. | 1554 // contains computed properties with an uninitialized value. |
| 1555 if (key->value()->IsInternalizedString()) { | 1555 if (key->value()->IsInternalizedString()) { |
| 1556 if (property->emit_store()) { | 1556 if (property->emit_store()) { |
| 1557 VisitForValue(property->value()); | 1557 VisitForValue(property->value()); |
| 1558 Node* value = environment()->Pop(); | 1558 Node* value = environment()->Pop(); |
| 1559 Unique<Name> name = MakeUnique(key->AsPropertyName()); | 1559 Handle<Name> name = key->AsPropertyName(); |
| 1560 Node* store = | 1560 Node* store = BuildNamedStore(literal, name, value); |
| 1561 NewNode(javascript()->StoreNamed(language_mode(), name), | |
| 1562 literal, value); | |
| 1563 PrepareFrameState(store, key->id()); | 1561 PrepareFrameState(store, key->id()); |
| 1564 BuildSetHomeObject(value, literal, property->value()); | 1562 BuildSetHomeObject(value, literal, property->value()); |
| 1565 } else { | 1563 } else { |
| 1566 VisitForEffect(property->value()); | 1564 VisitForEffect(property->value()); |
| 1567 } | 1565 } |
| 1568 break; | 1566 break; |
| 1569 } | 1567 } |
| 1570 environment()->Push(literal); // Duplicate receiver. | 1568 environment()->Push(literal); // Duplicate receiver. |
| 1571 VisitForValue(property->key()); | 1569 VisitForValue(property->key()); |
| 1572 VisitForValue(property->value()); | 1570 VisitForValue(property->value()); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1724 | 1722 |
| 1725 // Create nodes to evaluate all the non-constant subexpressions and to store | 1723 // Create nodes to evaluate all the non-constant subexpressions and to store |
| 1726 // them into the newly cloned array. | 1724 // them into the newly cloned array. |
| 1727 for (int i = 0; i < expr->values()->length(); i++) { | 1725 for (int i = 0; i < expr->values()->length(); i++) { |
| 1728 Expression* subexpr = expr->values()->at(i); | 1726 Expression* subexpr = expr->values()->at(i); |
| 1729 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; | 1727 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; |
| 1730 | 1728 |
| 1731 VisitForValue(subexpr); | 1729 VisitForValue(subexpr); |
| 1732 Node* value = environment()->Pop(); | 1730 Node* value = environment()->Pop(); |
| 1733 Node* index = jsgraph()->Constant(i); | 1731 Node* index = jsgraph()->Constant(i); |
| 1734 Node* store = NewNode(javascript()->StoreProperty(language_mode()), literal, | 1732 Node* store = BuildKeyedStore(literal, index, value); |
| 1735 index, value); | |
| 1736 PrepareFrameState(store, expr->GetIdForElement(i)); | 1733 PrepareFrameState(store, expr->GetIdForElement(i)); |
| 1737 } | 1734 } |
| 1738 | 1735 |
| 1739 environment()->Pop(); // Array literal index. | 1736 environment()->Pop(); // Array literal index. |
| 1740 ast_context()->ProduceValue(environment()->Pop()); | 1737 ast_context()->ProduceValue(environment()->Pop()); |
| 1741 } | 1738 } |
| 1742 | 1739 |
| 1743 | 1740 |
| 1744 void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value, | 1741 void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value, |
| 1745 BailoutId bailout_id) { | 1742 BailoutId bailout_id) { |
| 1746 DCHECK(expr->IsValidReferenceExpression()); | 1743 DCHECK(expr->IsValidReferenceExpression()); |
| 1747 | 1744 |
| 1748 // Left-hand side can only be a property, a global or a variable slot. | 1745 // Left-hand side can only be a property, a global or a variable slot. |
| 1749 Property* property = expr->AsProperty(); | 1746 Property* property = expr->AsProperty(); |
| 1750 LhsKind assign_type = DetermineLhsKind(expr); | 1747 LhsKind assign_type = DetermineLhsKind(expr); |
| 1751 | 1748 |
| 1752 // Evaluate LHS expression and store the value. | 1749 // Evaluate LHS expression and store the value. |
| 1753 switch (assign_type) { | 1750 switch (assign_type) { |
| 1754 case VARIABLE: { | 1751 case VARIABLE: { |
| 1755 Variable* var = expr->AsVariableProxy()->var(); | 1752 Variable* var = expr->AsVariableProxy()->var(); |
| 1756 BuildVariableAssignment(var, value, Token::ASSIGN, bailout_id); | 1753 BuildVariableAssignment(var, value, Token::ASSIGN, bailout_id); |
| 1757 break; | 1754 break; |
| 1758 } | 1755 } |
| 1759 case NAMED_PROPERTY: { | 1756 case NAMED_PROPERTY: { |
| 1760 environment()->Push(value); | 1757 environment()->Push(value); |
| 1761 VisitForValue(property->obj()); | 1758 VisitForValue(property->obj()); |
| 1762 Node* object = environment()->Pop(); | 1759 Node* object = environment()->Pop(); |
| 1763 value = environment()->Pop(); | 1760 value = environment()->Pop(); |
| 1764 Unique<Name> name = | 1761 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 1765 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); | 1762 Node* store = BuildNamedStore(object, name, value); |
| 1766 Node* store = NewNode(javascript()->StoreNamed(language_mode(), name), | |
| 1767 object, value); | |
| 1768 PrepareFrameState(store, bailout_id); | 1763 PrepareFrameState(store, bailout_id); |
| 1769 break; | 1764 break; |
| 1770 } | 1765 } |
| 1771 case KEYED_PROPERTY: { | 1766 case KEYED_PROPERTY: { |
| 1772 environment()->Push(value); | 1767 environment()->Push(value); |
| 1773 VisitForValue(property->obj()); | 1768 VisitForValue(property->obj()); |
| 1774 VisitForValue(property->key()); | 1769 VisitForValue(property->key()); |
| 1775 Node* key = environment()->Pop(); | 1770 Node* key = environment()->Pop(); |
| 1776 Node* object = environment()->Pop(); | 1771 Node* object = environment()->Pop(); |
| 1777 value = environment()->Pop(); | 1772 value = environment()->Pop(); |
| 1778 Node* store = NewNode(javascript()->StoreProperty(language_mode()), | 1773 Node* store = BuildKeyedStore(object, key, value); |
| 1779 object, key, value); | |
| 1780 PrepareFrameState(store, bailout_id); | 1774 PrepareFrameState(store, bailout_id); |
| 1781 break; | 1775 break; |
| 1782 } | 1776 } |
| 1783 } | 1777 } |
| 1784 } | 1778 } |
| 1785 | 1779 |
| 1786 | 1780 |
| 1787 void AstGraphBuilder::VisitAssignment(Assignment* expr) { | 1781 void AstGraphBuilder::VisitAssignment(Assignment* expr) { |
| 1788 DCHECK(expr->target()->IsValidReferenceExpression()); | 1782 DCHECK(expr->target()->IsValidReferenceExpression()); |
| 1789 | 1783 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1813 switch (assign_type) { | 1807 switch (assign_type) { |
| 1814 case VARIABLE: { | 1808 case VARIABLE: { |
| 1815 VariableProxy* proxy = expr->target()->AsVariableProxy(); | 1809 VariableProxy* proxy = expr->target()->AsVariableProxy(); |
| 1816 VectorSlotPair pair = | 1810 VectorSlotPair pair = |
| 1817 CreateVectorSlotPair(proxy->VariableFeedbackSlot()); | 1811 CreateVectorSlotPair(proxy->VariableFeedbackSlot()); |
| 1818 old_value = BuildVariableLoad(proxy->var(), expr->target()->id(), pair); | 1812 old_value = BuildVariableLoad(proxy->var(), expr->target()->id(), pair); |
| 1819 break; | 1813 break; |
| 1820 } | 1814 } |
| 1821 case NAMED_PROPERTY: { | 1815 case NAMED_PROPERTY: { |
| 1822 Node* object = environment()->Top(); | 1816 Node* object = environment()->Top(); |
| 1823 Unique<Name> name = | 1817 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 1824 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); | |
| 1825 VectorSlotPair pair = | 1818 VectorSlotPair pair = |
| 1826 CreateVectorSlotPair(property->PropertyFeedbackSlot()); | 1819 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 1827 old_value = NewNode(javascript()->LoadNamed(name, pair), object); | 1820 old_value = BuildNamedLoad(object, name, pair); |
| 1828 PrepareFrameState(old_value, property->LoadId(), | 1821 PrepareFrameState(old_value, property->LoadId(), |
| 1829 OutputFrameStateCombine::Push()); | 1822 OutputFrameStateCombine::Push()); |
| 1830 break; | 1823 break; |
| 1831 } | 1824 } |
| 1832 case KEYED_PROPERTY: { | 1825 case KEYED_PROPERTY: { |
| 1833 Node* key = environment()->Top(); | 1826 Node* key = environment()->Top(); |
| 1834 Node* object = environment()->Peek(1); | 1827 Node* object = environment()->Peek(1); |
| 1835 VectorSlotPair pair = | 1828 VectorSlotPair pair = |
| 1836 CreateVectorSlotPair(property->PropertyFeedbackSlot()); | 1829 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 1837 old_value = NewNode(javascript()->LoadProperty(pair), object, key); | 1830 old_value = BuildKeyedLoad(object, key, pair); |
| 1838 PrepareFrameState(old_value, property->LoadId(), | 1831 PrepareFrameState(old_value, property->LoadId(), |
| 1839 OutputFrameStateCombine::Push()); | 1832 OutputFrameStateCombine::Push()); |
| 1840 break; | 1833 break; |
| 1841 } | 1834 } |
| 1842 } | 1835 } |
| 1843 environment()->Push(old_value); | 1836 environment()->Push(old_value); |
| 1844 VisitForValue(expr->value()); | 1837 VisitForValue(expr->value()); |
| 1845 Node* frame_state_before = environment()->Checkpoint(expr->value()->id()); | 1838 Node* frame_state_before = environment()->Checkpoint(expr->value()->id()); |
| 1846 Node* right = environment()->Pop(); | 1839 Node* right = environment()->Pop(); |
| 1847 Node* left = environment()->Pop(); | 1840 Node* left = environment()->Pop(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1858 Node* value = environment()->Pop(); | 1851 Node* value = environment()->Pop(); |
| 1859 switch (assign_type) { | 1852 switch (assign_type) { |
| 1860 case VARIABLE: { | 1853 case VARIABLE: { |
| 1861 Variable* variable = expr->target()->AsVariableProxy()->var(); | 1854 Variable* variable = expr->target()->AsVariableProxy()->var(); |
| 1862 BuildVariableAssignment(variable, value, expr->op(), expr->id(), | 1855 BuildVariableAssignment(variable, value, expr->op(), expr->id(), |
| 1863 ast_context()->GetStateCombine()); | 1856 ast_context()->GetStateCombine()); |
| 1864 break; | 1857 break; |
| 1865 } | 1858 } |
| 1866 case NAMED_PROPERTY: { | 1859 case NAMED_PROPERTY: { |
| 1867 Node* object = environment()->Pop(); | 1860 Node* object = environment()->Pop(); |
| 1868 Unique<Name> name = | 1861 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 1869 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); | 1862 Node* store = BuildNamedStore(object, name, value); |
| 1870 Node* store = NewNode(javascript()->StoreNamed(language_mode(), name), | |
| 1871 object, value); | |
| 1872 PrepareFrameState(store, expr->id(), ast_context()->GetStateCombine()); | 1863 PrepareFrameState(store, expr->id(), ast_context()->GetStateCombine()); |
| 1873 break; | 1864 break; |
| 1874 } | 1865 } |
| 1875 case KEYED_PROPERTY: { | 1866 case KEYED_PROPERTY: { |
| 1876 Node* key = environment()->Pop(); | 1867 Node* key = environment()->Pop(); |
| 1877 Node* object = environment()->Pop(); | 1868 Node* object = environment()->Pop(); |
| 1878 Node* store = NewNode(javascript()->StoreProperty(language_mode()), | 1869 Node* store = BuildKeyedStore(object, key, value); |
| 1879 object, key, value); | |
| 1880 PrepareFrameState(store, expr->id(), ast_context()->GetStateCombine()); | 1870 PrepareFrameState(store, expr->id(), ast_context()->GetStateCombine()); |
| 1881 break; | 1871 break; |
| 1882 } | 1872 } |
| 1883 } | 1873 } |
| 1884 | 1874 |
| 1885 ast_context()->ProduceValue(value); | 1875 ast_context()->ProduceValue(value); |
| 1886 } | 1876 } |
| 1887 | 1877 |
| 1888 | 1878 |
| 1889 void AstGraphBuilder::VisitYield(Yield* expr) { | 1879 void AstGraphBuilder::VisitYield(Yield* expr) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1900 ast_context()->ProduceValue(value); | 1890 ast_context()->ProduceValue(value); |
| 1901 } | 1891 } |
| 1902 | 1892 |
| 1903 | 1893 |
| 1904 void AstGraphBuilder::VisitProperty(Property* expr) { | 1894 void AstGraphBuilder::VisitProperty(Property* expr) { |
| 1905 Node* value; | 1895 Node* value; |
| 1906 VectorSlotPair pair = CreateVectorSlotPair(expr->PropertyFeedbackSlot()); | 1896 VectorSlotPair pair = CreateVectorSlotPair(expr->PropertyFeedbackSlot()); |
| 1907 if (expr->key()->IsPropertyName()) { | 1897 if (expr->key()->IsPropertyName()) { |
| 1908 VisitForValue(expr->obj()); | 1898 VisitForValue(expr->obj()); |
| 1909 Node* object = environment()->Pop(); | 1899 Node* object = environment()->Pop(); |
| 1910 Unique<Name> name = MakeUnique(expr->key()->AsLiteral()->AsPropertyName()); | 1900 Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName(); |
| 1911 value = NewNode(javascript()->LoadNamed(name, pair), object); | 1901 value = BuildNamedLoad(object, name, pair); |
| 1912 } else { | 1902 } else { |
| 1913 VisitForValue(expr->obj()); | 1903 VisitForValue(expr->obj()); |
| 1914 VisitForValue(expr->key()); | 1904 VisitForValue(expr->key()); |
| 1915 Node* key = environment()->Pop(); | 1905 Node* key = environment()->Pop(); |
| 1916 Node* object = environment()->Pop(); | 1906 Node* object = environment()->Pop(); |
| 1917 value = NewNode(javascript()->LoadProperty(pair), object, key); | 1907 value = BuildKeyedLoad(object, key, pair); |
| 1918 } | 1908 } |
| 1919 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); | 1909 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
| 1920 ast_context()->ProduceValue(value); | 1910 ast_context()->ProduceValue(value); |
| 1921 } | 1911 } |
| 1922 | 1912 |
| 1923 | 1913 |
| 1924 void AstGraphBuilder::VisitCall(Call* expr) { | 1914 void AstGraphBuilder::VisitCall(Call* expr) { |
| 1925 Expression* callee = expr->expression(); | 1915 Expression* callee = expr->expression(); |
| 1926 Call::CallType call_type = expr->GetCallType(isolate()); | 1916 Call::CallType call_type = expr->GetCallType(isolate()); |
| 1927 | 1917 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1954 OutputFrameStateCombine::Push(2)); | 1944 OutputFrameStateCombine::Push(2)); |
| 1955 break; | 1945 break; |
| 1956 } | 1946 } |
| 1957 case Call::PROPERTY_CALL: { | 1947 case Call::PROPERTY_CALL: { |
| 1958 Property* property = callee->AsProperty(); | 1948 Property* property = callee->AsProperty(); |
| 1959 VisitForValue(property->obj()); | 1949 VisitForValue(property->obj()); |
| 1960 Node* object = environment()->Top(); | 1950 Node* object = environment()->Top(); |
| 1961 VectorSlotPair pair = | 1951 VectorSlotPair pair = |
| 1962 CreateVectorSlotPair(property->PropertyFeedbackSlot()); | 1952 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 1963 if (property->key()->IsPropertyName()) { | 1953 if (property->key()->IsPropertyName()) { |
| 1964 Unique<Name> name = | 1954 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 1965 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); | 1955 callee_value = BuildNamedLoad(object, name, pair); |
| 1966 callee_value = NewNode(javascript()->LoadNamed(name, pair), object); | |
| 1967 } else { | 1956 } else { |
| 1968 VisitForValue(property->key()); | 1957 VisitForValue(property->key()); |
| 1969 Node* key = environment()->Pop(); | 1958 Node* key = environment()->Pop(); |
| 1970 callee_value = NewNode(javascript()->LoadProperty(pair), object, key); | 1959 callee_value = BuildKeyedLoad(object, key, pair); |
| 1971 } | 1960 } |
| 1972 PrepareFrameState(callee_value, property->LoadId(), | 1961 PrepareFrameState(callee_value, property->LoadId(), |
| 1973 OutputFrameStateCombine::Push()); | 1962 OutputFrameStateCombine::Push()); |
| 1974 receiver_value = environment()->Pop(); | 1963 receiver_value = environment()->Pop(); |
| 1975 // Note that a PROPERTY_CALL requires the receiver to be wrapped into an | 1964 // Note that a PROPERTY_CALL requires the receiver to be wrapped into an |
| 1976 // object for sloppy callees. This could also be modeled explicitly here, | 1965 // object for sloppy callees. This could also be modeled explicitly here, |
| 1977 // thereby obsoleting the need for a flag to the call operator. | 1966 // thereby obsoleting the need for a flag to the call operator. |
| 1978 flags = CALL_AS_METHOD; | 1967 flags = CALL_AS_METHOD; |
| 1979 break; | 1968 break; |
| 1980 } | 1969 } |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2055 } | 2044 } |
| 2056 | 2045 |
| 2057 | 2046 |
| 2058 void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) { | 2047 void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) { |
| 2059 Handle<String> name = expr->name(); | 2048 Handle<String> name = expr->name(); |
| 2060 | 2049 |
| 2061 // The callee and the receiver both have to be pushed onto the operand stack | 2050 // The callee and the receiver both have to be pushed onto the operand stack |
| 2062 // before arguments are being evaluated. | 2051 // before arguments are being evaluated. |
| 2063 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; | 2052 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; |
| 2064 Node* receiver_value = BuildLoadBuiltinsObject(); | 2053 Node* receiver_value = BuildLoadBuiltinsObject(); |
| 2065 Unique<String> unique = MakeUnique(name); | |
| 2066 VectorSlotPair pair = CreateVectorSlotPair(expr->CallRuntimeFeedbackSlot()); | 2054 VectorSlotPair pair = CreateVectorSlotPair(expr->CallRuntimeFeedbackSlot()); |
| 2067 Node* callee_value = | 2055 Node* callee_value = BuildNamedLoad(receiver_value, name, pair); |
| 2068 NewNode(javascript()->LoadNamed(unique, pair), receiver_value); | |
| 2069 // TODO(jarin): Find/create a bailout id to deoptimize to (crankshaft | 2056 // TODO(jarin): Find/create a bailout id to deoptimize to (crankshaft |
| 2070 // refuses to optimize functions with jsruntime calls). | 2057 // refuses to optimize functions with jsruntime calls). |
| 2071 PrepareFrameState(callee_value, BailoutId::None(), | 2058 PrepareFrameState(callee_value, BailoutId::None(), |
| 2072 OutputFrameStateCombine::Push()); | 2059 OutputFrameStateCombine::Push()); |
| 2073 environment()->Push(callee_value); | 2060 environment()->Push(callee_value); |
| 2074 environment()->Push(receiver_value); | 2061 environment()->Push(receiver_value); |
| 2075 | 2062 |
| 2076 // Evaluate all arguments to the JS runtime call. | 2063 // Evaluate all arguments to the JS runtime call. |
| 2077 ZoneList<Expression*>* args = expr->arguments(); | 2064 ZoneList<Expression*>* args = expr->arguments(); |
| 2078 VisitForValues(args); | 2065 VisitForValues(args); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2143 VariableProxy* proxy = expr->expression()->AsVariableProxy(); | 2130 VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
| 2144 VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot()); | 2131 VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot()); |
| 2145 old_value = | 2132 old_value = |
| 2146 BuildVariableLoad(proxy->var(), expr->expression()->id(), pair); | 2133 BuildVariableLoad(proxy->var(), expr->expression()->id(), pair); |
| 2147 stack_depth = 0; | 2134 stack_depth = 0; |
| 2148 break; | 2135 break; |
| 2149 } | 2136 } |
| 2150 case NAMED_PROPERTY: { | 2137 case NAMED_PROPERTY: { |
| 2151 VisitForValue(property->obj()); | 2138 VisitForValue(property->obj()); |
| 2152 Node* object = environment()->Top(); | 2139 Node* object = environment()->Top(); |
| 2153 Unique<Name> name = | 2140 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2154 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); | |
| 2155 VectorSlotPair pair = | 2141 VectorSlotPair pair = |
| 2156 CreateVectorSlotPair(property->PropertyFeedbackSlot()); | 2142 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 2157 old_value = NewNode(javascript()->LoadNamed(name, pair), object); | 2143 old_value = BuildNamedLoad(object, name, pair); |
| 2158 PrepareFrameState(old_value, property->LoadId(), | 2144 PrepareFrameState(old_value, property->LoadId(), |
| 2159 OutputFrameStateCombine::Push()); | 2145 OutputFrameStateCombine::Push()); |
| 2160 stack_depth = 1; | 2146 stack_depth = 1; |
| 2161 break; | 2147 break; |
| 2162 } | 2148 } |
| 2163 case KEYED_PROPERTY: { | 2149 case KEYED_PROPERTY: { |
| 2164 VisitForValue(property->obj()); | 2150 VisitForValue(property->obj()); |
| 2165 VisitForValue(property->key()); | 2151 VisitForValue(property->key()); |
| 2166 Node* key = environment()->Top(); | 2152 Node* key = environment()->Top(); |
| 2167 Node* object = environment()->Peek(1); | 2153 Node* object = environment()->Peek(1); |
| 2168 VectorSlotPair pair = | 2154 VectorSlotPair pair = |
| 2169 CreateVectorSlotPair(property->PropertyFeedbackSlot()); | 2155 CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| 2170 old_value = NewNode(javascript()->LoadProperty(pair), object, key); | 2156 old_value = BuildKeyedLoad(object, key, pair); |
| 2171 PrepareFrameState(old_value, property->LoadId(), | 2157 PrepareFrameState(old_value, property->LoadId(), |
| 2172 OutputFrameStateCombine::Push()); | 2158 OutputFrameStateCombine::Push()); |
| 2173 stack_depth = 2; | 2159 stack_depth = 2; |
| 2174 break; | 2160 break; |
| 2175 } | 2161 } |
| 2176 } | 2162 } |
| 2177 | 2163 |
| 2178 // Convert old value into a number. | 2164 // Convert old value into a number. |
| 2179 old_value = NewNode(javascript()->ToNumber(), old_value); | 2165 old_value = NewNode(javascript()->ToNumber(), old_value); |
| 2180 PrepareFrameState(old_value, expr->ToNumberId(), | 2166 PrepareFrameState(old_value, expr->ToNumberId(), |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2197 case VARIABLE: { | 2183 case VARIABLE: { |
| 2198 Variable* variable = expr->expression()->AsVariableProxy()->var(); | 2184 Variable* variable = expr->expression()->AsVariableProxy()->var(); |
| 2199 environment()->Push(value); | 2185 environment()->Push(value); |
| 2200 BuildVariableAssignment(variable, value, expr->op(), | 2186 BuildVariableAssignment(variable, value, expr->op(), |
| 2201 expr->AssignmentId()); | 2187 expr->AssignmentId()); |
| 2202 environment()->Pop(); | 2188 environment()->Pop(); |
| 2203 break; | 2189 break; |
| 2204 } | 2190 } |
| 2205 case NAMED_PROPERTY: { | 2191 case NAMED_PROPERTY: { |
| 2206 Node* object = environment()->Pop(); | 2192 Node* object = environment()->Pop(); |
| 2207 Unique<Name> name = | 2193 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2208 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); | 2194 Node* store = BuildNamedStore(object, name, value); |
| 2209 Node* store = NewNode(javascript()->StoreNamed(language_mode(), name), | |
| 2210 object, value); | |
| 2211 environment()->Push(value); | 2195 environment()->Push(value); |
| 2212 PrepareFrameState(store, expr->AssignmentId()); | 2196 PrepareFrameState(store, expr->AssignmentId()); |
| 2213 environment()->Pop(); | 2197 environment()->Pop(); |
| 2214 break; | 2198 break; |
| 2215 } | 2199 } |
| 2216 case KEYED_PROPERTY: { | 2200 case KEYED_PROPERTY: { |
| 2217 Node* key = environment()->Pop(); | 2201 Node* key = environment()->Pop(); |
| 2218 Node* object = environment()->Pop(); | 2202 Node* object = environment()->Pop(); |
| 2219 Node* store = NewNode(javascript()->StoreProperty(language_mode()), | 2203 Node* store = BuildKeyedStore(object, key, value); |
| 2220 object, key, value); | |
| 2221 environment()->Push(value); | 2204 environment()->Push(value); |
| 2222 PrepareFrameState(store, expr->AssignmentId()); | 2205 PrepareFrameState(store, expr->AssignmentId()); |
| 2223 environment()->Pop(); | 2206 environment()->Pop(); |
| 2224 break; | 2207 break; |
| 2225 } | 2208 } |
| 2226 } | 2209 } |
| 2227 | 2210 |
| 2228 // Restore old value for postfix expressions. | 2211 // Restore old value for postfix expressions. |
| 2229 if (is_postfix) value = environment()->Pop(); | 2212 if (is_postfix) value = environment()->Pop(); |
| 2230 | 2213 |
| (...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2614 Node* AstGraphBuilder::BuildVariableLoad(Variable* variable, | 2597 Node* AstGraphBuilder::BuildVariableLoad(Variable* variable, |
| 2615 BailoutId bailout_id, | 2598 BailoutId bailout_id, |
| 2616 const VectorSlotPair& feedback, | 2599 const VectorSlotPair& feedback, |
| 2617 ContextualMode contextual_mode) { | 2600 ContextualMode contextual_mode) { |
| 2618 Node* the_hole = jsgraph()->TheHoleConstant(); | 2601 Node* the_hole = jsgraph()->TheHoleConstant(); |
| 2619 VariableMode mode = variable->mode(); | 2602 VariableMode mode = variable->mode(); |
| 2620 switch (variable->location()) { | 2603 switch (variable->location()) { |
| 2621 case Variable::UNALLOCATED: { | 2604 case Variable::UNALLOCATED: { |
| 2622 // Global var, const, or let variable. | 2605 // Global var, const, or let variable. |
| 2623 Node* global = BuildLoadGlobalObject(); | 2606 Node* global = BuildLoadGlobalObject(); |
| 2624 Unique<Name> name = MakeUnique(variable->name()); | 2607 Handle<Name> name = variable->name(); |
| 2625 const Operator* op = | 2608 Node* node = BuildNamedLoad(global, name, feedback, contextual_mode); |
| 2626 javascript()->LoadNamed(name, feedback, contextual_mode); | |
| 2627 Node* node = NewNode(op, global); | |
| 2628 PrepareFrameState(node, bailout_id, OutputFrameStateCombine::Push()); | 2609 PrepareFrameState(node, bailout_id, OutputFrameStateCombine::Push()); |
| 2629 return node; | 2610 return node; |
| 2630 } | 2611 } |
| 2631 case Variable::PARAMETER: | 2612 case Variable::PARAMETER: |
| 2632 case Variable::LOCAL: { | 2613 case Variable::LOCAL: { |
| 2633 // Local var, const, or let variable. | 2614 // Local var, const, or let variable. |
| 2634 Node* value = environment()->Lookup(variable); | 2615 Node* value = environment()->Lookup(variable); |
| 2635 if (mode == CONST_LEGACY) { | 2616 if (mode == CONST_LEGACY) { |
| 2636 // Perform check for uninitialized legacy const variables. | 2617 // Perform check for uninitialized legacy const variables. |
| 2637 if (value->op() == the_hole->op()) { | 2618 if (value->op() == the_hole->op()) { |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2723 | 2704 |
| 2724 Node* AstGraphBuilder::BuildVariableAssignment( | 2705 Node* AstGraphBuilder::BuildVariableAssignment( |
| 2725 Variable* variable, Node* value, Token::Value op, BailoutId bailout_id, | 2706 Variable* variable, Node* value, Token::Value op, BailoutId bailout_id, |
| 2726 OutputFrameStateCombine combine) { | 2707 OutputFrameStateCombine combine) { |
| 2727 Node* the_hole = jsgraph()->TheHoleConstant(); | 2708 Node* the_hole = jsgraph()->TheHoleConstant(); |
| 2728 VariableMode mode = variable->mode(); | 2709 VariableMode mode = variable->mode(); |
| 2729 switch (variable->location()) { | 2710 switch (variable->location()) { |
| 2730 case Variable::UNALLOCATED: { | 2711 case Variable::UNALLOCATED: { |
| 2731 // Global var, const, or let variable. | 2712 // Global var, const, or let variable. |
| 2732 Node* global = BuildLoadGlobalObject(); | 2713 Node* global = BuildLoadGlobalObject(); |
| 2733 Unique<Name> name = MakeUnique(variable->name()); | 2714 Handle<Name> name = variable->name(); |
| 2734 const Operator* op = javascript()->StoreNamed(language_mode(), name); | 2715 Node* store = BuildNamedStore(global, name, value); |
| 2735 Node* store = NewNode(op, global, value); | |
| 2736 PrepareFrameState(store, bailout_id, combine); | 2716 PrepareFrameState(store, bailout_id, combine); |
| 2737 return store; | 2717 return store; |
| 2738 } | 2718 } |
| 2739 case Variable::PARAMETER: | 2719 case Variable::PARAMETER: |
| 2740 case Variable::LOCAL: | 2720 case Variable::LOCAL: |
| 2741 // Local var, const, or let variable. | 2721 // Local var, const, or let variable. |
| 2742 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { | 2722 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { |
| 2743 // Perform an initialization check for legacy const variables. | 2723 // Perform an initialization check for legacy const variables. |
| 2744 Node* current = environment()->Lookup(variable); | 2724 Node* current = environment()->Lookup(variable); |
| 2745 if (current->op() != the_hole->op()) { | 2725 if (current->op() != the_hole->op()) { |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2821 Node* store = NewNode(op, value, current_context(), name, language); | 2801 Node* store = NewNode(op, value, current_context(), name, language); |
| 2822 PrepareFrameState(store, bailout_id, combine); | 2802 PrepareFrameState(store, bailout_id, combine); |
| 2823 return store; | 2803 return store; |
| 2824 } | 2804 } |
| 2825 } | 2805 } |
| 2826 UNREACHABLE(); | 2806 UNREACHABLE(); |
| 2827 return NULL; | 2807 return NULL; |
| 2828 } | 2808 } |
| 2829 | 2809 |
| 2830 | 2810 |
| 2811 Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key, |
| 2812 const VectorSlotPair& feedback) { |
| 2813 const Operator* op = javascript()->LoadProperty(feedback); |
| 2814 return NewNode(op, object, key); |
| 2815 } |
| 2816 |
| 2817 |
| 2818 Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name, |
| 2819 const VectorSlotPair& feedback, |
| 2820 ContextualMode mode) { |
| 2821 const Operator* op = |
| 2822 javascript()->LoadNamed(MakeUnique(name), feedback, mode); |
| 2823 return NewNode(op, object); |
| 2824 } |
| 2825 |
| 2826 |
| 2827 Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node* value) { |
| 2828 const Operator* op = javascript()->StoreProperty(language_mode()); |
| 2829 return NewNode(op, object, key, value); |
| 2830 } |
| 2831 |
| 2832 |
| 2833 Node* AstGraphBuilder::BuildNamedStore(Node* object, Handle<Name> name, |
| 2834 Node* value) { |
| 2835 const Operator* op = |
| 2836 javascript()->StoreNamed(language_mode(), MakeUnique(name)); |
| 2837 return NewNode(op, object, value); |
| 2838 } |
| 2839 |
| 2840 |
| 2831 Node* AstGraphBuilder::BuildLoadObjectField(Node* object, int offset) { | 2841 Node* AstGraphBuilder::BuildLoadObjectField(Node* object, int offset) { |
| 2832 return NewNode(jsgraph()->machine()->Load(kMachAnyTagged), object, | 2842 return NewNode(jsgraph()->machine()->Load(kMachAnyTagged), object, |
| 2833 jsgraph()->IntPtrConstant(offset - kHeapObjectTag)); | 2843 jsgraph()->IntPtrConstant(offset - kHeapObjectTag)); |
| 2834 } | 2844 } |
| 2835 | 2845 |
| 2836 | 2846 |
| 2837 Node* AstGraphBuilder::BuildLoadBuiltinsObject() { | 2847 Node* AstGraphBuilder::BuildLoadBuiltinsObject() { |
| 2838 Node* global = BuildLoadGlobalObject(); | 2848 Node* global = BuildLoadGlobalObject(); |
| 2839 Node* builtins = | 2849 Node* builtins = |
| 2840 BuildLoadObjectField(global, JSGlobalObject::kBuiltinsOffset); | 2850 BuildLoadObjectField(global, JSGlobalObject::kBuiltinsOffset); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2905 // into a JSOperatorReducer. | 2915 // into a JSOperatorReducer. |
| 2906 Node* name = NewNode(javascript()->ToName(), input); | 2916 Node* name = NewNode(javascript()->ToName(), input); |
| 2907 PrepareFrameState(name, bailout_id); | 2917 PrepareFrameState(name, bailout_id); |
| 2908 return name; | 2918 return name; |
| 2909 } | 2919 } |
| 2910 | 2920 |
| 2911 | 2921 |
| 2912 Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object, | 2922 Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object, |
| 2913 Expression* expr) { | 2923 Expression* expr) { |
| 2914 if (!FunctionLiteral::NeedsHomeObject(expr)) return value; | 2924 if (!FunctionLiteral::NeedsHomeObject(expr)) return value; |
| 2915 Unique<Name> name = MakeUnique(isolate()->factory()->home_object_symbol()); | 2925 Handle<Name> name = isolate()->factory()->home_object_symbol(); |
| 2916 const Operator* op = javascript()->StoreNamed(language_mode(), name); | 2926 Node* store = BuildNamedStore(value, name, home_object); |
| 2917 Node* store = NewNode(op, value, home_object); | |
| 2918 PrepareFrameState(store, BailoutId::None()); | 2927 PrepareFrameState(store, BailoutId::None()); |
| 2919 return store; | 2928 return store; |
| 2920 } | 2929 } |
| 2921 | 2930 |
| 2922 | 2931 |
| 2923 Node* AstGraphBuilder::BuildThrowError(Node* exception, BailoutId bailout_id) { | 2932 Node* AstGraphBuilder::BuildThrowError(Node* exception, BailoutId bailout_id) { |
| 2924 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); | 2933 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); |
| 2925 Node* call = NewNode(op, exception); | 2934 Node* call = NewNode(op, exception); |
| 2926 PrepareFrameState(call, bailout_id); | 2935 PrepareFrameState(call, bailout_id); |
| 2927 return call; | 2936 return call; |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3329 // Phi does not exist yet, introduce one. | 3338 // Phi does not exist yet, introduce one. |
| 3330 value = NewPhi(inputs, value, control); | 3339 value = NewPhi(inputs, value, control); |
| 3331 value->ReplaceInput(inputs - 1, other); | 3340 value->ReplaceInput(inputs - 1, other); |
| 3332 } | 3341 } |
| 3333 return value; | 3342 return value; |
| 3334 } | 3343 } |
| 3335 | 3344 |
| 3336 } // namespace compiler | 3345 } // namespace compiler |
| 3337 } // namespace internal | 3346 } // namespace internal |
| 3338 } // namespace v8 | 3347 } // namespace v8 |
| OLD | NEW |