JintMetaPropertyExpression.cs 1.6 KB

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