Chromium Code Reviews| Index: src/compiler/ast-graph-builder.cc |
| diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc |
| index 49a3abd7d3d8e3e5e177c87ac63e4e2851d368ff..8c5fa4594009bc268d25a9f4b11cd289bcdd0b60 100644 |
| --- a/src/compiler/ast-graph-builder.cc |
| +++ b/src/compiler/ast-graph-builder.cc |
| @@ -1345,6 +1345,8 @@ void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) { |
| Node* value = environment()->Pop(); |
| Node* key = environment()->Pop(); |
| Node* receiver = environment()->Pop(); |
| + BuildSetHomeObject(value, receiver, property->value()); |
| + |
| switch (property->kind()) { |
| case ObjectLiteral::Property::CONSTANT: |
| case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
| @@ -1371,8 +1373,6 @@ void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) { |
| break; |
| } |
| } |
| - |
| - AddHomeObjectIfNeeded(property->value(), value, receiver); |
| } |
| // Transform both the class literal and the prototype to fast properties. |
| @@ -1392,17 +1392,6 @@ void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) { |
| } |
| -void AstGraphBuilder::AddHomeObjectIfNeeded(Expression* expr, Node* function, |
| - Node* home_object) { |
| - if (FunctionLiteral::NeedsHomeObject(expr)) { |
| - Unique<Name> name = MakeUnique(isolate()->factory()->home_object_symbol()); |
| - Node* store = NewNode(javascript()->StoreNamed(language_mode(), name), |
| - function, home_object); |
| - PrepareFrameState(store, BailoutId::None()); |
| - } |
| -} |
| - |
| - |
| void AstGraphBuilder::VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) { |
| UNREACHABLE(); |
| } |
| @@ -1504,8 +1493,7 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
| NewNode(javascript()->StoreNamed(language_mode(), name), |
| literal, value); |
| PrepareFrameState(store, key->id()); |
| - |
| - AddHomeObjectIfNeeded(property->value(), value, literal); |
| + BuildSetHomeObject(value, literal, property->value()); |
| } else { |
| VisitForEffect(property->value()); |
| } |
| @@ -1522,8 +1510,7 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
| const Operator* op = |
| javascript()->CallRuntime(Runtime::kSetProperty, 4); |
| NewNode(op, receiver, key, value, language); |
| - |
| - AddHomeObjectIfNeeded(property->value(), value, receiver); |
| + BuildSetHomeObject(value, receiver, property->value()); |
| } |
| break; |
| } |
| @@ -1559,12 +1546,12 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
| it != accessor_table.end(); ++it) { |
| VisitForValue(it->first); |
| VisitForValueOrNull(it->second->getter); |
| + BuildSetHomeObject(environment()->Top(), literal, it->second->getter); |
| VisitForValueOrNull(it->second->setter); |
| + BuildSetHomeObject(environment()->Top(), literal, it->second->setter); |
| Node* setter = environment()->Pop(); |
| Node* getter = environment()->Pop(); |
| Node* name = environment()->Pop(); |
| - AddHomeObjectIfNeeded(it->second->getter, getter, literal); |
| - AddHomeObjectIfNeeded(it->second->setter, setter, literal); |
| Node* attr = jsgraph()->Constant(NONE); |
| const Operator* op = |
| javascript()->CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); |
| @@ -1596,8 +1583,7 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
| Node* value = environment()->Pop(); |
| Node* key = environment()->Pop(); |
| Node* receiver = environment()->Pop(); |
| - |
| - AddHomeObjectIfNeeded(property->value(), value, receiver); |
| + BuildSetHomeObject(value, receiver, property->value()); |
| switch (property->kind()) { |
| case ObjectLiteral::Property::CONSTANT: |
| @@ -2814,6 +2800,17 @@ Node* AstGraphBuilder::BuildToName(Node* input, BailoutId bailout_id) { |
| } |
| +Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object, |
| + Expression* expr) { |
| + if (!FunctionLiteral::NeedsHomeObject(expr)) return value; |
| + Unique<Name> name = MakeUnique(isolate()->factory()->home_object_symbol()); |
| + const Operator* op = javascript()->StoreNamed(language_mode(), name); |
| + Node* store = NewNode(op, value, home_object); |
| + PrepareFrameState(store, BailoutId::None()); |
| + return store; |
|
arv (Not doing code reviews)
2015/02/16 20:09:56
What is the return value used for here?
Michael Starzinger
2015/02/16 20:30:35
It's not used, but for symmetry all builder method
|
| +} |
| + |
| + |
| Node* AstGraphBuilder::BuildThrowReferenceError(Variable* variable, |
| BailoutId bailout_id) { |
| // TODO(mstarzinger): Should be unified with the VisitThrow implementation. |