public JsStatement VisitGotoStateStatement(JsGotoStateStatement statement, object data)
        {
            var   result = new List <JsStatement>();
            State targetState;

            if (statement.TargetState == null)
            {
                if (!_labelStates.TryGetValue(statement.TargetLabel, out targetState))
                {
                    throw new InvalidOperationException("The label " + statement.TargetLabel + " does not exist.");
                }
            }
            else
            {
                targetState = statement.TargetState.Value;
            }

            var         remaining = statement.CurrentState.FinallyStack;
            JsStatement finallyExecutionStatement = null;

            for (int i = 0, n = remaining.Count() - targetState.FinallyStack.Count(); i < n; i++)
            {
                var current = remaining.Peek();
                remaining = remaining.Pop();
                var block = JsStatement.BlockMerged(
                    JsExpression.Assign(JsExpression.Identifier(_stateVariableName), JsExpression.Number(remaining.IsEmpty ? -1 : remaining.Peek().Item1)),
                    JsExpression.Invocation(JsExpression.Member(JsExpression.Identifier(current.Item2), "call"), JsExpression.This)
                    );

                if (finallyExecutionStatement == null)
                {
                    finallyExecutionStatement = block;
                }
                else
                {
                    finallyExecutionStatement = JsStatement.Try(finallyExecutionStatement, null, block);
                }
            }

            if (finallyExecutionStatement != null)
            {
                result.Add(finallyExecutionStatement);
            }

            result.Add(MakeSetNextStateStatement(targetState.StateValue));
            result.Add(targetState.StateValue == -1 ? (JsStatement)JsStatement.Break(targetState.LoopLabelName) : JsStatement.Continue(targetState.LoopLabelName));
            return(JsStatement.BlockMerged(result));
        }
Ejemplo n.º 2
0
 public void ContinueStatementIsCorrectlyOutput()
 {
     AssertCorrect(JsStatement.Continue(), "continue;\n");
     AssertCorrect(JsStatement.Continue("someLabel"), "continue someLabel;\n");
 }