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