JintClassDeclarationStatement.cs 1.1 KB

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