JintBlockStatement.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using System.Collections.Generic;
  2. using Esprima.Ast;
  3. using Jint.Runtime.Environments;
  4. namespace Jint.Runtime.Interpreter.Statements
  5. {
  6. internal sealed class JintBlockStatement : JintStatement<BlockStatement>
  7. {
  8. private JintStatementList _statementList;
  9. private List<Declaration> _lexicalDeclarations;
  10. public JintBlockStatement(Engine engine, BlockStatement blockStatement) : base(engine, blockStatement)
  11. {
  12. _initialized = false;
  13. }
  14. protected override void Initialize()
  15. {
  16. _statementList = new JintStatementList(_engine, _statement, _statement.Body);
  17. _lexicalDeclarations = HoistingScope.GetLexicalDeclarations(_statement);
  18. }
  19. // http://www.ecma-international.org/ecma-262/6.0/#sec-blockdeclarationinstantiation
  20. protected override Completion ExecuteInternal()
  21. {
  22. EnvironmentRecord oldEnv = null;
  23. if (_lexicalDeclarations != null)
  24. {
  25. oldEnv = _engine.ExecutionContext.LexicalEnvironment;
  26. var blockEnv = JintEnvironment.NewDeclarativeEnvironment(_engine, _engine.ExecutionContext.LexicalEnvironment);
  27. JintStatementList.BlockDeclarationInstantiation(_engine, blockEnv, _lexicalDeclarations);
  28. _engine.UpdateLexicalEnvironment(blockEnv);
  29. }
  30. var blockValue = _statementList.Execute();
  31. if (oldEnv is not null)
  32. {
  33. _engine.UpdateLexicalEnvironment(oldEnv);
  34. }
  35. return blockValue;
  36. }
  37. }
  38. }