JintMetaPropertyExpression.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using Esprima.Ast;
  2. using Jint.Runtime.Modules;
  3. namespace Jint.Runtime.Interpreter.Expressions
  4. {
  5. internal sealed class JintMetaPropertyExpression : JintExpression
  6. {
  7. public JintMetaPropertyExpression(MetaProperty expression) : base(expression)
  8. {
  9. }
  10. /// <summary>
  11. /// https://tc39.es/ecma262/#sec-meta-properties
  12. /// </summary>
  13. protected override object EvaluateInternal(EvaluationContext context)
  14. {
  15. var expression = (MetaProperty) _expression;
  16. if (string.Equals(expression.Meta.Name, "new", StringComparison.Ordinal) && string.Equals(expression.Property.Name, "target", StringComparison.Ordinal))
  17. {
  18. return context.Engine.GetNewTarget();
  19. }
  20. if (string.Equals(expression.Meta.Name, "import", StringComparison.Ordinal) && string.Equals(expression.Property.Name, "meta", StringComparison.Ordinal))
  21. {
  22. var module = (SourceTextModule) context.Engine.ExecutionContext.ScriptOrModule!;
  23. var importMeta = module.ImportMeta;
  24. if (importMeta is null)
  25. {
  26. importMeta = context.Engine.Realm.Intrinsics.Object.Construct(0);
  27. var importMetaValues = context.Engine._host.GetImportMetaProperties(module);
  28. foreach (var p in importMetaValues)
  29. {
  30. importMeta.CreateDataPropertyOrThrow(p.Key, p.Value);
  31. }
  32. context.Engine._host.FinalizeImportMeta(importMeta, module);
  33. module.ImportMeta = importMeta;
  34. }
  35. return importMeta;
  36. }
  37. ExceptionHelper.ThrowNotImplementedException();
  38. return default;
  39. }
  40. }
  41. }