| 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/ast/compile-time-value.h" |     7 #include "src/ast/compile-time-value.h" | 
|     8 #include "src/ast/scopes.h" |     8 #include "src/ast/scopes.h" | 
|     9 #include "src/compilation-info.h" |     9 #include "src/compilation-info.h" | 
|    10 #include "src/compiler.h" |    10 #include "src/compiler.h" | 
| (...skipping 1584 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1595   PrepareEagerCheckpoint(expr->CreateLiteralId()); |  1595   PrepareEagerCheckpoint(expr->CreateLiteralId()); | 
|  1596   Handle<Name> name = isolate()->factory()->prototype_string(); |  1596   Handle<Name> name = isolate()->factory()->prototype_string(); | 
|  1597   VectorSlotPair pair = CreateVectorSlotPair(expr->PrototypeSlot()); |  1597   VectorSlotPair pair = CreateVectorSlotPair(expr->PrototypeSlot()); | 
|  1598   Node* prototype = BuildNamedLoad(literal, name, pair); |  1598   Node* prototype = BuildNamedLoad(literal, name, pair); | 
|  1599   PrepareFrameState(prototype, expr->PrototypeId(), |  1599   PrepareFrameState(prototype, expr->PrototypeId(), | 
|  1600                     OutputFrameStateCombine::Push()); |  1600                     OutputFrameStateCombine::Push()); | 
|  1601   environment()->Push(prototype); |  1601   environment()->Push(prototype); | 
|  1602  |  1602  | 
|  1603   // Create nodes to store method values into the literal. |  1603   // Create nodes to store method values into the literal. | 
|  1604   for (int i = 0; i < expr->properties()->length(); i++) { |  1604   for (int i = 0; i < expr->properties()->length(); i++) { | 
|  1605     ObjectLiteral::Property* property = expr->properties()->at(i); |  1605     ClassLiteral::Property* property = expr->properties()->at(i); | 
|  1606     environment()->Push(environment()->Peek(property->is_static() ? 1 : 0)); |  1606     environment()->Push(environment()->Peek(property->is_static() ? 1 : 0)); | 
|  1607  |  1607  | 
|  1608     VisitForValue(property->key()); |  1608     VisitForValue(property->key()); | 
|  1609     Node* name = BuildToName(environment()->Pop(), expr->GetIdForProperty(i)); |  1609     Node* name = BuildToName(environment()->Pop(), expr->GetIdForProperty(i)); | 
|  1610     environment()->Push(name); |  1610     environment()->Push(name); | 
|  1611  |  1611  | 
|  1612     // The static prototype property is read only. We handle the non computed |  1612     // The static prototype property is read only. We handle the non computed | 
|  1613     // property name case in the parser. Since this is the only case where we |  1613     // property name case in the parser. Since this is the only case where we | 
|  1614     // need to check for an own read only property we special case this so we do |  1614     // need to check for an own read only property we special case this so we do | 
|  1615     // not need to do this for every property. |  1615     // not need to do this for every property. | 
|  1616     if (property->is_static() && property->is_computed_name()) { |  1616     if (property->is_static() && property->is_computed_name()) { | 
|  1617       Node* check = BuildThrowIfStaticPrototype(environment()->Pop(), |  1617       Node* check = BuildThrowIfStaticPrototype(environment()->Pop(), | 
|  1618                                                 expr->GetIdForProperty(i)); |  1618                                                 expr->GetIdForProperty(i)); | 
|  1619       environment()->Push(check); |  1619       environment()->Push(check); | 
|  1620     } |  1620     } | 
|  1621  |  1621  | 
|  1622     VisitForValue(property->value()); |  1622     VisitForValue(property->value()); | 
|  1623     Node* value = environment()->Pop(); |  1623     Node* value = environment()->Pop(); | 
|  1624     Node* key = environment()->Pop(); |  1624     Node* key = environment()->Pop(); | 
|  1625     Node* receiver = environment()->Pop(); |  1625     Node* receiver = environment()->Pop(); | 
|  1626  |  1626  | 
|  1627     BuildSetHomeObject(value, receiver, property); |  1627     BuildSetHomeObject(value, receiver, property); | 
|  1628  |  1628  | 
|  1629     switch (property->kind()) { |  1629     switch (property->kind()) { | 
|  1630       case ObjectLiteral::Property::CONSTANT: |  1630       case ClassLiteral::Property::METHOD: { | 
|  1631       case ObjectLiteral::Property::MATERIALIZED_LITERAL: |  | 
|  1632       case ObjectLiteral::Property::PROTOTYPE: |  | 
|  1633         UNREACHABLE(); |  | 
|  1634       case ObjectLiteral::Property::COMPUTED: { |  | 
|  1635         Node* attr = jsgraph()->Constant(DONT_ENUM); |  1631         Node* attr = jsgraph()->Constant(DONT_ENUM); | 
|  1636         Node* set_function_name = |  1632         Node* set_function_name = | 
|  1637             jsgraph()->Constant(property->NeedsSetFunctionName()); |  1633             jsgraph()->Constant(property->NeedsSetFunctionName()); | 
|  1638         const Operator* op = |  1634         const Operator* op = | 
|  1639             javascript()->CallRuntime(Runtime::kDefineDataPropertyInLiteral); |  1635             javascript()->CallRuntime(Runtime::kDefineDataPropertyInLiteral); | 
|  1640         Node* call = NewNode(op, receiver, key, value, attr, set_function_name); |  1636         Node* call = NewNode(op, receiver, key, value, attr, set_function_name); | 
|  1641         PrepareFrameState(call, BailoutId::None()); |  1637         PrepareFrameState(call, BailoutId::None()); | 
|  1642         break; |  1638         break; | 
|  1643       } |  1639       } | 
|  1644       case ObjectLiteral::Property::GETTER: { |  1640       case ClassLiteral::Property::GETTER: { | 
|  1645         Node* attr = jsgraph()->Constant(DONT_ENUM); |  1641         Node* attr = jsgraph()->Constant(DONT_ENUM); | 
|  1646         const Operator* op = javascript()->CallRuntime( |  1642         const Operator* op = javascript()->CallRuntime( | 
|  1647             Runtime::kDefineGetterPropertyUnchecked, 4); |  1643             Runtime::kDefineGetterPropertyUnchecked, 4); | 
|  1648         NewNode(op, receiver, key, value, attr); |  1644         NewNode(op, receiver, key, value, attr); | 
|  1649         break; |  1645         break; | 
|  1650       } |  1646       } | 
|  1651       case ObjectLiteral::Property::SETTER: { |  1647       case ClassLiteral::Property::SETTER: { | 
|  1652         Node* attr = jsgraph()->Constant(DONT_ENUM); |  1648         Node* attr = jsgraph()->Constant(DONT_ENUM); | 
|  1653         const Operator* op = javascript()->CallRuntime( |  1649         const Operator* op = javascript()->CallRuntime( | 
|  1654             Runtime::kDefineSetterPropertyUnchecked, 4); |  1650             Runtime::kDefineSetterPropertyUnchecked, 4); | 
|  1655         NewNode(op, receiver, key, value, attr); |  1651         NewNode(op, receiver, key, value, attr); | 
|  1656         break; |  1652         break; | 
|  1657       } |  1653       } | 
|  1658     } |  1654     } | 
|  1659   } |  1655   } | 
|  1660  |  1656  | 
|  1661   // Set the constructor to have fast properties. |  1657   // Set the constructor to have fast properties. | 
| (...skipping 2028 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3690   return name; |  3686   return name; | 
|  3691 } |  3687 } | 
|  3692  |  3688  | 
|  3693  |  3689  | 
|  3694 Node* AstGraphBuilder::BuildToObject(Node* input, BailoutId bailout_id) { |  3690 Node* AstGraphBuilder::BuildToObject(Node* input, BailoutId bailout_id) { | 
|  3695   Node* object = NewNode(javascript()->ToObject(), input); |  3691   Node* object = NewNode(javascript()->ToObject(), input); | 
|  3696   PrepareFrameState(object, bailout_id, OutputFrameStateCombine::Push()); |  3692   PrepareFrameState(object, bailout_id, OutputFrameStateCombine::Push()); | 
|  3697   return object; |  3693   return object; | 
|  3698 } |  3694 } | 
|  3699  |  3695  | 
|  3700  |  | 
|  3701 Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object, |  3696 Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object, | 
|  3702                                           ObjectLiteralProperty* property, |  3697                                           LiteralProperty* property, | 
|  3703                                           int slot_number) { |  3698                                           int slot_number) { | 
|  3704   Expression* expr = property->value(); |  3699   Expression* expr = property->value(); | 
|  3705   if (!FunctionLiteral::NeedsHomeObject(expr)) return value; |  3700   if (!FunctionLiteral::NeedsHomeObject(expr)) return value; | 
|  3706   Handle<Name> name = isolate()->factory()->home_object_symbol(); |  3701   Handle<Name> name = isolate()->factory()->home_object_symbol(); | 
|  3707   VectorSlotPair feedback = |  3702   VectorSlotPair feedback = | 
|  3708       CreateVectorSlotPair(property->GetSlot(slot_number)); |  3703       CreateVectorSlotPair(property->GetSlot(slot_number)); | 
|  3709   Node* store = BuildNamedStore(value, name, home_object, feedback); |  3704   Node* store = BuildNamedStore(value, name, home_object, feedback); | 
|  3710   PrepareFrameState(store, BailoutId::None(), |  3705   PrepareFrameState(store, BailoutId::None(), | 
|  3711                     OutputFrameStateCombine::Ignore()); |  3706                     OutputFrameStateCombine::Ignore()); | 
|  3712   return store; |  3707   return store; | 
| (...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4334     // Phi does not exist yet, introduce one. |  4329     // Phi does not exist yet, introduce one. | 
|  4335     value = NewPhi(inputs, value, control); |  4330     value = NewPhi(inputs, value, control); | 
|  4336     value->ReplaceInput(inputs - 1, other); |  4331     value->ReplaceInput(inputs - 1, other); | 
|  4337   } |  4332   } | 
|  4338   return value; |  4333   return value; | 
|  4339 } |  4334 } | 
|  4340  |  4335  | 
|  4341 }  // namespace compiler |  4336 }  // namespace compiler | 
|  4342 }  // namespace internal |  4337 }  // namespace internal | 
|  4343 }  // namespace v8 |  4338 }  // namespace v8 | 
| OLD | NEW |