Commit fbbe5ed1 authored by zhengxing.li's avatar zhengxing.li Committed by Commit bot

X87: [fullcodegen] Implement control flow across do-expressions.

  port ee8108b7 (r34246)

  original commit message:
  This implements proper handling of local control flow (i.e. break and
  continue) that spans the boundary of a do-expression. We can no longer
  determine the number of operands to be dropped from the nesting of
  statements alone, instead we use the new precise operand stack depth
  tracking.

BUG=

Review URL: https://codereview.chromium.org/1735853002

Cr-Commit-Position: refs/heads/master@{#34277}
parent e55c5c06
...@@ -926,14 +926,14 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) { ...@@ -926,14 +926,14 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
FeedbackVectorSlot slot = stmt->ForInFeedbackSlot(); FeedbackVectorSlot slot = stmt->ForInFeedbackSlot();
Label loop, exit;
ForIn loop_statement(this, stmt);
increment_loop_depth();
// Get the object to enumerate over. // Get the object to enumerate over.
SetExpressionAsStatementPosition(stmt->enumerable()); SetExpressionAsStatementPosition(stmt->enumerable());
VisitForAccumulatorValue(stmt->enumerable()); VisitForAccumulatorValue(stmt->enumerable());
OperandStackDepthIncrement(ForIn::kElementCount); OperandStackDepthIncrement(5);
Label loop, exit;
Iteration loop_statement(this, stmt);
increment_loop_depth();
// If the object is null or undefined, skip over the loop, otherwise convert // If the object is null or undefined, skip over the loop, otherwise convert
// it to a JS receiver. See ECMA-262 version 5, section 12.6.4. // it to a JS receiver. See ECMA-262 version 5, section 12.6.4.
...@@ -1081,8 +1081,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) { ...@@ -1081,8 +1081,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
// Remove the pointers stored on the stack. // Remove the pointers stored on the stack.
__ bind(loop_statement.break_label()); __ bind(loop_statement.break_label());
__ add(esp, Immediate(5 * kPointerSize)); DropOperands(5);
OperandStackDepthDecrement(ForIn::kElementCount);
// Exit and decrement the loop depth. // Exit and decrement the loop depth.
PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS); PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
...@@ -1772,7 +1771,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) { ...@@ -1772,7 +1771,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
case Yield::kSuspend: case Yield::kSuspend:
// Pop value from top-of-stack slot; box result into result register. // Pop value from top-of-stack slot; box result into result register.
EmitCreateIteratorResult(false); EmitCreateIteratorResult(false);
__ push(result_register()); PushOperand(result_register());
// Fall through. // Fall through.
case Yield::kInitial: { case Yield::kInitial: {
Label suspend, continuation, post_runtime, resume; Label suspend, continuation, post_runtime, resume;
...@@ -1791,6 +1790,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) { ...@@ -1791,6 +1790,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
EmitUnwindAndReturn(); EmitUnwindAndReturn();
__ bind(&suspend); __ bind(&suspend);
OperandStackDepthIncrement(1); // Not popped on this path.
VisitForAccumulatorValue(expr->generator_object()); VisitForAccumulatorValue(expr->generator_object());
DCHECK(continuation.pos() > 0 && Smi::IsValid(continuation.pos())); DCHECK(continuation.pos() > 0 && Smi::IsValid(continuation.pos()));
__ mov(FieldOperand(eax, JSGeneratorObject::kContinuationOffset), __ mov(FieldOperand(eax, JSGeneratorObject::kContinuationOffset),
...@@ -1817,7 +1817,6 @@ void FullCodeGenerator::VisitYield(Yield* expr) { ...@@ -1817,7 +1817,6 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
case Yield::kFinal: { case Yield::kFinal: {
// Pop value from top-of-stack slot, box result into result register. // Pop value from top-of-stack slot, box result into result register.
OperandStackDepthDecrement(1);
EmitCreateIteratorResult(true); EmitCreateIteratorResult(true);
EmitUnwindAndReturn(); EmitUnwindAndReturn();
break; break;
...@@ -1958,6 +1957,7 @@ void FullCodeGenerator::EmitCreateIteratorResult(bool done) { ...@@ -1958,6 +1957,7 @@ void FullCodeGenerator::EmitCreateIteratorResult(bool done) {
__ mov(FieldOperand(eax, JSIteratorResult::kDoneOffset), __ mov(FieldOperand(eax, JSIteratorResult::kDoneOffset),
isolate()->factory()->ToBoolean(done)); isolate()->factory()->ToBoolean(done));
STATIC_ASSERT(JSIteratorResult::kSize == 5 * kPointerSize); STATIC_ASSERT(JSIteratorResult::kSize == 5 * kPointerSize);
OperandStackDepthDecrement(1);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment