/// <summary> /// http://www.ecma-international.org/ecma-262/5.1/#sec-12.6.1 /// </summary> /// <param name="doWhileStatement"></param> /// <returns></returns> public Completion ExecuteDoWhileStatement(DoWhileStatement doWhileStatement) { JsValue v = Undefined.Instance; bool iterating; do { var stmt = ExecuteStatement(doWhileStatement.Body); if (stmt.Value != null) { v = stmt.Value; } if (stmt.Type != Completion.Continue || stmt.Identifier != doWhileStatement.LabelSet) { if (stmt.Type == Completion.Break && (stmt.Identifier == null || stmt.Identifier == doWhileStatement.LabelSet)) { return new Completion(Completion.Normal, v, null); } if (stmt.Type != Completion.Normal) { return stmt; } } var exprRef = _engine.EvaluateExpression(doWhileStatement.Test); iterating = TypeConverter.ToBoolean(_engine.GetValue(exprRef)); } while (iterating); return new Completion(Completion.Normal, v, null); }
private void EmitDoWhileStatement(DoWhileStatement s) { Write("do "); Emit(s.Body); Write("while("); Emit(s.Test); Write(");"); }