Index: src/compiler/ast-graph-builder.cc |
diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc |
index 3f8d40cd8f2882dd51a6ee25639c495480d57e9d..ec2af52ec4d5b605c335b2d4a15a56fa73359920 100644 |
--- a/src/compiler/ast-graph-builder.cc |
+++ b/src/compiler/ast-graph-builder.cc |
@@ -40,14 +40,14 @@ |
// Plug a node into this expression context. Call this function in tail |
// position in the Visit functions for expressions. |
- virtual void ProduceValue(Expression* expr, Node* value) = 0; |
+ virtual void ProduceValue(Node* value) = 0; |
// Unplugs a node from this expression context. Call this to retrieve the |
// result of another Visit function that already plugged the context. |
virtual Node* ConsumeValue() = 0; |
// Shortcut for "context->ProduceValue(context->ConsumeValue())". |
- void ReplaceValue(Expression* expr) { ProduceValue(expr, ConsumeValue()); } |
+ void ReplaceValue() { ProduceValue(ConsumeValue()); } |
protected: |
AstContext(AstGraphBuilder* owner, Expression::Context kind); |
@@ -75,7 +75,7 @@ |
explicit AstEffectContext(AstGraphBuilder* owner) |
: AstContext(owner, Expression::kEffect) {} |
~AstEffectContext() final; |
- void ProduceValue(Expression* expr, Node* value) final; |
+ void ProduceValue(Node* value) final; |
Node* ConsumeValue() final; |
}; |
@@ -86,7 +86,7 @@ |
explicit AstValueContext(AstGraphBuilder* owner) |
: AstContext(owner, Expression::kValue) {} |
~AstValueContext() final; |
- void ProduceValue(Expression* expr, Node* value) final; |
+ void ProduceValue(Node* value) final; |
Node* ConsumeValue() final; |
}; |
@@ -97,7 +97,7 @@ |
AstTestContext(AstGraphBuilder* owner, TypeFeedbackId feedback_id) |
: AstContext(owner, Expression::kTest), feedback_id_(feedback_id) {} |
~AstTestContext() final; |
- void ProduceValue(Expression* expr, Node* value) final; |
+ void ProduceValue(Node* value) final; |
Node* ConsumeValue() final; |
private: |
@@ -968,22 +968,19 @@ |
DCHECK(environment()->stack_height() == original_height_ + 1); |
} |
-void AstGraphBuilder::AstEffectContext::ProduceValue(Expression* expr, |
- Node* value) { |
+ |
+void AstGraphBuilder::AstEffectContext::ProduceValue(Node* value) { |
// The value is ignored. |
- owner()->PrepareEagerCheckpoint(expr->id()); |
-} |
- |
-void AstGraphBuilder::AstValueContext::ProduceValue(Expression* expr, |
- Node* value) { |
+} |
+ |
+ |
+void AstGraphBuilder::AstValueContext::ProduceValue(Node* value) { |
environment()->Push(value); |
- owner()->PrepareEagerCheckpoint(expr->id()); |
-} |
- |
-void AstGraphBuilder::AstTestContext::ProduceValue(Expression* expr, |
- Node* value) { |
+} |
+ |
+ |
+void AstGraphBuilder::AstTestContext::ProduceValue(Node* value) { |
environment()->Push(owner()->BuildToBoolean(value, feedback_id_)); |
- owner()->PrepareEagerCheckpoint(expr->id()); |
} |
@@ -1074,7 +1071,7 @@ |
if (!CheckStackOverflow()) { |
expr->Accept(this); |
} else { |
- ast_context()->ProduceValue(expr, jsgraph()->UndefinedConstant()); |
+ ast_context()->ProduceValue(jsgraph()->UndefinedConstant()); |
} |
} |
@@ -1084,7 +1081,7 @@ |
if (!CheckStackOverflow()) { |
expr->Accept(this); |
} else { |
- ast_context()->ProduceValue(expr, jsgraph()->UndefinedConstant()); |
+ ast_context()->ProduceValue(jsgraph()->UndefinedConstant()); |
} |
} |
@@ -1094,7 +1091,7 @@ |
if (!CheckStackOverflow()) { |
expr->Accept(this); |
} else { |
- ast_context()->ProduceValue(expr, jsgraph()->UndefinedConstant()); |
+ ast_context()->ProduceValue(jsgraph()->UndefinedConstant()); |
} |
} |
@@ -1104,7 +1101,7 @@ |
if (!CheckStackOverflow()) { |
expr->Accept(this); |
} else { |
- ast_context()->ProduceValue(expr, jsgraph()->UndefinedConstant()); |
+ ast_context()->ProduceValue(jsgraph()->UndefinedConstant()); |
} |
} |
@@ -1441,13 +1438,10 @@ |
test_value.Then(); |
test_value.Else(); |
{ |
- environment()->Push(value); |
- PrepareEagerCheckpoint(stmt->FilterId()); |
- value = environment()->Pop(); |
// Bind value and do loop body. |
VectorSlotPair feedback = |
CreateVectorSlotPair(stmt->EachFeedbackSlot()); |
- VisitForInAssignment(stmt->each(), value, feedback, |
+ VisitForInAssignment(stmt->each(), value, feedback, stmt->FilterId(), |
stmt->AssignmentId()); |
VisitIterationBody(stmt, &for_loop); |
} |
@@ -1595,7 +1589,7 @@ |
PretenureFlag pretenure = expr->pretenure() ? TENURED : NOT_TENURED; |
const Operator* op = javascript()->CreateClosure(shared_info, pretenure); |
Node* value = NewNode(op); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
@@ -1710,7 +1704,7 @@ |
BuildVariableAssignment(var, literal, Token::INIT, feedback, |
BailoutId::None()); |
} |
- ast_context()->ProduceValue(expr, literal); |
+ ast_context()->ProduceValue(literal); |
} |
@@ -1722,7 +1716,7 @@ |
void AstGraphBuilder::VisitDoExpression(DoExpression* expr) { |
VisitBlock(expr->block()); |
VisitVariableProxy(expr->result()); |
- ast_context()->ReplaceValue(expr); |
+ ast_context()->ReplaceValue(); |
} |
@@ -1736,11 +1730,7 @@ |
compare_if.Else(); |
Visit(expr->else_expression()); |
compare_if.End(); |
- // Skip plugging AST evaluation contexts of the test kind. This is to stay in |
- // sync with full codegen which doesn't prepare the proper bailout point (see |
- // the implementation of FullCodeGenerator::VisitForControl). |
- if (ast_context()->IsTest()) return; |
- ast_context()->ReplaceValue(expr); |
+ ast_context()->ReplaceValue(); |
} |
@@ -1749,13 +1739,13 @@ |
PrepareEagerCheckpoint(BeforeId(expr)); |
Node* value = BuildVariableLoad(expr->var(), expr->id(), pair, |
ast_context()->GetStateCombine()); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
void AstGraphBuilder::VisitLiteral(Literal* expr) { |
Node* value = jsgraph()->Constant(expr->value()); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
@@ -1767,7 +1757,7 @@ |
expr->pattern(), expr->flags(), expr->literal_index()); |
Node* literal = NewNode(op, closure); |
PrepareFrameState(literal, expr->id(), ast_context()->GetStateCombine()); |
- ast_context()->ProduceValue(expr, literal); |
+ ast_context()->ProduceValue(literal); |
} |
@@ -1807,6 +1797,7 @@ |
if (key->value()->IsInternalizedString()) { |
if (property->emit_store()) { |
VisitForValue(property->value()); |
+ PrepareEagerCheckpoint(property->value()->id()); |
Node* value = environment()->Pop(); |
Node* literal = environment()->Top(); |
Handle<Name> name = key->AsPropertyName(); |
@@ -1952,7 +1943,7 @@ |
} |
} |
- ast_context()->ProduceValue(expr, environment()->Pop()); |
+ ast_context()->ProduceValue(environment()->Pop()); |
} |
@@ -1991,13 +1982,16 @@ |
if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; |
VisitForValue(subexpr); |
- 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); |
- PrepareFrameState(store, expr->GetIdForElement(array_index), |
- OutputFrameStateCombine::Ignore()); |
+ { |
+ 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); |
+ PrepareFrameState(store, expr->GetIdForElement(array_index), |
+ OutputFrameStateCombine::Ignore()); |
+ } |
} |
// In case the array literal contains spread expressions it has two parts. The |
@@ -2020,12 +2014,14 @@ |
} |
} |
- ast_context()->ProduceValue(expr, environment()->Pop()); |
-} |
+ ast_context()->ProduceValue(environment()->Pop()); |
+} |
+ |
void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value, |
const VectorSlotPair& feedback, |
- BailoutId bailout_id) { |
+ BailoutId bailout_id_before, |
+ BailoutId bailout_id_after) { |
DCHECK(expr->IsValidReferenceExpressionOrThis()); |
// Left-hand side can only be a property, a global or a variable slot. |
@@ -2036,40 +2032,50 @@ |
switch (assign_type) { |
case VARIABLE: { |
Variable* var = expr->AsVariableProxy()->var(); |
- BuildVariableAssignment(var, value, Token::ASSIGN, feedback, bailout_id); |
+ environment()->Push(value); |
+ PrepareEagerCheckpoint(bailout_id_before); |
+ value = environment()->Pop(); |
+ BuildVariableAssignment(var, value, Token::ASSIGN, feedback, |
+ bailout_id_after); |
break; |
} |
case NAMED_PROPERTY: { |
environment()->Push(value); |
VisitForValue(property->obj()); |
+ 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); |
- PrepareFrameState(store, bailout_id, OutputFrameStateCombine::Ignore()); |
+ PrepareFrameState(store, bailout_id_after, |
+ OutputFrameStateCombine::Ignore()); |
break; |
} |
case KEYED_PROPERTY: { |
environment()->Push(value); |
VisitForValue(property->obj()); |
VisitForValue(property->key()); |
+ PrepareEagerCheckpoint(property->key()->id()); |
Node* key = environment()->Pop(); |
Node* object = environment()->Pop(); |
value = environment()->Pop(); |
Node* store = BuildKeyedStore(object, key, value, feedback); |
- PrepareFrameState(store, bailout_id, 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()); |
+ 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); |
- PrepareFrameState(store, bailout_id, OutputFrameStateCombine::Ignore()); |
+ PrepareFrameState(store, bailout_id_after, |
+ OutputFrameStateCombine::Ignore()); |
break; |
} |
case KEYED_SUPER_PROPERTY: { |
@@ -2077,12 +2083,14 @@ |
VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); |
VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); |
VisitForValue(property->key()); |
+ 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); |
- PrepareFrameState(store, bailout_id, OutputFrameStateCombine::Ignore()); |
+ PrepareFrameState(store, bailout_id_after, |
+ OutputFrameStateCombine::Ignore()); |
break; |
} |
} |
@@ -2126,6 +2134,7 @@ |
break; |
} |
+ BailoutId before_store_id = BailoutId::None(); |
// Evaluate the value and potentially handle compound assignments by loading |
// the left-hand side value and performing a binary operation. |
if (expr->is_compound()) { |
@@ -2145,6 +2154,7 @@ |
Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
VectorSlotPair pair = |
CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
+ PrepareEagerCheckpoint(property->obj()->id()); |
old_value = BuildNamedLoad(object, name, pair); |
PrepareFrameState(old_value, property->LoadId(), |
OutputFrameStateCombine::Push()); |
@@ -2155,6 +2165,7 @@ |
Node* object = environment()->Peek(1); |
VectorSlotPair pair = |
CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
+ PrepareEagerCheckpoint(property->key()->id()); |
old_value = BuildKeyedLoad(object, key, pair); |
PrepareFrameState(old_value, property->LoadId(), |
OutputFrameStateCombine::Push()); |
@@ -2166,6 +2177,7 @@ |
Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
VectorSlotPair pair = |
CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
+ PrepareEagerCheckpoint(property->obj()->id()); |
old_value = BuildNamedSuperLoad(receiver, home_object, name, pair); |
PrepareFrameState(old_value, property->LoadId(), |
OutputFrameStateCombine::Push()); |
@@ -2177,6 +2189,7 @@ |
Node* receiver = environment()->Peek(2); |
VectorSlotPair pair = |
CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
+ PrepareEagerCheckpoint(property->key()->id()); |
old_value = BuildKeyedSuperLoad(receiver, home_object, key, pair); |
PrepareFrameState(old_value, property->LoadId(), |
OutputFrameStateCombine::Push()); |
@@ -2198,13 +2211,17 @@ |
} |
environment()->Push(value); |
if (needs_frame_state_before) { |
- PrepareEagerCheckpoint(expr->binary_operation()->id()); |
+ before_store_id = expr->binary_operation()->id(); |
} |
} else { |
VisitForValue(expr->value()); |
+ if (needs_frame_state_before) { |
+ before_store_id = expr->value()->id(); |
+ } |
} |
// Store the value. |
+ PrepareEagerCheckpoint(before_store_id); |
Node* value = environment()->Pop(); |
VectorSlotPair feedback = CreateVectorSlotPair(expr->AssignmentSlot()); |
switch (assign_type) { |
@@ -2246,14 +2263,14 @@ |
} |
} |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
void AstGraphBuilder::VisitYield(Yield* expr) { |
// Generator functions are supported only by going through Ignition first. |
SetStackOverflow(); |
- ast_context()->ProduceValue(expr, jsgraph()->UndefinedConstant()); |
+ ast_context()->ProduceValue(jsgraph()->UndefinedConstant()); |
} |
@@ -2261,7 +2278,7 @@ |
VisitForValue(expr->exception()); |
Node* exception = environment()->Pop(); |
Node* value = BuildThrowError(exception, expr->id()); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
@@ -2275,6 +2292,7 @@ |
break; |
case NAMED_PROPERTY: { |
VisitForValue(expr->obj()); |
+ PrepareEagerCheckpoint(expr->obj()->id()); |
Node* object = environment()->Pop(); |
Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName(); |
value = BuildNamedLoad(object, name, pair); |
@@ -2284,6 +2302,7 @@ |
case KEYED_PROPERTY: { |
VisitForValue(expr->obj()); |
VisitForValue(expr->key()); |
+ PrepareEagerCheckpoint(expr->key()->id()); |
Node* key = environment()->Pop(); |
Node* object = environment()->Pop(); |
value = BuildKeyedLoad(object, key, pair); |
@@ -2293,6 +2312,7 @@ |
case NAMED_SUPER_PROPERTY: { |
VisitForValue(expr->obj()->AsSuperPropertyReference()->this_var()); |
VisitForValue(expr->obj()->AsSuperPropertyReference()->home_object()); |
+ PrepareEagerCheckpoint(expr->obj()->id()); |
Node* home_object = environment()->Pop(); |
Node* receiver = environment()->Pop(); |
Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName(); |
@@ -2304,6 +2324,7 @@ |
VisitForValue(expr->obj()->AsSuperPropertyReference()->this_var()); |
VisitForValue(expr->obj()->AsSuperPropertyReference()->home_object()); |
VisitForValue(expr->key()); |
+ PrepareEagerCheckpoint(expr->key()->id()); |
Node* key = environment()->Pop(); |
Node* home_object = environment()->Pop(); |
Node* receiver = environment()->Pop(); |
@@ -2312,7 +2333,7 @@ |
break; |
} |
} |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
@@ -2355,6 +2376,7 @@ |
VectorSlotPair feedback = |
CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
VisitForValue(property->obj()); |
+ PrepareEagerCheckpoint(property->obj()->id()); |
Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
Node* object = environment()->Top(); |
callee_value = BuildNamedLoad(object, name, feedback); |
@@ -2373,6 +2395,7 @@ |
CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
VisitForValue(property->obj()); |
VisitForValue(property->key()); |
+ PrepareEagerCheckpoint(property->key()->id()); |
Node* key = environment()->Pop(); |
Node* object = environment()->Top(); |
callee_value = BuildKeyedLoad(object, key, feedback); |
@@ -2394,6 +2417,7 @@ |
Node* home = environment()->Peek(1); |
Node* object = environment()->Top(); |
Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
+ PrepareEagerCheckpoint(property->obj()->id()); |
callee_value = BuildNamedSuperLoad(object, home, name, VectorSlotPair()); |
PrepareFrameState(callee_value, property->LoadId(), |
OutputFrameStateCombine::Push()); |
@@ -2416,6 +2440,7 @@ |
Node* key = environment()->Pop(); |
Node* home = environment()->Pop(); |
Node* object = environment()->Pop(); |
+ PrepareEagerCheckpoint(property->key()->id()); |
callee_value = BuildKeyedSuperLoad(object, home, key, VectorSlotPair()); |
PrepareFrameState(callee_value, property->LoadId(), |
OutputFrameStateCombine::Push()); |
@@ -2491,12 +2516,12 @@ |
VectorSlotPair feedback = CreateVectorSlotPair(expr->CallFeedbackICSlot()); |
const Operator* call = javascript()->CallFunction( |
args->length() + 2, feedback, receiver_hint, expr->tail_call_mode()); |
- PrepareEagerCheckpoint(possibly_eval ? expr->EvalId() : expr->CallId()); |
+ PrepareEagerCheckpoint(expr->CallId()); |
Node* value = ProcessArguments(call, args->length() + 2); |
environment()->Push(value->InputAt(0)); // The callee passed to the call. |
PrepareFrameState(value, expr->ReturnId(), OutputFrameStateCombine::Push()); |
environment()->Drop(1); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
@@ -2522,9 +2547,10 @@ |
// Create node to perform the super call. |
const Operator* call = |
javascript()->CallConstruct(args->length() + 2, VectorSlotPair()); |
+ PrepareEagerCheckpoint(super->new_target_var()->id()); |
Node* value = ProcessArguments(call, args->length() + 2); |
PrepareFrameState(value, expr->ReturnId(), OutputFrameStateCombine::Push()); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
@@ -2534,6 +2560,11 @@ |
// Evaluate all arguments to the construct call. |
ZoneList<Expression*>* args = expr->arguments(); |
VisitForValues(args); |
+ |
+ // The baseline compiler doesn't push the new.target, so we need to record |
+ // the frame state before the push. |
+ 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())); |
@@ -2544,7 +2575,7 @@ |
javascript()->CallConstruct(args->length() + 2, feedback); |
Node* value = ProcessArguments(call, args->length() + 2); |
PrepareFrameState(value, expr->ReturnId(), OutputFrameStateCombine::Push()); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
@@ -2566,7 +2597,7 @@ |
PrepareEagerCheckpoint(expr->CallId()); |
Node* value = ProcessArguments(call, args->length() + 2); |
PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
@@ -2584,13 +2615,10 @@ |
// Create node to perform the runtime call. |
Runtime::FunctionId functionId = expr->function()->function_id; |
const Operator* call = javascript()->CallRuntime(functionId, args->length()); |
- if (expr->function()->intrinsic_type == Runtime::IntrinsicType::RUNTIME || |
- expr->function()->function_id == Runtime::kInlineCall) { |
- PrepareEagerCheckpoint(expr->CallId()); |
- } |
+ PrepareEagerCheckpoint(expr->CallId()); |
Node* value = ProcessArguments(call, args->length()); |
PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
@@ -2638,6 +2666,7 @@ |
} |
case NAMED_PROPERTY: { |
VisitForValue(property->obj()); |
+ PrepareEagerCheckpoint(property->obj()->id()); |
Node* object = environment()->Top(); |
Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
VectorSlotPair pair = |
@@ -2651,6 +2680,7 @@ |
case KEYED_PROPERTY: { |
VisitForValue(property->obj()); |
VisitForValue(property->key()); |
+ PrepareEagerCheckpoint(property->key()->id()); |
Node* key = environment()->Top(); |
Node* object = environment()->Peek(1); |
VectorSlotPair pair = |
@@ -2664,6 +2694,7 @@ |
case NAMED_SUPER_PROPERTY: { |
VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); |
VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); |
+ PrepareEagerCheckpoint(property->obj()->id()); |
Node* home_object = environment()->Top(); |
Node* receiver = environment()->Peek(1); |
Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
@@ -2679,6 +2710,7 @@ |
VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); |
VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); |
VisitForValue(property->key()); |
+ PrepareEagerCheckpoint(property->obj()->id()); |
Node* key = environment()->Top(); |
Node* home_object = environment()->Peek(1); |
Node* receiver = environment()->Peek(2); |
@@ -2777,7 +2809,7 @@ |
// Restore old value for postfix expressions. |
if (is_postfix) value = environment()->Pop(); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
@@ -2797,7 +2829,7 @@ |
Node* value = BuildBinaryOp(left, right, expr->op(), |
expr->BinaryOperationFeedbackId()); |
states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
} |
} |
@@ -2817,21 +2849,23 @@ |
UNREACHABLE(); |
} |
VisitForValue(sub_expr); |
+ PrepareEagerCheckpoint(sub_expr->id()); |
Node* value_to_compare = environment()->Pop(); |
Node* value = NewNode(op, value_to_compare, nil_value); |
PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
- return ast_context()->ProduceValue(expr, value); |
+ return ast_context()->ProduceValue(value); |
} |
void AstGraphBuilder::VisitLiteralCompareTypeof(CompareOperation* expr, |
Expression* sub_expr, |
Handle<String> check) { |
VisitTypeofExpression(sub_expr); |
+ PrepareEagerCheckpoint(sub_expr->id()); |
Node* typeof_arg = NewNode(javascript()->TypeOf(), environment()->Pop()); |
Node* value = NewNode(javascript()->StrictEqual(CompareOperationHints::Any()), |
typeof_arg, jsgraph()->Constant(check)); |
PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
- return ast_context()->ProduceValue(expr, value); |
+ return ast_context()->ProduceValue(value); |
} |
void AstGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
@@ -2901,7 +2935,7 @@ |
Node* left = environment()->Pop(); |
Node* value = NewNode(op, left, right); |
states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
@@ -2919,14 +2953,14 @@ |
void AstGraphBuilder::VisitThisFunction(ThisFunction* expr) { |
Node* value = GetFunctionClosure(); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
void AstGraphBuilder::VisitSuperPropertyReference( |
SuperPropertyReference* expr) { |
Node* value = BuildThrowUnsupportedSuperError(expr->id()); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
@@ -3007,14 +3041,14 @@ |
VisitForEffect(expr->expression()); |
value = jsgraph()->TrueConstant(); |
} |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
void AstGraphBuilder::VisitVoid(UnaryOperation* expr) { |
VisitForEffect(expr->expression()); |
Node* value = jsgraph()->UndefinedConstant(); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
void AstGraphBuilder::VisitTypeofExpression(Expression* expr) { |
@@ -3036,46 +3070,33 @@ |
void AstGraphBuilder::VisitTypeof(UnaryOperation* expr) { |
VisitTypeofExpression(expr->expression()); |
Node* value = NewNode(javascript()->TypeOf(), environment()->Pop()); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
void AstGraphBuilder::VisitNot(UnaryOperation* expr) { |
- VisitForTest(expr->expression()); |
- Node* input = environment()->Pop(); |
+ VisitForValue(expr->expression()); |
+ Node* operand = environment()->Pop(); |
+ Node* input = BuildToBoolean(operand, expr->expression()->test_id()); |
Node* value = NewNode(common()->Select(MachineRepresentation::kTagged), input, |
jsgraph()->FalseConstant(), jsgraph()->TrueConstant()); |
- // Skip plugging AST evaluation contexts of the test kind. This is to stay in |
- // sync with full codegen which doesn't prepare the proper bailout point (see |
- // the implementation of FullCodeGenerator::VisitForControl). |
- if (ast_context()->IsTest()) return environment()->Push(value); |
- ast_context()->ProduceValue(expr, value); |
+ ast_context()->ProduceValue(value); |
} |
void AstGraphBuilder::VisitComma(BinaryOperation* expr) { |
VisitForEffect(expr->left()); |
Visit(expr->right()); |
- ast_context()->ReplaceValue(expr); |
+ ast_context()->ReplaceValue(); |
} |
void AstGraphBuilder::VisitLogicalExpression(BinaryOperation* expr) { |
bool is_logical_and = expr->op() == Token::AND; |
IfBuilder compare_if(this); |
- // Only use an AST evaluation context of the value kind when this expression |
- // is evaluated as value as well. Otherwise stick to a test context which is |
- // in sync with full codegen (see FullCodeGenerator::VisitLogicalExpression). |
- Node* condition = nullptr; |
- if (ast_context()->IsValue()) { |
- VisitForValue(expr->left()); |
- Node* left = environment()->Top(); |
- condition = BuildToBoolean(left, expr->left()->test_id()); |
- } else { |
- VisitForTest(expr->left()); |
- condition = environment()->Top(); |
- } |
- compare_if.If(condition); |
+ VisitForValue(expr->left()); |
+ Node* condition = environment()->Top(); |
+ compare_if.If(BuildToBoolean(condition, expr->left()->test_id())); |
compare_if.Then(); |
if (is_logical_and) { |
environment()->Pop(); |
@@ -3095,11 +3116,7 @@ |
environment()->Poke(0, jsgraph()->FalseConstant()); |
} |
compare_if.End(); |
- // Skip plugging AST evaluation contexts of the test kind. This is to stay in |
- // sync with full codegen which doesn't prepare the proper bailout point (see |
- // the implementation of FullCodeGenerator::VisitForControl). |
- if (ast_context()->IsTest()) return; |
- ast_context()->ReplaceValue(expr); |
+ ast_context()->ReplaceValue(); |
} |
@@ -4060,7 +4077,6 @@ |
return; |
} |
if (ast_id != BailoutId::None()) { |
- DCHECK(info()->shared_info()->VerifyBailoutId(ast_id)); |
Node* node = NewNode(common()->Checkpoint()); |
DCHECK_EQ(IrOpcode::kDead, |
NodeProperties::GetFrameStateInput(node, 0)->opcode()); |