2
0

ExecutionContext.cs 2.2 KB

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