| Index: src/compiler/ast-graph-builder.cc
|
| diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
|
| index e843a2dafb3b6018c26d92a68d76d9c91553fc91..9ba7236e4200b3bd7f9074140dda6066064c35b4 100644
|
| --- a/src/compiler/ast-graph-builder.cc
|
| +++ b/src/compiler/ast-graph-builder.cc
|
| @@ -1556,10 +1556,8 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
|
| if (property->emit_store()) {
|
| VisitForValue(property->value());
|
| Node* value = environment()->Pop();
|
| - Unique<Name> name = MakeUnique(key->AsPropertyName());
|
| - Node* store =
|
| - NewNode(javascript()->StoreNamed(language_mode(), name),
|
| - literal, value);
|
| + Handle<Name> name = key->AsPropertyName();
|
| + Node* store = BuildNamedStore(literal, name, value);
|
| PrepareFrameState(store, key->id());
|
| BuildSetHomeObject(value, literal, property->value());
|
| } else {
|
| @@ -1731,8 +1729,7 @@ void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
|
| VisitForValue(subexpr);
|
| Node* value = environment()->Pop();
|
| Node* index = jsgraph()->Constant(i);
|
| - Node* store = NewNode(javascript()->StoreProperty(language_mode()), literal,
|
| - index, value);
|
| + Node* store = BuildKeyedStore(literal, index, value);
|
| PrepareFrameState(store, expr->GetIdForElement(i));
|
| }
|
|
|
| @@ -1761,10 +1758,8 @@ void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value,
|
| VisitForValue(property->obj());
|
| Node* object = environment()->Pop();
|
| value = environment()->Pop();
|
| - Unique<Name> name =
|
| - MakeUnique(property->key()->AsLiteral()->AsPropertyName());
|
| - Node* store = NewNode(javascript()->StoreNamed(language_mode(), name),
|
| - object, value);
|
| + Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| + Node* store = BuildNamedStore(object, name, value);
|
| PrepareFrameState(store, bailout_id);
|
| break;
|
| }
|
| @@ -1775,8 +1770,7 @@ void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value,
|
| Node* key = environment()->Pop();
|
| Node* object = environment()->Pop();
|
| value = environment()->Pop();
|
| - Node* store = NewNode(javascript()->StoreProperty(language_mode()),
|
| - object, key, value);
|
| + Node* store = BuildKeyedStore(object, key, value);
|
| PrepareFrameState(store, bailout_id);
|
| break;
|
| }
|
| @@ -1820,11 +1814,10 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| }
|
| case NAMED_PROPERTY: {
|
| Node* object = environment()->Top();
|
| - Unique<Name> name =
|
| - MakeUnique(property->key()->AsLiteral()->AsPropertyName());
|
| + Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| - old_value = NewNode(javascript()->LoadNamed(name, pair), object);
|
| + old_value = BuildNamedLoad(object, name, pair);
|
| PrepareFrameState(old_value, property->LoadId(),
|
| OutputFrameStateCombine::Push());
|
| break;
|
| @@ -1834,7 +1827,7 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| Node* object = environment()->Peek(1);
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| - old_value = NewNode(javascript()->LoadProperty(pair), object, key);
|
| + old_value = BuildKeyedLoad(object, key, pair);
|
| PrepareFrameState(old_value, property->LoadId(),
|
| OutputFrameStateCombine::Push());
|
| break;
|
| @@ -1865,18 +1858,15 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| }
|
| case NAMED_PROPERTY: {
|
| Node* object = environment()->Pop();
|
| - Unique<Name> name =
|
| - MakeUnique(property->key()->AsLiteral()->AsPropertyName());
|
| - Node* store = NewNode(javascript()->StoreNamed(language_mode(), name),
|
| - object, value);
|
| + Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| + Node* store = BuildNamedStore(object, name, value);
|
| PrepareFrameState(store, expr->id(), ast_context()->GetStateCombine());
|
| break;
|
| }
|
| case KEYED_PROPERTY: {
|
| Node* key = environment()->Pop();
|
| Node* object = environment()->Pop();
|
| - Node* store = NewNode(javascript()->StoreProperty(language_mode()),
|
| - object, key, value);
|
| + Node* store = BuildKeyedStore(object, key, value);
|
| PrepareFrameState(store, expr->id(), ast_context()->GetStateCombine());
|
| break;
|
| }
|
| @@ -1907,14 +1897,14 @@ void AstGraphBuilder::VisitProperty(Property* expr) {
|
| if (expr->key()->IsPropertyName()) {
|
| VisitForValue(expr->obj());
|
| Node* object = environment()->Pop();
|
| - Unique<Name> name = MakeUnique(expr->key()->AsLiteral()->AsPropertyName());
|
| - value = NewNode(javascript()->LoadNamed(name, pair), object);
|
| + Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName();
|
| + value = BuildNamedLoad(object, name, pair);
|
| } else {
|
| VisitForValue(expr->obj());
|
| VisitForValue(expr->key());
|
| Node* key = environment()->Pop();
|
| Node* object = environment()->Pop();
|
| - value = NewNode(javascript()->LoadProperty(pair), object, key);
|
| + value = BuildKeyedLoad(object, key, pair);
|
| }
|
| PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
|
| ast_context()->ProduceValue(value);
|
| @@ -1961,13 +1951,12 @@ void AstGraphBuilder::VisitCall(Call* expr) {
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| if (property->key()->IsPropertyName()) {
|
| - Unique<Name> name =
|
| - MakeUnique(property->key()->AsLiteral()->AsPropertyName());
|
| - callee_value = NewNode(javascript()->LoadNamed(name, pair), object);
|
| + Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| + callee_value = BuildNamedLoad(object, name, pair);
|
| } else {
|
| VisitForValue(property->key());
|
| Node* key = environment()->Pop();
|
| - callee_value = NewNode(javascript()->LoadProperty(pair), object, key);
|
| + callee_value = BuildKeyedLoad(object, key, pair);
|
| }
|
| PrepareFrameState(callee_value, property->LoadId(),
|
| OutputFrameStateCombine::Push());
|
| @@ -2062,10 +2051,8 @@ void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) {
|
| // before arguments are being evaluated.
|
| CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS;
|
| Node* receiver_value = BuildLoadBuiltinsObject();
|
| - Unique<String> unique = MakeUnique(name);
|
| VectorSlotPair pair = CreateVectorSlotPair(expr->CallRuntimeFeedbackSlot());
|
| - Node* callee_value =
|
| - NewNode(javascript()->LoadNamed(unique, pair), receiver_value);
|
| + Node* callee_value = BuildNamedLoad(receiver_value, name, pair);
|
| // TODO(jarin): Find/create a bailout id to deoptimize to (crankshaft
|
| // refuses to optimize functions with jsruntime calls).
|
| PrepareFrameState(callee_value, BailoutId::None(),
|
| @@ -2150,11 +2137,10 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
| case NAMED_PROPERTY: {
|
| VisitForValue(property->obj());
|
| Node* object = environment()->Top();
|
| - Unique<Name> name =
|
| - MakeUnique(property->key()->AsLiteral()->AsPropertyName());
|
| + Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| - old_value = NewNode(javascript()->LoadNamed(name, pair), object);
|
| + old_value = BuildNamedLoad(object, name, pair);
|
| PrepareFrameState(old_value, property->LoadId(),
|
| OutputFrameStateCombine::Push());
|
| stack_depth = 1;
|
| @@ -2167,7 +2153,7 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
| Node* object = environment()->Peek(1);
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| - old_value = NewNode(javascript()->LoadProperty(pair), object, key);
|
| + old_value = BuildKeyedLoad(object, key, pair);
|
| PrepareFrameState(old_value, property->LoadId(),
|
| OutputFrameStateCombine::Push());
|
| stack_depth = 2;
|
| @@ -2204,10 +2190,8 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
| }
|
| case NAMED_PROPERTY: {
|
| Node* object = environment()->Pop();
|
| - Unique<Name> name =
|
| - MakeUnique(property->key()->AsLiteral()->AsPropertyName());
|
| - Node* store = NewNode(javascript()->StoreNamed(language_mode(), name),
|
| - object, value);
|
| + Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| + Node* store = BuildNamedStore(object, name, value);
|
| environment()->Push(value);
|
| PrepareFrameState(store, expr->AssignmentId());
|
| environment()->Pop();
|
| @@ -2216,8 +2200,7 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
| case KEYED_PROPERTY: {
|
| Node* key = environment()->Pop();
|
| Node* object = environment()->Pop();
|
| - Node* store = NewNode(javascript()->StoreProperty(language_mode()),
|
| - object, key, value);
|
| + Node* store = BuildKeyedStore(object, key, value);
|
| environment()->Push(value);
|
| PrepareFrameState(store, expr->AssignmentId());
|
| environment()->Pop();
|
| @@ -2621,10 +2604,8 @@ Node* AstGraphBuilder::BuildVariableLoad(Variable* variable,
|
| case Variable::UNALLOCATED: {
|
| // Global var, const, or let variable.
|
| Node* global = BuildLoadGlobalObject();
|
| - Unique<Name> name = MakeUnique(variable->name());
|
| - const Operator* op =
|
| - javascript()->LoadNamed(name, feedback, contextual_mode);
|
| - Node* node = NewNode(op, global);
|
| + Handle<Name> name = variable->name();
|
| + Node* node = BuildNamedLoad(global, name, feedback, contextual_mode);
|
| PrepareFrameState(node, bailout_id, OutputFrameStateCombine::Push());
|
| return node;
|
| }
|
| @@ -2730,9 +2711,8 @@ Node* AstGraphBuilder::BuildVariableAssignment(
|
| case Variable::UNALLOCATED: {
|
| // Global var, const, or let variable.
|
| Node* global = BuildLoadGlobalObject();
|
| - Unique<Name> name = MakeUnique(variable->name());
|
| - const Operator* op = javascript()->StoreNamed(language_mode(), name);
|
| - Node* store = NewNode(op, global, value);
|
| + Handle<Name> name = variable->name();
|
| + Node* store = BuildNamedStore(global, name, value);
|
| PrepareFrameState(store, bailout_id, combine);
|
| return store;
|
| }
|
| @@ -2828,6 +2808,36 @@ Node* AstGraphBuilder::BuildVariableAssignment(
|
| }
|
|
|
|
|
| +Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key,
|
| + const VectorSlotPair& feedback) {
|
| + const Operator* op = javascript()->LoadProperty(feedback);
|
| + return NewNode(op, object, key);
|
| +}
|
| +
|
| +
|
| +Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name,
|
| + const VectorSlotPair& feedback,
|
| + ContextualMode mode) {
|
| + const Operator* op =
|
| + javascript()->LoadNamed(MakeUnique(name), feedback, mode);
|
| + return NewNode(op, object);
|
| +}
|
| +
|
| +
|
| +Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node* value) {
|
| + const Operator* op = javascript()->StoreProperty(language_mode());
|
| + return NewNode(op, object, key, value);
|
| +}
|
| +
|
| +
|
| +Node* AstGraphBuilder::BuildNamedStore(Node* object, Handle<Name> name,
|
| + Node* value) {
|
| + const Operator* op =
|
| + javascript()->StoreNamed(language_mode(), MakeUnique(name));
|
| + return NewNode(op, object, value);
|
| +}
|
| +
|
| +
|
| Node* AstGraphBuilder::BuildLoadObjectField(Node* object, int offset) {
|
| return NewNode(jsgraph()->machine()->Load(kMachAnyTagged), object,
|
| jsgraph()->IntPtrConstant(offset - kHeapObjectTag));
|
| @@ -2912,9 +2922,8 @@ 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);
|
| + Handle<Name> name = isolate()->factory()->home_object_symbol();
|
| + Node* store = BuildNamedStore(value, name, home_object);
|
| PrepareFrameState(store, BailoutId::None());
|
| return store;
|
| }
|
|
|