2
0

ExecutionContext.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Jint.Native.Function;
  2. #nullable enable
  3. namespace Jint.Runtime.Environments
  4. {
  5. internal readonly struct ExecutionContext
  6. {
  7. internal ExecutionContext(
  8. EnvironmentRecord lexicalEnvironment,
  9. EnvironmentRecord variableEnvironment,
  10. PrivateEnvironmentRecord? privateEnvironment,
  11. Realm realm,
  12. FunctionInstance? function = null)
  13. {
  14. LexicalEnvironment = lexicalEnvironment;
  15. VariableEnvironment = variableEnvironment;
  16. PrivateEnvironment = privateEnvironment;
  17. Realm = realm;
  18. Function = function;
  19. }
  20. public readonly EnvironmentRecord LexicalEnvironment;
  21. public readonly EnvironmentRecord VariableEnvironment;
  22. public readonly PrivateEnvironmentRecord? PrivateEnvironment;
  23. public readonly Realm Realm;
  24. public readonly FunctionInstance? Function;
  25. public ExecutionContext UpdateLexicalEnvironment(EnvironmentRecord lexicalEnvironment)
  26. {
  27. return new ExecutionContext(lexicalEnvironment, VariableEnvironment, PrivateEnvironment, Realm, Function);
  28. }
  29. public ExecutionContext UpdateVariableEnvironment(EnvironmentRecord variableEnvironment)
  30. {
  31. return new ExecutionContext(LexicalEnvironment, variableEnvironment, PrivateEnvironment, Realm, Function);
  32. }
  33. /// <summary>
  34. /// https://tc39.es/ecma262/#sec-getthisenvironment
  35. /// </summary>
  36. internal EnvironmentRecord GetThisEnvironment()
  37. {
  38. // The loop will always terminate because the list of environments always
  39. // ends with the global environment which has a this binding.
  40. var lex = LexicalEnvironment;
  41. while (true)
  42. {
  43. if (lex != null)
  44. {
  45. if (lex.HasThisBinding())
  46. {
  47. return lex;
  48. }
  49. lex = lex._outerEnv;
  50. }
  51. }
  52. }
  53. }
  54. }