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. |