JintClassDeclarationStatement.cs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. using Esprima.Ast;
  2. using Jint.Native;
  3. using Jint.Native.Function;
  4. namespace Jint.Runtime.Interpreter.Statements
  5. {
  6. internal sealed class JintClassDeclarationStatement : JintStatement<ClassDeclaration>
  7. {
  8. private readonly ClassDefinition _classDefinition;
  9. public JintClassDeclarationStatement(ClassDeclaration classDeclaration) : base(classDeclaration)
  10. {
  11. _classDefinition = new ClassDefinition(className: classDeclaration.Id?.Name, classDeclaration.SuperClass, classDeclaration.Body);
  12. }
  13. protected override Completion ExecuteInternal(EvaluationContext context)
  14. {
  15. var engine = context.Engine;
  16. var env = engine.ExecutionContext.LexicalEnvironment;
  17. var value = _classDefinition.BuildConstructor(context, env);
  18. if (context.IsAbrupt())
  19. {
  20. return new Completion(context.Completion, value, _statement);
  21. }
  22. var classBinding = _classDefinition._className;
  23. if (classBinding != null)
  24. {
  25. env.InitializeBinding(classBinding, value);
  26. }
  27. return new Completion(CompletionType.Normal, JsEmpty.Instance, _statement);
  28. }
  29. }
  30. }