ExecutionContext.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. namespace Jint.Runtime.Environments
  2. {
  3. public readonly struct ExecutionContext
  4. {
  5. public ExecutionContext(
  6. LexicalEnvironment lexicalEnvironment,
  7. LexicalEnvironment variableEnvironment)
  8. {
  9. LexicalEnvironment = lexicalEnvironment;
  10. VariableEnvironment = variableEnvironment;
  11. }
  12. public readonly LexicalEnvironment LexicalEnvironment;
  13. public readonly LexicalEnvironment VariableEnvironment;
  14. public ExecutionContext UpdateLexicalEnvironment(LexicalEnvironment lexicalEnvironment)
  15. {
  16. return new ExecutionContext(lexicalEnvironment, VariableEnvironment);
  17. }
  18. public ExecutionContext UpdateVariableEnvironment(LexicalEnvironment variableEnvironment)
  19. {
  20. return new ExecutionContext(LexicalEnvironment, variableEnvironment);
  21. }
  22. /// <summary>
  23. /// https://tc39.es/ecma262/#sec-getthisenvironment
  24. /// </summary>
  25. internal EnvironmentRecord GetThisEnvironment()
  26. {
  27. // The loop will always terminate because the list of environments always
  28. // ends with the global environment which has a this binding.
  29. var lex = LexicalEnvironment;
  30. while (true)
  31. {
  32. var envRec = lex._record;
  33. var exists = envRec.HasThisBinding();
  34. if (exists)
  35. {
  36. return envRec;
  37. }
  38. var outer = lex._outer;
  39. lex = outer;
  40. }
  41. }
  42. }
  43. }