Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(195)

Side by Side Diff: src/compiler/ast-graph-builder.cc

Issue 1321993004: Vector ICs: ObjectLiteral refactoring for Oracle feedback (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE, turned off flag. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/ast-graph-builder.h ('k') | src/full-codegen/arm/full-codegen-arm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1552 matching lines...) Expand 10 before | Expand all | Expand 10 after
1563 // is needed here since the constructor is created by the class literal. 1563 // is needed here since the constructor is created by the class literal.
1564 Node* proto = 1564 Node* proto =
1565 BuildLoadObjectField(literal, JSFunction::kPrototypeOrInitialMapOffset); 1565 BuildLoadObjectField(literal, JSFunction::kPrototypeOrInitialMapOffset);
1566 1566
1567 // The class literal and the prototype are both expected on the operand stack 1567 // The class literal and the prototype are both expected on the operand stack
1568 // during evaluation of the method values. 1568 // during evaluation of the method values.
1569 environment()->Push(literal); 1569 environment()->Push(literal);
1570 environment()->Push(proto); 1570 environment()->Push(proto);
1571 1571
1572 // Create nodes to store method values into the literal. 1572 // Create nodes to store method values into the literal.
1573 int store_slot_index = 0;
1574 for (int i = 0; i < expr->properties()->length(); i++) { 1573 for (int i = 0; i < expr->properties()->length(); i++) {
1575 ObjectLiteral::Property* property = expr->properties()->at(i); 1574 ObjectLiteral::Property* property = expr->properties()->at(i);
1576 environment()->Push(property->is_static() ? literal : proto); 1575 environment()->Push(property->is_static() ? literal : proto);
1577 1576
1578 VisitForValue(property->key()); 1577 VisitForValue(property->key());
1579 Node* name = BuildToName(environment()->Pop(), expr->GetIdForProperty(i)); 1578 Node* name = BuildToName(environment()->Pop(), expr->GetIdForProperty(i));
1580 environment()->Push(name); 1579 environment()->Push(name);
1581 1580
1582 // The static prototype property is read only. We handle the non computed 1581 // The static prototype property is read only. We handle the non computed
1583 // property name case in the parser. Since this is the only case where we 1582 // property name case in the parser. Since this is the only case where we
1584 // need to check for an own read only property we special case this so we do 1583 // need to check for an own read only property we special case this so we do
1585 // not need to do this for every property. 1584 // not need to do this for every property.
1586 if (property->is_static() && property->is_computed_name()) { 1585 if (property->is_static() && property->is_computed_name()) {
1587 Node* check = BuildThrowIfStaticPrototype(environment()->Pop(), 1586 Node* check = BuildThrowIfStaticPrototype(environment()->Pop(),
1588 expr->GetIdForProperty(i)); 1587 expr->GetIdForProperty(i));
1589 environment()->Push(check); 1588 environment()->Push(check);
1590 } 1589 }
1591 1590
1592 VisitForValue(property->value()); 1591 VisitForValue(property->value());
1593 Node* value = environment()->Pop(); 1592 Node* value = environment()->Pop();
1594 Node* key = environment()->Pop(); 1593 Node* key = environment()->Pop();
1595 Node* receiver = environment()->Pop(); 1594 Node* receiver = environment()->Pop();
1596 VectorSlotPair feedback = CreateVectorSlotPair( 1595
1597 expr->SlotForHomeObject(property->value(), &store_slot_index)); 1596 BuildSetHomeObject(value, receiver, property);
1598 BuildSetHomeObject(value, receiver, property->value(), feedback);
1599 1597
1600 switch (property->kind()) { 1598 switch (property->kind()) {
1601 case ObjectLiteral::Property::CONSTANT: 1599 case ObjectLiteral::Property::CONSTANT:
1602 case ObjectLiteral::Property::MATERIALIZED_LITERAL: 1600 case ObjectLiteral::Property::MATERIALIZED_LITERAL:
1603 case ObjectLiteral::Property::PROTOTYPE: 1601 case ObjectLiteral::Property::PROTOTYPE:
1604 UNREACHABLE(); 1602 UNREACHABLE();
1605 case ObjectLiteral::Property::COMPUTED: { 1603 case ObjectLiteral::Property::COMPUTED: {
1606 const Operator* op = 1604 const Operator* op =
1607 javascript()->CallRuntime(Runtime::kDefineClassMethod, 3); 1605 javascript()->CallRuntime(Runtime::kDefineClassMethod, 3);
1608 NewNode(op, receiver, key, value); 1606 NewNode(op, receiver, key, value);
(...skipping 22 matching lines...) Expand all
1631 environment()->Pop(); // literal 1629 environment()->Pop(); // literal
1632 const Operator* op = 1630 const Operator* op =
1633 javascript()->CallRuntime(Runtime::kFinalizeClassDefinition, 2); 1631 javascript()->CallRuntime(Runtime::kFinalizeClassDefinition, 2);
1634 literal = NewNode(op, literal, proto); 1632 literal = NewNode(op, literal, proto);
1635 1633
1636 // Assign to class variable. 1634 // Assign to class variable.
1637 if (expr->scope() != NULL) { 1635 if (expr->scope() != NULL) {
1638 DCHECK_NOT_NULL(expr->class_variable_proxy()); 1636 DCHECK_NOT_NULL(expr->class_variable_proxy());
1639 Variable* var = expr->class_variable_proxy()->var(); 1637 Variable* var = expr->class_variable_proxy()->var();
1640 FrameStateBeforeAndAfter states(this, BailoutId::None()); 1638 FrameStateBeforeAndAfter states(this, BailoutId::None());
1641 VectorSlotPair feedback = 1639 VectorSlotPair feedback = CreateVectorSlotPair(
1642 CreateVectorSlotPair(FLAG_vector_stores && var->IsUnallocated() 1640 expr->NeedsProxySlot() ? expr->ProxySlot()
1643 ? expr->GetNthSlot(store_slot_index++) 1641 : FeedbackVectorICSlot::Invalid());
1644 : FeedbackVectorICSlot::Invalid());
1645 BuildVariableAssignment(var, literal, Token::INIT_CONST, feedback, 1642 BuildVariableAssignment(var, literal, Token::INIT_CONST, feedback,
1646 BailoutId::None(), states); 1643 BailoutId::None(), states);
1647 } 1644 }
1648 ast_context()->ProduceValue(literal); 1645 ast_context()->ProduceValue(literal);
1649 } 1646 }
1650 1647
1651 1648
1652 void AstGraphBuilder::VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) { 1649 void AstGraphBuilder::VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) {
1653 UNREACHABLE(); 1650 UNREACHABLE();
1654 } 1651 }
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1713 Node* literal = NewNode(op, literals_array, literal_index, constants); 1710 Node* literal = NewNode(op, literals_array, literal_index, constants);
1714 PrepareFrameState(literal, expr->CreateLiteralId(), 1711 PrepareFrameState(literal, expr->CreateLiteralId(),
1715 OutputFrameStateCombine::Push()); 1712 OutputFrameStateCombine::Push());
1716 1713
1717 // The object is expected on the operand stack during computation of the 1714 // The object is expected on the operand stack during computation of the
1718 // property values and is the value of the entire expression. 1715 // property values and is the value of the entire expression.
1719 environment()->Push(literal); 1716 environment()->Push(literal);
1720 1717
1721 // Create nodes to store computed values into the literal. 1718 // Create nodes to store computed values into the literal.
1722 int property_index = 0; 1719 int property_index = 0;
1723 int store_slot_index = 0;
1724 AccessorTable accessor_table(zone()); 1720 AccessorTable accessor_table(zone());
1725 for (; property_index < expr->properties()->length(); property_index++) { 1721 for (; property_index < expr->properties()->length(); property_index++) {
1726 ObjectLiteral::Property* property = expr->properties()->at(property_index); 1722 ObjectLiteral::Property* property = expr->properties()->at(property_index);
1727 if (property->is_computed_name()) break; 1723 if (property->is_computed_name()) break;
1728 if (property->IsCompileTimeValue()) continue; 1724 if (property->IsCompileTimeValue()) continue;
1729 1725
1730 Literal* key = property->key()->AsLiteral(); 1726 Literal* key = property->key()->AsLiteral();
1731 switch (property->kind()) { 1727 switch (property->kind()) {
1732 case ObjectLiteral::Property::CONSTANT: 1728 case ObjectLiteral::Property::CONSTANT:
1733 UNREACHABLE(); 1729 UNREACHABLE();
1734 case ObjectLiteral::Property::MATERIALIZED_LITERAL: 1730 case ObjectLiteral::Property::MATERIALIZED_LITERAL:
1735 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value())); 1731 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value()));
1736 // Fall through. 1732 // Fall through.
1737 case ObjectLiteral::Property::COMPUTED: { 1733 case ObjectLiteral::Property::COMPUTED: {
1738 // It is safe to use [[Put]] here because the boilerplate already 1734 // It is safe to use [[Put]] here because the boilerplate already
1739 // contains computed properties with an uninitialized value. 1735 // contains computed properties with an uninitialized value.
1740 if (key->value()->IsInternalizedString()) { 1736 if (key->value()->IsInternalizedString()) {
1741 if (property->emit_store()) { 1737 if (property->emit_store()) {
1742 VisitForValue(property->value()); 1738 VisitForValue(property->value());
1743 FrameStateBeforeAndAfter states(this, property->value()->id()); 1739 FrameStateBeforeAndAfter states(this, property->value()->id());
1744 Node* value = environment()->Pop(); 1740 Node* value = environment()->Pop();
1745 Handle<Name> name = key->AsPropertyName(); 1741 Handle<Name> name = key->AsPropertyName();
1746 VectorSlotPair feedback = 1742 VectorSlotPair feedback =
1747 FLAG_vector_stores 1743 CreateVectorSlotPair(property->GetSlot(0));
1748 ? CreateVectorSlotPair(expr->GetNthSlot(store_slot_index++))
1749 : VectorSlotPair();
1750 Node* store = BuildNamedStore(literal, name, value, feedback, 1744 Node* store = BuildNamedStore(literal, name, value, feedback,
1751 TypeFeedbackId::None()); 1745 TypeFeedbackId::None());
1752 states.AddToNode(store, key->id(), 1746 states.AddToNode(store, key->id(),
1753 OutputFrameStateCombine::Ignore()); 1747 OutputFrameStateCombine::Ignore());
1754 VectorSlotPair home_feedback = CreateVectorSlotPair( 1748 BuildSetHomeObject(value, literal, property, 1);
1755 expr->SlotForHomeObject(property->value(), &store_slot_index));
1756 BuildSetHomeObject(value, literal, property->value(),
1757 home_feedback);
1758 } else { 1749 } else {
1759 VisitForEffect(property->value()); 1750 VisitForEffect(property->value());
1760 } 1751 }
1761 break; 1752 break;
1762 } 1753 }
1763 environment()->Push(literal); // Duplicate receiver. 1754 environment()->Push(literal); // Duplicate receiver.
1764 VisitForValue(property->key()); 1755 VisitForValue(property->key());
1765 VisitForValue(property->value()); 1756 VisitForValue(property->value());
1766 Node* value = environment()->Pop(); 1757 Node* value = environment()->Pop();
1767 Node* key = environment()->Pop(); 1758 Node* key = environment()->Pop();
1768 Node* receiver = environment()->Pop(); 1759 Node* receiver = environment()->Pop();
1769 if (property->emit_store()) { 1760 if (property->emit_store()) {
1770 Node* language = jsgraph()->Constant(SLOPPY); 1761 Node* language = jsgraph()->Constant(SLOPPY);
1771 const Operator* op = 1762 const Operator* op =
1772 javascript()->CallRuntime(Runtime::kSetProperty, 4); 1763 javascript()->CallRuntime(Runtime::kSetProperty, 4);
1773 Node* set_property = NewNode(op, receiver, key, value, language); 1764 Node* set_property = NewNode(op, receiver, key, value, language);
1774 // SetProperty should not lazy deopt on an object literal. 1765 // SetProperty should not lazy deopt on an object literal.
1775 PrepareFrameState(set_property, BailoutId::None()); 1766 PrepareFrameState(set_property, BailoutId::None());
1776 VectorSlotPair home_feedback = CreateVectorSlotPair( 1767 BuildSetHomeObject(value, receiver, property);
1777 expr->SlotForHomeObject(property->value(), &store_slot_index));
1778 BuildSetHomeObject(value, receiver, property->value(), home_feedback);
1779 } 1768 }
1780 break; 1769 break;
1781 } 1770 }
1782 case ObjectLiteral::Property::PROTOTYPE: { 1771 case ObjectLiteral::Property::PROTOTYPE: {
1783 environment()->Push(literal); // Duplicate receiver. 1772 environment()->Push(literal); // Duplicate receiver.
1784 VisitForValue(property->value()); 1773 VisitForValue(property->value());
1785 Node* value = environment()->Pop(); 1774 Node* value = environment()->Pop();
1786 Node* receiver = environment()->Pop(); 1775 Node* receiver = environment()->Pop();
1787 DCHECK(property->emit_store()); 1776 DCHECK(property->emit_store());
1788 const Operator* op = 1777 const Operator* op =
1789 javascript()->CallRuntime(Runtime::kInternalSetPrototype, 2); 1778 javascript()->CallRuntime(Runtime::kInternalSetPrototype, 2);
1790 Node* set_prototype = NewNode(op, receiver, value); 1779 Node* set_prototype = NewNode(op, receiver, value);
1791 // SetPrototype should not lazy deopt on an object literal. 1780 // SetPrototype should not lazy deopt on an object literal.
1792 PrepareFrameState(set_prototype, BailoutId::None()); 1781 PrepareFrameState(set_prototype, BailoutId::None());
1793 break; 1782 break;
1794 } 1783 }
1795 case ObjectLiteral::Property::GETTER: 1784 case ObjectLiteral::Property::GETTER:
1796 if (property->emit_store()) { 1785 if (property->emit_store()) {
1797 accessor_table.lookup(key)->second->getter = property->value(); 1786 accessor_table.lookup(key)->second->getter = property;
1798 } 1787 }
1799 break; 1788 break;
1800 case ObjectLiteral::Property::SETTER: 1789 case ObjectLiteral::Property::SETTER:
1801 if (property->emit_store()) { 1790 if (property->emit_store()) {
1802 accessor_table.lookup(key)->second->setter = property->value(); 1791 accessor_table.lookup(key)->second->setter = property;
1803 } 1792 }
1804 break; 1793 break;
1805 } 1794 }
1806 } 1795 }
1807 1796
1808 // Create nodes to define accessors, using only a single call to the runtime 1797 // Create nodes to define accessors, using only a single call to the runtime
1809 // for each pair of corresponding getters and setters. 1798 // for each pair of corresponding getters and setters.
1810 for (AccessorTable::Iterator it = accessor_table.begin(); 1799 for (AccessorTable::Iterator it = accessor_table.begin();
1811 it != accessor_table.end(); ++it) { 1800 it != accessor_table.end(); ++it) {
1812 VisitForValue(it->first); 1801 VisitForValue(it->first);
1813 VisitForValueOrNull(it->second->getter); 1802 VisitObjectLiteralAccessor(literal, it->second->getter);
1814 VectorSlotPair feedback_getter = CreateVectorSlotPair( 1803 VisitObjectLiteralAccessor(literal, it->second->setter);
1815 expr->SlotForHomeObject(it->second->getter, &store_slot_index));
1816 BuildSetHomeObject(environment()->Top(), literal, it->second->getter,
1817 feedback_getter);
1818 VisitForValueOrNull(it->second->setter);
1819 VectorSlotPair feedback_setter = CreateVectorSlotPair(
1820 expr->SlotForHomeObject(it->second->setter, &store_slot_index));
1821 BuildSetHomeObject(environment()->Top(), literal, it->second->setter,
1822 feedback_setter);
1823 Node* setter = environment()->Pop(); 1804 Node* setter = environment()->Pop();
1824 Node* getter = environment()->Pop(); 1805 Node* getter = environment()->Pop();
1825 Node* name = environment()->Pop(); 1806 Node* name = environment()->Pop();
1826 Node* attr = jsgraph()->Constant(NONE); 1807 Node* attr = jsgraph()->Constant(NONE);
1827 const Operator* op = 1808 const Operator* op =
1828 javascript()->CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); 1809 javascript()->CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5);
1829 Node* call = NewNode(op, literal, name, getter, setter, attr); 1810 Node* call = NewNode(op, literal, name, getter, setter, attr);
1830 // This should not lazy deopt on a new literal. 1811 // This should not lazy deopt on a new literal.
1831 PrepareFrameState(call, BailoutId::None()); 1812 PrepareFrameState(call, BailoutId::None());
1832 } 1813 }
(...skipping 24 matching lines...) Expand all
1857 1838
1858 environment()->Push(literal); // Duplicate receiver. 1839 environment()->Push(literal); // Duplicate receiver.
1859 VisitForValue(property->key()); 1840 VisitForValue(property->key());
1860 Node* name = BuildToName(environment()->Pop(), 1841 Node* name = BuildToName(environment()->Pop(),
1861 expr->GetIdForProperty(property_index)); 1842 expr->GetIdForProperty(property_index));
1862 environment()->Push(name); 1843 environment()->Push(name);
1863 VisitForValue(property->value()); 1844 VisitForValue(property->value());
1864 Node* value = environment()->Pop(); 1845 Node* value = environment()->Pop();
1865 Node* key = environment()->Pop(); 1846 Node* key = environment()->Pop();
1866 Node* receiver = environment()->Pop(); 1847 Node* receiver = environment()->Pop();
1867 VectorSlotPair feedback = CreateVectorSlotPair( 1848 BuildSetHomeObject(value, receiver, property);
1868 expr->SlotForHomeObject(property->value(), &store_slot_index));
1869 BuildSetHomeObject(value, receiver, property->value(), feedback);
1870 switch (property->kind()) { 1849 switch (property->kind()) {
1871 case ObjectLiteral::Property::CONSTANT: 1850 case ObjectLiteral::Property::CONSTANT:
1872 case ObjectLiteral::Property::COMPUTED: 1851 case ObjectLiteral::Property::COMPUTED:
1873 case ObjectLiteral::Property::MATERIALIZED_LITERAL: { 1852 case ObjectLiteral::Property::MATERIALIZED_LITERAL: {
1874 Node* attr = jsgraph()->Constant(NONE); 1853 Node* attr = jsgraph()->Constant(NONE);
1875 const Operator* op = 1854 const Operator* op =
1876 javascript()->CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); 1855 javascript()->CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4);
1877 Node* call = NewNode(op, receiver, key, value, attr); 1856 Node* call = NewNode(op, receiver, key, value, attr);
1878 PrepareFrameState(call, BailoutId::None()); 1857 PrepareFrameState(call, BailoutId::None());
1879 break; 1858 break;
(...skipping 20 matching lines...) Expand all
1900 } 1879 }
1901 } 1880 }
1902 1881
1903 // Transform literals that contain functions to fast properties. 1882 // Transform literals that contain functions to fast properties.
1904 if (expr->has_function()) { 1883 if (expr->has_function()) {
1905 const Operator* op = 1884 const Operator* op =
1906 javascript()->CallRuntime(Runtime::kToFastProperties, 1); 1885 javascript()->CallRuntime(Runtime::kToFastProperties, 1);
1907 NewNode(op, literal); 1886 NewNode(op, literal);
1908 } 1887 }
1909 1888
1910 // Verify that compilation exactly consumed the number of store ic slots that 1889 ast_context()->ProduceValue(environment()->Pop());
1911 // the ObjectLiteral node had to offer. 1890 }
1912 DCHECK(!FLAG_vector_stores || store_slot_index == expr->slot_count());
1913 1891
1914 ast_context()->ProduceValue(environment()->Pop()); 1892
1893 void AstGraphBuilder::VisitObjectLiteralAccessor(
1894 Node* home_object, ObjectLiteralProperty* property) {
1895 if (property == nullptr) {
1896 VisitForValueOrNull(nullptr);
1897 } else {
1898 VisitForValue(property->value());
1899 BuildSetHomeObject(environment()->Top(), home_object, property);
1900 }
1915 } 1901 }
1916 1902
1917 1903
1918 void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { 1904 void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
1919 Node* closure = GetFunctionClosure(); 1905 Node* closure = GetFunctionClosure();
1920 1906
1921 // Create node to deep-copy the literal boilerplate. 1907 // Create node to deep-copy the literal boilerplate.
1922 expr->BuildConstantElements(isolate()); 1908 expr->BuildConstantElements(isolate());
1923 Node* literals_array = 1909 Node* literals_array =
1924 BuildLoadObjectField(closure, JSFunction::kLiteralsOffset); 1910 BuildLoadObjectField(closure, JSFunction::kLiteralsOffset);
(...skipping 1876 matching lines...) Expand 10 before | Expand all | Expand 10 after
3801 3787
3802 3788
3803 Node* AstGraphBuilder::BuildToObject(Node* input, BailoutId bailout_id) { 3789 Node* AstGraphBuilder::BuildToObject(Node* input, BailoutId bailout_id) {
3804 Node* object = NewNode(javascript()->ToObject(), input); 3790 Node* object = NewNode(javascript()->ToObject(), input);
3805 PrepareFrameState(object, bailout_id, OutputFrameStateCombine::Push()); 3791 PrepareFrameState(object, bailout_id, OutputFrameStateCombine::Push());
3806 return object; 3792 return object;
3807 } 3793 }
3808 3794
3809 3795
3810 Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object, 3796 Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object,
3811 Expression* expr, 3797 ObjectLiteralProperty* property,
3812 const VectorSlotPair& feedback) { 3798 int slot_number) {
3799 Expression* expr = property->value();
3813 if (!FunctionLiteral::NeedsHomeObject(expr)) return value; 3800 if (!FunctionLiteral::NeedsHomeObject(expr)) return value;
3814 Handle<Name> name = isolate()->factory()->home_object_symbol(); 3801 Handle<Name> name = isolate()->factory()->home_object_symbol();
3815 FrameStateBeforeAndAfter states(this, BailoutId::None()); 3802 FrameStateBeforeAndAfter states(this, BailoutId::None());
3803 VectorSlotPair feedback =
3804 CreateVectorSlotPair(property->GetSlot(slot_number));
3816 Node* store = BuildNamedStore(value, name, home_object, feedback, 3805 Node* store = BuildNamedStore(value, name, home_object, feedback,
3817 TypeFeedbackId::None()); 3806 TypeFeedbackId::None());
3818 states.AddToNode(store, BailoutId::None(), OutputFrameStateCombine::Ignore()); 3807 states.AddToNode(store, BailoutId::None(), OutputFrameStateCombine::Ignore());
3819 return store; 3808 return store;
3820 } 3809 }
3821 3810
3822 3811
3823 Node* AstGraphBuilder::BuildThrowError(Node* exception, BailoutId bailout_id) { 3812 Node* AstGraphBuilder::BuildThrowError(Node* exception, BailoutId bailout_id) {
3824 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); 3813 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1);
3825 Node* call = NewNode(op, exception); 3814 Node* call = NewNode(op, exception);
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
4261 // Phi does not exist yet, introduce one. 4250 // Phi does not exist yet, introduce one.
4262 value = NewPhi(inputs, value, control); 4251 value = NewPhi(inputs, value, control);
4263 value->ReplaceInput(inputs - 1, other); 4252 value->ReplaceInput(inputs - 1, other);
4264 } 4253 }
4265 return value; 4254 return value;
4266 } 4255 }
4267 4256
4268 } // namespace compiler 4257 } // namespace compiler
4269 } // namespace internal 4258 } // namespace internal
4270 } // namespace v8 4259 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/ast-graph-builder.h ('k') | src/full-codegen/arm/full-codegen-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698