Index: src/compiler/ast-graph-builder.cc |
diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc |
index 50a3720c58e9c333e8ce6bb373b28568711b9988..b97260111ea45ffb0ea1683b4347183bb90be733 100644 |
--- a/src/compiler/ast-graph-builder.cc |
+++ b/src/compiler/ast-graph-builder.cc |
@@ -642,11 +642,14 @@ void AstGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
// Convert object to jsobject. |
// PrepareForBailoutForId(stmt->PrepareId(), TOS_REG); |
obj = NewNode(javascript()->ToObject(), obj); |
+ PrepareFrameState(obj, stmt->ToObjectId(), OutputFrameStateCombine::Push()); |
environment()->Push(obj); |
// TODO(dcarney): should do a fast enum cache check here to skip runtime. |
environment()->Push(obj); |
Node* cache_type = ProcessArguments( |
javascript()->CallRuntime(Runtime::kGetPropertyNamesFast, 1), 1); |
+ PrepareFrameState(cache_type, stmt->EnumId(), |
+ OutputFrameStateCombine::Push()); |
// TODO(dcarney): these next runtime calls should be removed in favour of |
// a few simplified instructions. |
environment()->Push(obj); |
@@ -882,6 +885,8 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
const Operator* op = |
javascript()->CallRuntime(Runtime::kCreateObjectLiteral, 4); |
Node* literal = NewNode(op, literals_array, literal_index, constants, flags); |
+ PrepareFrameState(literal, expr->CreateLiteralId(), |
+ OutputFrameStateCombine::Push()); |
// The object is expected on the operand stack during computation of the |
// property values and is the value of the entire expression. |
@@ -943,7 +948,10 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
if (property->emit_store()) { |
const Operator* op = |
javascript()->CallRuntime(Runtime::kInternalSetPrototype, 2); |
- NewNode(op, receiver, value); |
+ Node* set_prototype = NewNode(op, receiver, value); |
+ // SetPrototype should not lazy deopt on an object |
+ // literal. |
+ PrepareFrameState(set_prototype, BailoutId::None()); |
} |
break; |
} |
@@ -970,7 +978,8 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
const Operator* op = |
javascript()->CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); |
Node* call = NewNode(op, literal, name, getter, setter, attr); |
- PrepareFrameState(call, it->first->id()); |
+ // This should not lazy deopt on a new literal. |
+ PrepareFrameState(call, BailoutId::None()); |
} |
// Transform literals that contain functions to fast properties. |
@@ -1237,7 +1246,7 @@ void AstGraphBuilder::VisitCall(Call* expr) { |
receiver_value = NewNode(common()->Projection(1), pair); |
PrepareFrameState(pair, expr->EvalOrLookupId(), |
- OutputFrameStateCombine::Push()); |
+ OutputFrameStateCombine::Push(2)); |
break; |
} |
case Call::PROPERTY_CALL: { |