/// <summary> /// http://www.ecma-international.org/ecma-262/5.1/#sec-12.6.3 /// </summary> /// <param name="forStatement"></param> /// <returns></returns> public Completion ExecuteForStatement(ForStatement forStatement) { if (forStatement.Init != null) { if (forStatement.Init.Type == SyntaxNodes.VariableDeclaration) { ExecuteStatement(forStatement.Init.As<Statement>()); } else { _engine.GetValue(_engine.EvaluateExpression(forStatement.Init.As<Expression>())); } } JsValue v = Undefined.Instance; while (true) { if (forStatement.Test != null) { var testExprRef = _engine.EvaluateExpression(forStatement.Test); if (!TypeConverter.ToBoolean(_engine.GetValue(testExprRef))) { return new Completion(Completion.Normal, v, null); } } var stmt = ExecuteStatement(forStatement.Body); if (stmt.Value != null) { v = stmt.Value; } if (stmt.Type == Completion.Break && (stmt.Identifier == null || stmt.Identifier == forStatement.LabelSet)) { return new Completion(Completion.Normal, v, null); } if (stmt.Type != Completion.Continue || ((stmt.Identifier != null) && stmt.Identifier != forStatement.LabelSet)) { if (stmt.Type != Completion.Normal) { return stmt; } } if (forStatement.Update != null) { var incExprRef = _engine.EvaluateExpression(forStatement.Update); _engine.GetValue(incExprRef); } } }
private void EmitForStatement(ForStatement s) { _noeolstmt = true; Write("for("); Emit(s.Init); if (!(s.Init is Statement)) { Write("; "); } else Write(" "); Emit(s.Test); Write("; "); Emit(s.Update); Write(")"); _noeolstmt = false; Emit(s.Body); }