JintEnvironment.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. bool strict,
  32. [NotNullWhen(true)] out Environment? record,
  33. [NotNullWhen(true)] out JsValue? value)
  34. {
  35. record = env;
  36. value = default;
  37. if (env._outerEnv is null)
  38. {
  39. return ((GlobalEnvironment) env).TryGetBinding(name, strict, out value);
  40. }
  41. while (record is not null)
  42. {
  43. if (record.TryGetBinding(name, strict, out value))
  44. {
  45. return true;
  46. }
  47. record = record._outerEnv;
  48. }
  49. return false;
  50. }
  51. /// <summary>
  52. /// https://tc39.es/ecma262/#sec-newdeclarativeenvironment
  53. /// </summary>
  54. internal static DeclarativeEnvironment NewDeclarativeEnvironment(Engine engine, Environment? outer, bool catchEnvironment = false)
  55. {
  56. return new DeclarativeEnvironment(engine, catchEnvironment)
  57. {
  58. _outerEnv = outer
  59. };
  60. }
  61. /// <summary>
  62. /// https://tc39.es/ecma262/#sec-newfunctionenvironment
  63. /// </summary>
  64. internal static FunctionEnvironment NewFunctionEnvironment(Engine engine, Function f, JsValue newTarget)
  65. {
  66. return new FunctionEnvironment(engine, f, newTarget)
  67. {
  68. _outerEnv = f._environment
  69. };
  70. }
  71. /// <summary>
  72. /// https://tc39.es/ecma262/#sec-newglobalenvironment
  73. /// </summary>
  74. internal static GlobalEnvironment NewGlobalEnvironment(Engine engine, ObjectInstance objectInstance, JsValue thisValue)
  75. {
  76. return new GlobalEnvironment(engine, objectInstance)
  77. {
  78. _outerEnv = null
  79. };
  80. }
  81. /// <summary>
  82. /// https://tc39.es/ecma262/#sec-newobjectenvironment
  83. /// </summary>
  84. internal static ObjectEnvironment NewObjectEnvironment(Engine engine, ObjectInstance objectInstance, Environment outer, bool provideThis, bool withEnvironment = false)
  85. {
  86. return new ObjectEnvironment(engine, objectInstance, provideThis, withEnvironment)
  87. {
  88. _outerEnv = outer
  89. };
  90. }
  91. /// <summary>
  92. /// https://tc39.es/ecma262/#sec-newprivateenvironment
  93. /// </summary>
  94. internal static PrivateEnvironment NewPrivateEnvironment(Engine engine, PrivateEnvironment? outerPriv)
  95. {
  96. return new PrivateEnvironment(outerPriv);
  97. }
  98. /// <summary>
  99. /// https://tc39.es/ecma262/#sec-newmoduleenvironment
  100. /// </summary>
  101. internal static ModuleEnvironment NewModuleEnvironment(Engine engine, Environment outer)
  102. {
  103. return new ModuleEnvironment(engine)
  104. {
  105. _outerEnv = outer
  106. };
  107. }
  108. }