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; for (int i = 0, n = remaining.Count() - targetState.FinallyStack.Count(); i < n; i++) { var current = remaining.Peek(); remaining = remaining.Pop(); result.Add(new JsExpressionStatement(JsExpression.Assign(JsExpression.Identifier(_stateVariableName), JsExpression.Number(remaining.IsEmpty ? -1 : remaining.Peek().Item1)))); result.Add(new JsExpressionStatement(JsExpression.Invocation(JsExpression.Member(JsExpression.Identifier(current.Item2), "call"), JsExpression.This))); } result.Add(MakeSetNextStateStatement(targetState.StateValue)); result.Add(targetState.StateValue == -1 ? (JsStatement) new JsBreakStatement(targetState.LoopLabelName) : new JsContinueStatement(targetState.LoopLabelName)); return(new JsBlockStatement(result, mergeWithParent: true)); }
public JsStatement VisitGotoStateStatement(JsGotoStateStatement stmt, object data) { return(stmt); }