JintEnvironment.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using System.Diagnostics.CodeAnalysis;
  2. using Jint.Native;
  3. using Jint.Native.Function;
  4. using Jint.Native.Object;
  5. namespace Jint.Runtime.Environments;
  6. internal static class JintEnvironment
  7. {
  8. internal static bool TryGetIdentifierEnvironmentWithBinding(
  9. Environment env,
  10. Environment.BindingName name,
  11. [NotNullWhen(true)] out Environment? record)
  12. {
  13. record = env;
  14. if (env._outerEnv is null)
  15. {
  16. return env.HasBinding(name);
  17. }
  18. while (record is not null)
  19. {
  20. if (record.HasBinding(name))
  21. {
  22. return true;
  23. }
  24. record = record._outerEnv;
  25. }
  26. return false;
  27. }
  28. internal static bool TryGetIdentifierEnvironmentWithBindingValue(
  29. Environment env,
  30. Environment.BindingName name,
  31. [NotNullWhen(true)] out Environment? record,
  32. [NotNullWhen(true)] out JsValue? value)
  33. {
  34. record = env;
  35. value = default;
  36. if (env._outerEnv is null)
  37. {
  38. return ((GlobalEnvironment) env).TryGetBinding(name, out value);
  39. }
  40. while (record is not null)
  41. {
  42. if (record.TryGetBinding(name, out value))
  43. {
  44. return true;
  45. }
  46. record = record._outerEnv;
  47. }
  48. return false;
  49. }
  50. /// <summary>
  51. /// https://tc39.es/ecma262/#sec-newdeclarativeenvironment
  52. /// </summary>
  53. internal static DeclarativeEnvironment NewDeclarativeEnvironment(Engine engine, Environment? outer, bool catchEnvironment = false)
  54. {
  55. return new DeclarativeEnvironment(engine, catchEnvironment)
  56. {
  57. _outerEnv = outer
  58. };
  59. }
  60. /// <summary>
  61. /// https://tc39.es/ecma262/#sec-newfunctionenvironment
  62. /// </summary>
  63. internal static FunctionEnvironment NewFunctionEnvironment(Engine engine, Function f, JsValue newTarget)
  64. {
  65. return new FunctionEnvironment(engine, f, newTarget)
  66. {
  67. _outerEnv = f._environment
  68. };
  69. }
  70. /// <summary>
  71. /// https://tc39.es/ecma262/#sec-newglobalenvironment
  72. /// </summary>
  73. internal static GlobalEnvironment NewGlobalEnvironment(Engine engine, ObjectInstance objectInstance, JsValue thisValue)
  74. {
  75. return new GlobalEnvironment(engine, objectInstance)
  76. {
  77. _outerEnv = null
  78. };
  79. }
  80. /// <summary>
  81. /// https://tc39.es/ecma262/#sec-newobjectenvironment
  82. /// </summary>
  83. internal static ObjectEnvironment NewObjectEnvironment(Engine engine, ObjectInstance objectInstance, Environment outer, bool provideThis, bool withEnvironment = false)
  84. {
  85. return new ObjectEnvironment(engine, objectInstance, provideThis, withEnvironment)
  86. {
  87. _outerEnv = outer
  88. };
  89. }
  90. /// <summary>
  91. /// https://tc39.es/ecma262/#sec-newprivateenvironment
  92. /// </summary>
  93. internal static PrivateEnvironment NewPrivateEnvironment(Engine engine, PrivateEnvironment? outerPriv)
  94. {
  95. return new PrivateEnvironment(outerPriv);
  96. }
  97. /// <summary>
  98. /// https://tc39.es/ecma262/#sec-newmoduleenvironment
  99. /// </summary>
  100. internal static ModuleEnvironment NewModuleEnvironment(Engine engine, Environment outer)
  101. {
  102. return new ModuleEnvironment(engine)
  103. {
  104. _outerEnv = outer
  105. };
  106. }
  107. }