JintMetaPropertyExpression.cs 1.8 KB

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