JintWithStatement.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using Jint.Runtime.Environments;
  2. using Jint.Runtime.Interpreter.Expressions;
  3. namespace Jint.Runtime.Interpreter.Statements;
  4. /// <summary>
  5. /// http://www.ecma-international.org/ecma-262/5.1/#sec-12.10
  6. /// </summary>
  7. internal sealed class JintWithStatement : JintStatement<WithStatement>
  8. {
  9. private ProbablyBlockStatement _body;
  10. private JintExpression _object = null!;
  11. public JintWithStatement(WithStatement statement) : base(statement)
  12. {
  13. }
  14. protected override void Initialize(EvaluationContext context)
  15. {
  16. _body = new ProbablyBlockStatement(_statement.Body);
  17. _object = JintExpression.Build(_statement.Object);
  18. }
  19. protected override Completion ExecuteInternal(EvaluationContext context)
  20. {
  21. var jsValue = _object.GetValue(context);
  22. var engine = context.Engine;
  23. var obj = TypeConverter.ToObject(engine.Realm, jsValue);
  24. var oldEnv = engine.ExecutionContext.LexicalEnvironment;
  25. var newEnv = JintEnvironment.NewObjectEnvironment(engine, obj, oldEnv, provideThis: true, withEnvironment: true);
  26. engine.UpdateLexicalEnvironment(newEnv);
  27. Completion c;
  28. try
  29. {
  30. c = _body.Execute(context);
  31. }
  32. catch (JavaScriptException e)
  33. {
  34. c = new Completion(CompletionType.Throw, e.Error, _statement);
  35. }
  36. finally
  37. {
  38. engine.UpdateLexicalEnvironment(oldEnv);
  39. }
  40. return c;
  41. }
  42. }