using Esprima.Ast;
using Jint.Runtime.Environments;
using Jint.Runtime.Interpreter.Expressions;
namespace Jint.Runtime.Interpreter.Statements
{
///
/// http://www.ecma-international.org/ecma-262/5.1/#sec-12.10
///
internal sealed class JintWithStatement : JintStatement
{
private readonly JintStatement _body;
private readonly JintExpression _object;
public JintWithStatement(Engine engine, WithStatement statement) : base(engine, statement)
{
_body = Build(engine, statement.Body);
_object = JintExpression.Build(engine, _statement.Object);
}
protected override Completion ExecuteInternal()
{
var jsValue = _object.GetValue();
var obj = TypeConverter.ToObject(_engine, jsValue);
var oldEnv = _engine.ExecutionContext.LexicalEnvironment;
var newEnv = LexicalEnvironment.NewObjectEnvironment(_engine, obj, oldEnv, provideThis: true, withEnvironment: true);
_engine.UpdateLexicalEnvironment(newEnv);
Completion c;
try
{
c = _body.Execute();
}
catch (JavaScriptException e)
{
c = new Completion(CompletionType.Throw, e.Error, null, _statement.Location);
}
finally
{
_engine.UpdateLexicalEnvironment(oldEnv);
}
return c;
}
}
}