| Index: src/compiler/ast-graph-builder.cc
|
| diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
|
| index 7b9e3662afaaf3ce5c2286995e28482e3aa1cfbf..52d4a470f6f52955c6c916b3b973017e17a5b05b 100644
|
| --- a/src/compiler/ast-graph-builder.cc
|
| +++ b/src/compiler/ast-graph-builder.cc
|
| @@ -1570,7 +1570,6 @@ void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) {
|
| environment()->Push(proto);
|
|
|
| // Create nodes to store method values into the literal.
|
| - int store_slot_index = 0;
|
| for (int i = 0; i < expr->properties()->length(); i++) {
|
| ObjectLiteral::Property* property = expr->properties()->at(i);
|
| environment()->Push(property->is_static() ? literal : proto);
|
| @@ -1593,9 +1592,8 @@ void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) {
|
| Node* value = environment()->Pop();
|
| Node* key = environment()->Pop();
|
| Node* receiver = environment()->Pop();
|
| - VectorSlotPair feedback = CreateVectorSlotPair(
|
| - expr->SlotForHomeObject(property->value(), &store_slot_index));
|
| - BuildSetHomeObject(value, receiver, property->value(), feedback);
|
| +
|
| + BuildSetHomeObject(value, receiver, property);
|
|
|
| switch (property->kind()) {
|
| case ObjectLiteral::Property::CONSTANT:
|
| @@ -1638,10 +1636,9 @@ void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) {
|
| DCHECK_NOT_NULL(expr->class_variable_proxy());
|
| Variable* var = expr->class_variable_proxy()->var();
|
| FrameStateBeforeAndAfter states(this, BailoutId::None());
|
| - VectorSlotPair feedback =
|
| - CreateVectorSlotPair(FLAG_vector_stores && var->IsUnallocated()
|
| - ? expr->GetNthSlot(store_slot_index++)
|
| - : FeedbackVectorICSlot::Invalid());
|
| + VectorSlotPair feedback = CreateVectorSlotPair(
|
| + expr->NeedsProxySlot() ? expr->ProxySlot()
|
| + : FeedbackVectorICSlot::Invalid());
|
| BuildVariableAssignment(var, literal, Token::INIT_CONST, feedback,
|
| BailoutId::None(), states);
|
| }
|
| @@ -1720,7 +1717,6 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
|
|
|
| // Create nodes to store computed values into the literal.
|
| int property_index = 0;
|
| - int store_slot_index = 0;
|
| AccessorTable accessor_table(zone());
|
| for (; property_index < expr->properties()->length(); property_index++) {
|
| ObjectLiteral::Property* property = expr->properties()->at(property_index);
|
| @@ -1744,17 +1740,12 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
|
| Node* value = environment()->Pop();
|
| Handle<Name> name = key->AsPropertyName();
|
| VectorSlotPair feedback =
|
| - FLAG_vector_stores
|
| - ? CreateVectorSlotPair(expr->GetNthSlot(store_slot_index++))
|
| - : VectorSlotPair();
|
| + CreateVectorSlotPair(property->GetSlot(0));
|
| Node* store = BuildNamedStore(literal, name, value, feedback,
|
| TypeFeedbackId::None());
|
| states.AddToNode(store, key->id(),
|
| OutputFrameStateCombine::Ignore());
|
| - VectorSlotPair home_feedback = CreateVectorSlotPair(
|
| - expr->SlotForHomeObject(property->value(), &store_slot_index));
|
| - BuildSetHomeObject(value, literal, property->value(),
|
| - home_feedback);
|
| + BuildSetHomeObject(value, literal, property, 1);
|
| } else {
|
| VisitForEffect(property->value());
|
| }
|
| @@ -1773,9 +1764,7 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
|
| Node* set_property = NewNode(op, receiver, key, value, language);
|
| // SetProperty should not lazy deopt on an object literal.
|
| PrepareFrameState(set_property, BailoutId::None());
|
| - VectorSlotPair home_feedback = CreateVectorSlotPair(
|
| - expr->SlotForHomeObject(property->value(), &store_slot_index));
|
| - BuildSetHomeObject(value, receiver, property->value(), home_feedback);
|
| + BuildSetHomeObject(value, receiver, property);
|
| }
|
| break;
|
| }
|
| @@ -1794,12 +1783,12 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
|
| }
|
| case ObjectLiteral::Property::GETTER:
|
| if (property->emit_store()) {
|
| - accessor_table.lookup(key)->second->getter = property->value();
|
| + accessor_table.lookup(key)->second->getter = property;
|
| }
|
| break;
|
| case ObjectLiteral::Property::SETTER:
|
| if (property->emit_store()) {
|
| - accessor_table.lookup(key)->second->setter = property->value();
|
| + accessor_table.lookup(key)->second->setter = property;
|
| }
|
| break;
|
| }
|
| @@ -1810,16 +1799,8 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
|
| for (AccessorTable::Iterator it = accessor_table.begin();
|
| it != accessor_table.end(); ++it) {
|
| VisitForValue(it->first);
|
| - VisitForValueOrNull(it->second->getter);
|
| - VectorSlotPair feedback_getter = CreateVectorSlotPair(
|
| - expr->SlotForHomeObject(it->second->getter, &store_slot_index));
|
| - BuildSetHomeObject(environment()->Top(), literal, it->second->getter,
|
| - feedback_getter);
|
| - VisitForValueOrNull(it->second->setter);
|
| - VectorSlotPair feedback_setter = CreateVectorSlotPair(
|
| - expr->SlotForHomeObject(it->second->setter, &store_slot_index));
|
| - BuildSetHomeObject(environment()->Top(), literal, it->second->setter,
|
| - feedback_setter);
|
| + VisitObjectLiteralAccessor(literal, it->second->getter);
|
| + VisitObjectLiteralAccessor(literal, it->second->setter);
|
| Node* setter = environment()->Pop();
|
| Node* getter = environment()->Pop();
|
| Node* name = environment()->Pop();
|
| @@ -1864,9 +1845,7 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
|
| Node* value = environment()->Pop();
|
| Node* key = environment()->Pop();
|
| Node* receiver = environment()->Pop();
|
| - VectorSlotPair feedback = CreateVectorSlotPair(
|
| - expr->SlotForHomeObject(property->value(), &store_slot_index));
|
| - BuildSetHomeObject(value, receiver, property->value(), feedback);
|
| + BuildSetHomeObject(value, receiver, property);
|
| switch (property->kind()) {
|
| case ObjectLiteral::Property::CONSTANT:
|
| case ObjectLiteral::Property::COMPUTED:
|
| @@ -1907,14 +1886,21 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
|
| NewNode(op, literal);
|
| }
|
|
|
| - // Verify that compilation exactly consumed the number of store ic slots that
|
| - // the ObjectLiteral node had to offer.
|
| - DCHECK(!FLAG_vector_stores || store_slot_index == expr->slot_count());
|
| -
|
| ast_context()->ProduceValue(environment()->Pop());
|
| }
|
|
|
|
|
| +void AstGraphBuilder::VisitObjectLiteralAccessor(
|
| + Node* home_object, ObjectLiteralProperty* property) {
|
| + if (property == nullptr) {
|
| + VisitForValueOrNull(nullptr);
|
| + } else {
|
| + VisitForValue(property->value());
|
| + BuildSetHomeObject(environment()->Top(), home_object, property);
|
| + }
|
| +}
|
| +
|
| +
|
| void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
|
| Node* closure = GetFunctionClosure();
|
|
|
| @@ -3808,11 +3794,14 @@ Node* AstGraphBuilder::BuildToObject(Node* input, BailoutId bailout_id) {
|
|
|
|
|
| Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object,
|
| - Expression* expr,
|
| - const VectorSlotPair& feedback) {
|
| + ObjectLiteralProperty* property,
|
| + int slot_number) {
|
| + Expression* expr = property->value();
|
| if (!FunctionLiteral::NeedsHomeObject(expr)) return value;
|
| Handle<Name> name = isolate()->factory()->home_object_symbol();
|
| FrameStateBeforeAndAfter states(this, BailoutId::None());
|
| + VectorSlotPair feedback =
|
| + CreateVectorSlotPair(property->GetSlot(slot_number));
|
| Node* store = BuildNamedStore(value, name, home_object, feedback,
|
| TypeFeedbackId::None());
|
| states.AddToNode(store, BailoutId::None(), OutputFrameStateCombine::Ignore());
|
|
|