public Completion ExecuteStatementList(IEnumerable<Statement> statementList) { var c = new Completion(Completion.Normal, null, null); Completion sl = c; try { foreach (var statement in statementList) { c = ExecuteStatement(statement); if (c.Type != Completion.Normal) { return new Completion(c.Type, c.Value.HasValue ? c.Value : sl.Value, c.Identifier); } sl = c; } } catch(JavaScriptException v) { return new Completion(Completion.Throw, v.Error, null); } return new Completion(c.Type, c.GetValueOrDefault(), c.Identifier); }
/// <summary> /// http://www.ecma-international.org/ecma-262/5.1/#sec-12.10 /// </summary> /// <param name="withStatement"></param> /// <returns></returns> public Completion ExecuteWithStatement(WithStatement withStatement) { var val = _engine.EvaluateExpression(withStatement.Object); var obj = TypeConverter.ToObject(_engine, _engine.GetValue(val)); var oldEnv = _engine.ExecutionContext.LexicalEnvironment; var newEnv = LexicalEnvironment.NewObjectEnvironment(_engine, obj, oldEnv, true); _engine.ExecutionContext.LexicalEnvironment = newEnv; Completion c; try { c = ExecuteStatement(withStatement.Body); } catch (JavaScriptException e) { c = new Completion(Completion.Throw, e.Error, null); } finally { _engine.ExecutionContext.LexicalEnvironment = oldEnv; } return c; }