| Index: src/compiler/ast-graph-builder.cc
|
| diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
|
| index 0434cb4def2d95a8457a29e9ef14cb33d9fefccb..2db1873fdf10c051effb0672148d62e53b3b7537 100644
|
| --- a/src/compiler/ast-graph-builder.cc
|
| +++ b/src/compiler/ast-graph-builder.cc
|
| @@ -1622,12 +1622,12 @@ void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) {
|
| environment()->Push(literal);
|
|
|
| // Load the "prototype" from the constructor.
|
| - FrameStateBeforeAndAfter states(this, expr->CreateLiteralId());
|
| + PrepareEagerCheckpoint(expr->CreateLiteralId());
|
| Handle<Name> name = isolate()->factory()->prototype_string();
|
| VectorSlotPair pair = CreateVectorSlotPair(expr->PrototypeSlot());
|
| Node* prototype = BuildNamedLoad(literal, name, pair);
|
| - states.AddToNode(prototype, expr->PrototypeId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(prototype, expr->PrototypeId(),
|
| + OutputFrameStateCombine::Push());
|
| environment()->Push(prototype);
|
|
|
| // Create nodes to store method values into the literal.
|
| @@ -1734,7 +1734,7 @@ void AstGraphBuilder::VisitConditional(Conditional* expr) {
|
|
|
| void AstGraphBuilder::VisitVariableProxy(VariableProxy* expr) {
|
| VectorSlotPair pair = CreateVectorSlotPair(expr->VariableFeedbackSlot());
|
| - FrameStateBeforeAndAfter states(this, BeforeId(expr));
|
| + PrepareEagerCheckpoint(BeforeId(expr));
|
| Node* value = BuildVariableLoad(expr->var(), expr->id(), pair,
|
| ast_context()->GetStateCombine());
|
| ast_context()->ProduceValue(value);
|
| @@ -1795,15 +1795,15 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
|
| if (key->value()->IsInternalizedString()) {
|
| if (property->emit_store()) {
|
| VisitForValue(property->value());
|
| - FrameStateBeforeAndAfter states(this, property->value()->id());
|
| + PrepareEagerCheckpoint(property->value()->id());
|
| Node* value = environment()->Pop();
|
| Node* literal = environment()->Top();
|
| Handle<Name> name = key->AsPropertyName();
|
| VectorSlotPair feedback =
|
| CreateVectorSlotPair(property->GetSlot(0));
|
| Node* store = BuildNamedStore(literal, name, value, feedback);
|
| - states.AddToNode(store, key->id(),
|
| - OutputFrameStateCombine::Ignore());
|
| + PrepareFrameState(store, key->id(),
|
| + OutputFrameStateCombine::Ignore());
|
| BuildSetHomeObject(value, literal, property, 1);
|
| } else {
|
| VisitForEffect(property->value());
|
| @@ -1980,14 +1980,14 @@ void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
|
|
|
| VisitForValue(subexpr);
|
| {
|
| - FrameStateBeforeAndAfter states(this, subexpr->id());
|
| + PrepareEagerCheckpoint(subexpr->id());
|
| VectorSlotPair pair = CreateVectorSlotPair(expr->LiteralFeedbackSlot());
|
| Node* value = environment()->Pop();
|
| Node* index = jsgraph()->Constant(array_index);
|
| Node* literal = environment()->Top();
|
| Node* store = BuildKeyedStore(literal, index, value, pair);
|
| - states.AddToNode(store, expr->GetIdForElement(array_index),
|
| - OutputFrameStateCombine::Ignore());
|
| + PrepareFrameState(store, expr->GetIdForElement(array_index),
|
| + OutputFrameStateCombine::Ignore());
|
| }
|
| }
|
|
|
| @@ -2030,7 +2030,7 @@ void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value,
|
| case VARIABLE: {
|
| Variable* var = expr->AsVariableProxy()->var();
|
| environment()->Push(value);
|
| - FrameStateBeforeAndAfter states(this, bailout_id_before);
|
| + PrepareEagerCheckpoint(bailout_id_before);
|
| value = environment()->Pop();
|
| BuildVariableAssignment(var, value, Token::ASSIGN, feedback,
|
| bailout_id_after);
|
| @@ -2039,40 +2039,40 @@ void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value,
|
| case NAMED_PROPERTY: {
|
| environment()->Push(value);
|
| VisitForValue(property->obj());
|
| - FrameStateBeforeAndAfter states(this, property->obj()->id());
|
| + PrepareEagerCheckpoint(property->obj()->id());
|
| Node* object = environment()->Pop();
|
| value = environment()->Pop();
|
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| Node* store = BuildNamedStore(object, name, value, feedback);
|
| - states.AddToNode(store, bailout_id_after,
|
| - OutputFrameStateCombine::Ignore());
|
| + PrepareFrameState(store, bailout_id_after,
|
| + OutputFrameStateCombine::Ignore());
|
| break;
|
| }
|
| case KEYED_PROPERTY: {
|
| environment()->Push(value);
|
| VisitForValue(property->obj());
|
| VisitForValue(property->key());
|
| - FrameStateBeforeAndAfter states(this, property->key()->id());
|
| + PrepareEagerCheckpoint(property->key()->id());
|
| Node* key = environment()->Pop();
|
| Node* object = environment()->Pop();
|
| value = environment()->Pop();
|
| Node* store = BuildKeyedStore(object, key, value, feedback);
|
| - states.AddToNode(store, bailout_id_after,
|
| - OutputFrameStateCombine::Ignore());
|
| + PrepareFrameState(store, bailout_id_after,
|
| + OutputFrameStateCombine::Ignore());
|
| break;
|
| }
|
| case NAMED_SUPER_PROPERTY: {
|
| environment()->Push(value);
|
| VisitForValue(property->obj()->AsSuperPropertyReference()->this_var());
|
| VisitForValue(property->obj()->AsSuperPropertyReference()->home_object());
|
| - FrameStateBeforeAndAfter states(this, property->obj()->id());
|
| + PrepareEagerCheckpoint(property->obj()->id());
|
| Node* home_object = environment()->Pop();
|
| Node* receiver = environment()->Pop();
|
| value = environment()->Pop();
|
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| Node* store = BuildNamedSuperStore(receiver, home_object, name, value);
|
| - states.AddToNode(store, bailout_id_after,
|
| - OutputFrameStateCombine::Ignore());
|
| + PrepareFrameState(store, bailout_id_after,
|
| + OutputFrameStateCombine::Ignore());
|
| break;
|
| }
|
| case KEYED_SUPER_PROPERTY: {
|
| @@ -2080,14 +2080,14 @@ void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value,
|
| VisitForValue(property->obj()->AsSuperPropertyReference()->this_var());
|
| VisitForValue(property->obj()->AsSuperPropertyReference()->home_object());
|
| VisitForValue(property->key());
|
| - FrameStateBeforeAndAfter states(this, property->key()->id());
|
| + PrepareEagerCheckpoint(property->key()->id());
|
| Node* key = environment()->Pop();
|
| Node* home_object = environment()->Pop();
|
| Node* receiver = environment()->Pop();
|
| value = environment()->Pop();
|
| Node* store = BuildKeyedSuperStore(receiver, home_object, key, value);
|
| - states.AddToNode(store, bailout_id_after,
|
| - OutputFrameStateCombine::Ignore());
|
| + PrepareFrameState(store, bailout_id_after,
|
| + OutputFrameStateCombine::Ignore());
|
| break;
|
| }
|
| }
|
| @@ -2141,7 +2141,7 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| VariableProxy* proxy = expr->target()->AsVariableProxy();
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(proxy->VariableFeedbackSlot());
|
| - FrameStateBeforeAndAfter states(this, BeforeId(proxy));
|
| + PrepareEagerCheckpoint(BeforeId(proxy));
|
| old_value = BuildVariableLoad(proxy->var(), expr->target()->id(), pair,
|
| OutputFrameStateCombine::Push());
|
| break;
|
| @@ -2151,10 +2151,10 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| - FrameStateBeforeAndAfter states(this, property->obj()->id());
|
| + PrepareEagerCheckpoint(property->obj()->id());
|
| old_value = BuildNamedLoad(object, name, pair);
|
| - states.AddToNode(old_value, property->LoadId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(old_value, property->LoadId(),
|
| + OutputFrameStateCombine::Push());
|
| break;
|
| }
|
| case KEYED_PROPERTY: {
|
| @@ -2162,10 +2162,10 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| Node* object = environment()->Peek(1);
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| - FrameStateBeforeAndAfter states(this, property->key()->id());
|
| + PrepareEagerCheckpoint(property->key()->id());
|
| old_value = BuildKeyedLoad(object, key, pair);
|
| - states.AddToNode(old_value, property->LoadId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(old_value, property->LoadId(),
|
| + OutputFrameStateCombine::Push());
|
| break;
|
| }
|
| case NAMED_SUPER_PROPERTY: {
|
| @@ -2174,10 +2174,10 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| - FrameStateBeforeAndAfter states(this, property->obj()->id());
|
| + PrepareEagerCheckpoint(property->obj()->id());
|
| old_value = BuildNamedSuperLoad(receiver, home_object, name, pair);
|
| - states.AddToNode(old_value, property->LoadId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(old_value, property->LoadId(),
|
| + OutputFrameStateCombine::Push());
|
| break;
|
| }
|
| case KEYED_SUPER_PROPERTY: {
|
| @@ -2186,10 +2186,10 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| Node* receiver = environment()->Peek(2);
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| - FrameStateBeforeAndAfter states(this, property->key()->id());
|
| + PrepareEagerCheckpoint(property->key()->id());
|
| old_value = BuildKeyedSuperLoad(receiver, home_object, key, pair);
|
| - states.AddToNode(old_value, property->LoadId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(old_value, property->LoadId(),
|
| + OutputFrameStateCombine::Push());
|
| break;
|
| }
|
| }
|
| @@ -2217,8 +2217,8 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| }
|
| }
|
|
|
| - FrameStateBeforeAndAfter store_states(this, before_store_id);
|
| // Store the value.
|
| + PrepareEagerCheckpoint(before_store_id);
|
| Node* value = environment()->Pop();
|
| VectorSlotPair feedback = CreateVectorSlotPair(expr->AssignmentSlot());
|
| switch (assign_type) {
|
| @@ -2232,16 +2232,14 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| Node* object = environment()->Pop();
|
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| Node* store = BuildNamedStore(object, name, value, feedback);
|
| - store_states.AddToNode(store, expr->id(),
|
| - ast_context()->GetStateCombine());
|
| + PrepareFrameState(store, expr->id(), ast_context()->GetStateCombine());
|
| break;
|
| }
|
| case KEYED_PROPERTY: {
|
| Node* key = environment()->Pop();
|
| Node* object = environment()->Pop();
|
| Node* store = BuildKeyedStore(object, key, value, feedback);
|
| - store_states.AddToNode(store, expr->id(),
|
| - ast_context()->GetStateCombine());
|
| + PrepareFrameState(store, expr->id(), ast_context()->GetStateCombine());
|
| break;
|
| }
|
| case NAMED_SUPER_PROPERTY: {
|
| @@ -2249,8 +2247,7 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| Node* receiver = environment()->Pop();
|
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| Node* store = BuildNamedSuperStore(receiver, home_object, name, value);
|
| - store_states.AddToNode(store, expr->id(),
|
| - ast_context()->GetStateCombine());
|
| + PrepareFrameState(store, expr->id(), ast_context()->GetStateCombine());
|
| break;
|
| }
|
| case KEYED_SUPER_PROPERTY: {
|
| @@ -2258,8 +2255,7 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| Node* home_object = environment()->Pop();
|
| Node* receiver = environment()->Pop();
|
| Node* store = BuildKeyedSuperStore(receiver, home_object, key, value);
|
| - store_states.AddToNode(store, expr->id(),
|
| - ast_context()->GetStateCombine());
|
| + PrepareFrameState(store, expr->id(), ast_context()->GetStateCombine());
|
| break;
|
| }
|
| }
|
| @@ -2293,44 +2289,44 @@ void AstGraphBuilder::VisitProperty(Property* expr) {
|
| break;
|
| case NAMED_PROPERTY: {
|
| VisitForValue(expr->obj());
|
| - FrameStateBeforeAndAfter states(this, expr->obj()->id());
|
| + PrepareEagerCheckpoint(expr->obj()->id());
|
| Node* object = environment()->Pop();
|
| Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName();
|
| value = BuildNamedLoad(object, name, pair);
|
| - states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
|
| + PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
|
| break;
|
| }
|
| case KEYED_PROPERTY: {
|
| VisitForValue(expr->obj());
|
| VisitForValue(expr->key());
|
| - FrameStateBeforeAndAfter states(this, expr->key()->id());
|
| + PrepareEagerCheckpoint(expr->key()->id());
|
| Node* key = environment()->Pop();
|
| Node* object = environment()->Pop();
|
| value = BuildKeyedLoad(object, key, pair);
|
| - states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
|
| + PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
|
| break;
|
| }
|
| case NAMED_SUPER_PROPERTY: {
|
| VisitForValue(expr->obj()->AsSuperPropertyReference()->this_var());
|
| VisitForValue(expr->obj()->AsSuperPropertyReference()->home_object());
|
| - FrameStateBeforeAndAfter states(this, expr->obj()->id());
|
| + PrepareEagerCheckpoint(expr->obj()->id());
|
| Node* home_object = environment()->Pop();
|
| Node* receiver = environment()->Pop();
|
| Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName();
|
| value = BuildNamedSuperLoad(receiver, home_object, name, pair);
|
| - states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
|
| + PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
|
| break;
|
| }
|
| case KEYED_SUPER_PROPERTY: {
|
| VisitForValue(expr->obj()->AsSuperPropertyReference()->this_var());
|
| VisitForValue(expr->obj()->AsSuperPropertyReference()->home_object());
|
| VisitForValue(expr->key());
|
| - FrameStateBeforeAndAfter states(this, expr->key()->id());
|
| + PrepareEagerCheckpoint(expr->key()->id());
|
| Node* key = environment()->Pop();
|
| Node* home_object = environment()->Pop();
|
| Node* receiver = environment()->Pop();
|
| value = BuildKeyedSuperLoad(receiver, home_object, key, pair);
|
| - states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
|
| + PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
|
| break;
|
| }
|
| }
|
| @@ -2352,7 +2348,7 @@ void AstGraphBuilder::VisitCall(Call* expr) {
|
| case Call::GLOBAL_CALL: {
|
| VariableProxy* proxy = callee->AsVariableProxy();
|
| VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot());
|
| - FrameStateBeforeAndAfter states(this, BeforeId(proxy));
|
| + PrepareEagerCheckpoint(BeforeId(proxy));
|
| callee_value = BuildVariableLoad(proxy->var(), expr->expression()->id(),
|
| pair, OutputFrameStateCombine::Push());
|
| receiver_hint = ConvertReceiverMode::kNullOrUndefined;
|
| @@ -2377,12 +2373,12 @@ void AstGraphBuilder::VisitCall(Call* expr) {
|
| VectorSlotPair feedback =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| VisitForValue(property->obj());
|
| - FrameStateBeforeAndAfter states(this, property->obj()->id());
|
| + PrepareEagerCheckpoint(property->obj()->id());
|
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| Node* object = environment()->Top();
|
| callee_value = BuildNamedLoad(object, name, feedback);
|
| - states.AddToNode(callee_value, property->LoadId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(callee_value, property->LoadId(),
|
| + OutputFrameStateCombine::Push());
|
| // Note that a property call requires the receiver to be wrapped into
|
| // an object for sloppy callees. However the receiver is guaranteed
|
| // not to be null or undefined at this point.
|
| @@ -2396,12 +2392,12 @@ void AstGraphBuilder::VisitCall(Call* expr) {
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| VisitForValue(property->obj());
|
| VisitForValue(property->key());
|
| - FrameStateBeforeAndAfter states(this, property->key()->id());
|
| + PrepareEagerCheckpoint(property->key()->id());
|
| Node* key = environment()->Pop();
|
| Node* object = environment()->Top();
|
| callee_value = BuildKeyedLoad(object, key, feedback);
|
| - states.AddToNode(callee_value, property->LoadId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(callee_value, property->LoadId(),
|
| + OutputFrameStateCombine::Push());
|
| // Note that a property call requires the receiver to be wrapped into
|
| // an object for sloppy callees. However the receiver is guaranteed
|
| // not to be null or undefined at this point.
|
| @@ -2418,10 +2414,10 @@ void AstGraphBuilder::VisitCall(Call* expr) {
|
| Node* home = environment()->Peek(1);
|
| Node* object = environment()->Top();
|
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| - FrameStateBeforeAndAfter states(this, property->obj()->id());
|
| + PrepareEagerCheckpoint(property->obj()->id());
|
| callee_value = BuildNamedSuperLoad(object, home, name, VectorSlotPair());
|
| - states.AddToNode(callee_value, property->LoadId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(callee_value, property->LoadId(),
|
| + OutputFrameStateCombine::Push());
|
| // Note that a property call requires the receiver to be wrapped into
|
| // an object for sloppy callees. Since the receiver is not the target of
|
| // the load, it could very well be null or undefined at this point.
|
| @@ -2441,10 +2437,10 @@ void AstGraphBuilder::VisitCall(Call* expr) {
|
| Node* key = environment()->Pop();
|
| Node* home = environment()->Pop();
|
| Node* object = environment()->Pop();
|
| - FrameStateBeforeAndAfter states(this, property->key()->id());
|
| + PrepareEagerCheckpoint(property->key()->id());
|
| callee_value = BuildKeyedSuperLoad(object, home, key, VectorSlotPair());
|
| - states.AddToNode(callee_value, property->LoadId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(callee_value, property->LoadId(),
|
| + OutputFrameStateCombine::Push());
|
| // Note that a property call requires the receiver to be wrapped into
|
| // an object for sloppy callees. Since the receiver is not the target of
|
| // the load, it could very well be null or undefined at this point.
|
| @@ -2517,10 +2513,10 @@ void AstGraphBuilder::VisitCall(Call* expr) {
|
| VectorSlotPair feedback = CreateVectorSlotPair(expr->CallFeedbackICSlot());
|
| const Operator* call = javascript()->CallFunction(
|
| args->length() + 2, feedback, receiver_hint, expr->tail_call_mode());
|
| - FrameStateBeforeAndAfter states(this, expr->CallId());
|
| + PrepareEagerCheckpoint(expr->CallId());
|
| Node* value = ProcessArguments(call, args->length() + 2);
|
| environment()->Push(value->InputAt(0)); // The callee passed to the call.
|
| - states.AddToNode(value, expr->ReturnId(), OutputFrameStateCombine::Push());
|
| + PrepareFrameState(value, expr->ReturnId(), OutputFrameStateCombine::Push());
|
| environment()->Drop(1);
|
| ast_context()->ProduceValue(value);
|
| }
|
| @@ -2548,9 +2544,9 @@ void AstGraphBuilder::VisitCallSuper(Call* expr) {
|
| // Create node to perform the super call.
|
| const Operator* call =
|
| javascript()->CallConstruct(args->length() + 2, VectorSlotPair());
|
| - FrameStateBeforeAndAfter states(this, super->new_target_var()->id());
|
| + PrepareEagerCheckpoint(super->new_target_var()->id());
|
| Node* value = ProcessArguments(call, args->length() + 2);
|
| - states.AddToNode(value, expr->ReturnId(), OutputFrameStateCombine::Push());
|
| + PrepareFrameState(value, expr->ReturnId(), OutputFrameStateCombine::Push());
|
| ast_context()->ProduceValue(value);
|
| }
|
|
|
| @@ -2564,8 +2560,8 @@ void AstGraphBuilder::VisitCallNew(CallNew* expr) {
|
|
|
| // The baseline compiler doesn't push the new.target, so we need to record
|
| // the frame state before the push.
|
| - FrameStateBeforeAndAfter states(
|
| - this, args->is_empty() ? expr->expression()->id() : args->last()->id());
|
| + PrepareEagerCheckpoint(args->is_empty() ? expr->expression()->id()
|
| + : args->last()->id());
|
|
|
| // The new target is the same as the callee.
|
| environment()->Push(environment()->Peek(args->length()));
|
| @@ -2575,7 +2571,7 @@ void AstGraphBuilder::VisitCallNew(CallNew* expr) {
|
| const Operator* call =
|
| javascript()->CallConstruct(args->length() + 2, feedback);
|
| Node* value = ProcessArguments(call, args->length() + 2);
|
| - states.AddToNode(value, expr->ReturnId(), OutputFrameStateCombine::Push());
|
| + PrepareFrameState(value, expr->ReturnId(), OutputFrameStateCombine::Push());
|
| ast_context()->ProduceValue(value);
|
| }
|
|
|
| @@ -2595,9 +2591,9 @@ void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) {
|
|
|
| // Create node to perform the JS runtime call.
|
| const Operator* call = javascript()->CallFunction(args->length() + 2);
|
| - FrameStateBeforeAndAfter states(this, expr->CallId());
|
| + PrepareEagerCheckpoint(expr->CallId());
|
| Node* value = ProcessArguments(call, args->length() + 2);
|
| - states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
|
| + PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
|
| ast_context()->ProduceValue(value);
|
| }
|
|
|
| @@ -2616,9 +2612,9 @@ void AstGraphBuilder::VisitCallRuntime(CallRuntime* expr) {
|
| // Create node to perform the runtime call.
|
| Runtime::FunctionId functionId = expr->function()->function_id;
|
| const Operator* call = javascript()->CallRuntime(functionId, args->length());
|
| - FrameStateBeforeAndAfter states(this, expr->CallId());
|
| + PrepareEagerCheckpoint(expr->CallId());
|
| Node* value = ProcessArguments(call, args->length());
|
| - states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
|
| + PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
|
| ast_context()->ProduceValue(value);
|
| }
|
|
|
| @@ -2659,7 +2655,7 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
| case VARIABLE: {
|
| VariableProxy* proxy = expr->expression()->AsVariableProxy();
|
| VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot());
|
| - FrameStateBeforeAndAfter states(this, BeforeId(proxy));
|
| + PrepareEagerCheckpoint(BeforeId(proxy));
|
| old_value = BuildVariableLoad(proxy->var(), expr->expression()->id(),
|
| pair, OutputFrameStateCombine::Push());
|
| stack_depth = 0;
|
| @@ -2667,43 +2663,43 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
| }
|
| case NAMED_PROPERTY: {
|
| VisitForValue(property->obj());
|
| - FrameStateBeforeAndAfter states(this, property->obj()->id());
|
| + PrepareEagerCheckpoint(property->obj()->id());
|
| Node* object = environment()->Top();
|
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| old_value = BuildNamedLoad(object, name, pair);
|
| - states.AddToNode(old_value, property->LoadId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(old_value, property->LoadId(),
|
| + OutputFrameStateCombine::Push());
|
| stack_depth = 1;
|
| break;
|
| }
|
| case KEYED_PROPERTY: {
|
| VisitForValue(property->obj());
|
| VisitForValue(property->key());
|
| - FrameStateBeforeAndAfter states(this, property->key()->id());
|
| + PrepareEagerCheckpoint(property->key()->id());
|
| Node* key = environment()->Top();
|
| Node* object = environment()->Peek(1);
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| old_value = BuildKeyedLoad(object, key, pair);
|
| - states.AddToNode(old_value, property->LoadId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(old_value, property->LoadId(),
|
| + OutputFrameStateCombine::Push());
|
| stack_depth = 2;
|
| break;
|
| }
|
| case NAMED_SUPER_PROPERTY: {
|
| VisitForValue(property->obj()->AsSuperPropertyReference()->this_var());
|
| VisitForValue(property->obj()->AsSuperPropertyReference()->home_object());
|
| - FrameStateBeforeAndAfter states(this, property->obj()->id());
|
| + PrepareEagerCheckpoint(property->obj()->id());
|
| Node* home_object = environment()->Top();
|
| Node* receiver = environment()->Peek(1);
|
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| old_value = BuildNamedSuperLoad(receiver, home_object, name, pair);
|
| - states.AddToNode(old_value, property->LoadId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(old_value, property->LoadId(),
|
| + OutputFrameStateCombine::Push());
|
| stack_depth = 2;
|
| break;
|
| }
|
| @@ -2711,15 +2707,15 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
| VisitForValue(property->obj()->AsSuperPropertyReference()->this_var());
|
| VisitForValue(property->obj()->AsSuperPropertyReference()->home_object());
|
| VisitForValue(property->key());
|
| - FrameStateBeforeAndAfter states(this, property->obj()->id());
|
| + PrepareEagerCheckpoint(property->obj()->id());
|
| Node* key = environment()->Top();
|
| Node* home_object = environment()->Peek(1);
|
| Node* receiver = environment()->Peek(2);
|
| VectorSlotPair pair =
|
| CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| old_value = BuildKeyedSuperLoad(receiver, home_object, key, pair);
|
| - states.AddToNode(old_value, property->LoadId(),
|
| - OutputFrameStateCombine::Push());
|
| + PrepareFrameState(old_value, property->LoadId(),
|
| + OutputFrameStateCombine::Push());
|
| stack_depth = 3;
|
| break;
|
| }
|
| @@ -2732,7 +2728,6 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
|
|
| // Create a proper eager frame state for the stores.
|
| environment()->Push(old_value);
|
| - FrameStateBeforeAndAfter store_states(this, expr->ToNumberId());
|
| FrameStateBeforeAndAfter binop_states(this, expr->ToNumberId());
|
| old_value = environment()->Pop();
|
|
|
| @@ -2769,8 +2764,8 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| Node* store = BuildNamedStore(object, name, value, feedback);
|
| environment()->Push(value);
|
| - store_states.AddToNode(store, expr->AssignmentId(),
|
| - OutputFrameStateCombine::Ignore());
|
| + PrepareFrameState(store, expr->AssignmentId(),
|
| + OutputFrameStateCombine::Ignore());
|
| environment()->Pop();
|
| break;
|
| }
|
| @@ -2779,8 +2774,8 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
| Node* object = environment()->Pop();
|
| Node* store = BuildKeyedStore(object, key, value, feedback);
|
| environment()->Push(value);
|
| - store_states.AddToNode(store, expr->AssignmentId(),
|
| - OutputFrameStateCombine::Ignore());
|
| + PrepareFrameState(store, expr->AssignmentId(),
|
| + OutputFrameStateCombine::Ignore());
|
| environment()->Pop();
|
| break;
|
| }
|
| @@ -2790,8 +2785,8 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
|
| Node* store = BuildNamedSuperStore(receiver, home_object, name, value);
|
| environment()->Push(value);
|
| - store_states.AddToNode(store, expr->AssignmentId(),
|
| - OutputFrameStateCombine::Ignore());
|
| + PrepareFrameState(store, expr->AssignmentId(),
|
| + OutputFrameStateCombine::Ignore());
|
| environment()->Pop();
|
| break;
|
| }
|
| @@ -2801,8 +2796,8 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
| Node* receiver = environment()->Pop();
|
| Node* store = BuildKeyedSuperStore(receiver, home_object, key, value);
|
| environment()->Push(value);
|
| - store_states.AddToNode(store, expr->AssignmentId(),
|
| - OutputFrameStateCombine::Ignore());
|
| + PrepareFrameState(store, expr->AssignmentId(),
|
| + OutputFrameStateCombine::Ignore());
|
| environment()->Pop();
|
| break;
|
| }
|
| @@ -2851,10 +2846,10 @@ void AstGraphBuilder::VisitLiteralCompareNil(CompareOperation* expr,
|
| UNREACHABLE();
|
| }
|
| VisitForValue(sub_expr);
|
| - FrameStateBeforeAndAfter states(this, sub_expr->id());
|
| + PrepareEagerCheckpoint(sub_expr->id());
|
| Node* value_to_compare = environment()->Pop();
|
| Node* value = NewNode(op, value_to_compare, nil_value);
|
| - states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
|
| + PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
|
| return ast_context()->ProduceValue(value);
|
| }
|
|
|
| @@ -2862,11 +2857,11 @@ void AstGraphBuilder::VisitLiteralCompareTypeof(CompareOperation* expr,
|
| Expression* sub_expr,
|
| Handle<String> check) {
|
| VisitTypeofExpression(sub_expr);
|
| - FrameStateBeforeAndAfter states(this, sub_expr->id());
|
| + PrepareEagerCheckpoint(sub_expr->id());
|
| Node* typeof_arg = NewNode(javascript()->TypeOf(), environment()->Pop());
|
| Node* value = NewNode(javascript()->StrictEqual(), typeof_arg,
|
| jsgraph()->Constant(check));
|
| - states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
|
| + PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
|
| return ast_context()->ProduceValue(value);
|
| }
|
|
|
| @@ -3052,7 +3047,7 @@ void AstGraphBuilder::VisitTypeofExpression(Expression* expr) {
|
| // perform a non-contextual load in case the operand is a variable proxy.
|
| VariableProxy* proxy = expr->AsVariableProxy();
|
| VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot());
|
| - FrameStateBeforeAndAfter states(this, BeforeId(proxy));
|
| + PrepareEagerCheckpoint(BeforeId(proxy));
|
| Node* load =
|
| BuildVariableLoad(proxy->var(), expr->id(), pair,
|
| OutputFrameStateCombine::Push(), INSIDE_TYPEOF);
|
| @@ -4060,6 +4055,15 @@ void AstGraphBuilder::PrepareFrameState(Node* node, BailoutId ast_id,
|
| }
|
| }
|
|
|
| +void AstGraphBuilder::PrepareEagerCheckpoint(BailoutId ast_id) {
|
| + if (ast_id != BailoutId::None()) {
|
| + Node* node = NewNode(common()->Checkpoint());
|
| + DCHECK_EQ(IrOpcode::kDead,
|
| + NodeProperties::GetFrameStateInput(node, 0)->opcode());
|
| + NodeProperties::ReplaceFrameStateInput(node, 0,
|
| + environment()->Checkpoint(ast_id));
|
| + }
|
| +}
|
|
|
| BitVector* AstGraphBuilder::GetVariablesAssignedInLoop(
|
| IterationStatement* stmt) {
|
|
|