JintExportDefaultDeclaration.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using Esprima.Ast;
  2. using Jint.Native;
  3. using Jint.Native.Function;
  4. using Jint.Native.Object;
  5. using Jint.Runtime.Environments;
  6. using Jint.Runtime.Interpreter.Expressions;
  7. namespace Jint.Runtime.Interpreter.Statements;
  8. internal sealed class JintExportDefaultDeclaration : JintStatement<ExportDefaultDeclaration>
  9. {
  10. private ClassDefinition? _classDefinition;
  11. private JintFunctionDeclarationStatement? _functionDeclaration;
  12. private JintExpression? _assignmentExpression;
  13. private JintExpression? _simpleExpression;
  14. public JintExportDefaultDeclaration(ExportDefaultDeclaration statement) : base(statement)
  15. {
  16. }
  17. protected override void Initialize(EvaluationContext context)
  18. {
  19. if (_statement.Declaration is ClassDeclaration classDeclaration)
  20. {
  21. _classDefinition = new ClassDefinition(className: classDeclaration.Id?.Name, classDeclaration.SuperClass, classDeclaration.Body);
  22. }
  23. else if (_statement.Declaration is FunctionDeclaration functionDeclaration)
  24. {
  25. _functionDeclaration = new JintFunctionDeclarationStatement(functionDeclaration);
  26. }
  27. else if (_statement.Declaration is AssignmentExpression assignmentExpression)
  28. {
  29. _assignmentExpression = JintAssignmentExpression.Build(context.Engine, assignmentExpression);
  30. }
  31. else
  32. {
  33. _simpleExpression = JintExpression.Build(context.Engine, (Expression) _statement.Declaration);
  34. }
  35. }
  36. /// <summary>
  37. /// https://tc39.es/ecma262/#sec-exports-runtime-semantics-evaluation
  38. /// </summary>
  39. protected override Completion ExecuteInternal(EvaluationContext context)
  40. {
  41. var env = context.Engine.ExecutionContext.LexicalEnvironment;
  42. JsValue value;
  43. if (_classDefinition is not null)
  44. {
  45. value = _classDefinition.BuildConstructor(context, env);
  46. var classBinding = _classDefinition._className;
  47. if (classBinding != null)
  48. {
  49. env.CreateMutableBinding(classBinding);
  50. env.InitializeBinding(classBinding, value);
  51. }
  52. }
  53. else if (_functionDeclaration is not null)
  54. {
  55. value = _functionDeclaration.Execute(context).GetValueOrDefault();
  56. }
  57. else if (_assignmentExpression is not null)
  58. {
  59. value = _assignmentExpression.GetValue(context);
  60. }
  61. else
  62. {
  63. value = _simpleExpression!.GetValue(context);
  64. }
  65. if (value is ObjectInstance oi && !oi.HasOwnProperty("name"))
  66. {
  67. oi.SetFunctionName("default");
  68. }
  69. env.InitializeBinding("*default*", value);
  70. return Completion.Empty();
  71. }
  72. /// <summary>
  73. /// https://tc39.es/ecma262/#sec-initializeboundname
  74. /// </summary>
  75. private void InitializeBoundName(string name, JsValue value, EnvironmentRecord? environment)
  76. {
  77. if (environment is not null)
  78. {
  79. environment.InitializeBinding(name, value);
  80. }
  81. else
  82. {
  83. ExceptionHelper.ThrowNotImplementedException();
  84. }
  85. }
  86. }