| Index: src/compiler/ast-graph-builder.cc
|
| diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
|
| index bc96c4c91ad602499dd33ccd49a92c27d1ecdef8..038d2beb1e6472e9b01cf843993ca1b592e7dfd1 100644
|
| --- a/src/compiler/ast-graph-builder.cc
|
| +++ b/src/compiler/ast-graph-builder.cc
|
| @@ -1368,14 +1368,15 @@ void AstGraphBuilder::VisitForInBody(ForInStatement* stmt) {
|
| Node* cache_type = environment()->Peek(3);
|
| Node* obj = environment()->Peek(4);
|
|
|
| - // Check loop termination condition.
|
| - FrameStateBeforeAndAfter states(this, BailoutId::None());
|
| - Node* exit_cond = NewNode(javascript()->LessThan(LanguageMode::SLOPPY),
|
| - index, cache_length);
|
| - // TODO(jarin): provide real bailout id.
|
| - states.AddToNode(exit_cond, BailoutId::None(),
|
| - OutputFrameStateCombine::Ignore());
|
| - for_loop.BreakUnless(exit_cond);
|
| + // Check loop termination condition (cannot deoptimize).
|
| + {
|
| + FrameStateBeforeAndAfter states(this, BailoutId::None());
|
| + Node* exit_cond = NewNode(javascript()->LessThan(LanguageMode::SLOPPY),
|
| + index, cache_length);
|
| + states.AddToNode(exit_cond, BailoutId::None(),
|
| + OutputFrameStateCombine::Ignore());
|
| + for_loop.BreakUnless(exit_cond);
|
| + }
|
| Node* pair = NewNode(javascript()->CallRuntime(Runtime::kForInNext, 4), obj,
|
| cache_array, cache_type, index);
|
| Node* value = NewNode(common()->Projection(0), pair);
|
| @@ -1405,9 +1406,8 @@ void AstGraphBuilder::VisitForInBody(ForInStatement* stmt) {
|
| IfBuilder is_property_missing(this);
|
| is_property_missing.If(property_missing);
|
| is_property_missing.Then();
|
| - // Inc counter and continue.
|
| + // Inc counter and continue (cannot deoptimize).
|
| {
|
| - // TODO(jarin): provide real bailout id.
|
| FrameStateBeforeAndAfter states(this, BailoutId::None());
|
| Node* index_inc = NewNode(javascript()->Add(LanguageMode::SLOPPY),
|
| index, jsgraph()->OneConstant());
|
| @@ -1431,17 +1431,15 @@ void AstGraphBuilder::VisitForInBody(ForInStatement* stmt) {
|
| index = environment()->Peek(0);
|
| for_loop.EndBody();
|
|
|
| - // Inc counter and continue.
|
| - Node* index_inc =
|
| - NewNode(javascript()->Add(LanguageMode::SLOPPY), index,
|
| - jsgraph()->OneConstant());
|
| + // Inc counter and continue (cannot deoptimize).
|
| {
|
| - // TODO(jarin): provide real bailout ids.
|
| FrameStateBeforeAndAfter states(this, BailoutId::None());
|
| + Node* index_inc = NewNode(javascript()->Add(LanguageMode::SLOPPY), index,
|
| + jsgraph()->OneConstant());
|
| states.AddToNode(index_inc, BailoutId::None(),
|
| OutputFrameStateCombine::Ignore());
|
| + environment()->Poke(0, index_inc);
|
| }
|
| - environment()->Poke(0, index_inc);
|
| for_loop.EndLoop();
|
| environment()->Drop(5);
|
| // PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
|
|
|