JintEnvironment.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #nullable enable
  2. using Jint.Native;
  3. using Jint.Native.Function;
  4. using Jint.Native.Object;
  5. namespace Jint.Runtime.Environments
  6. {
  7. internal static class JintEnvironment
  8. {
  9. internal static bool TryGetIdentifierEnvironmentWithBindingValue(
  10. Engine engine,
  11. EnvironmentRecord? lex,
  12. in EnvironmentRecord.BindingName name,
  13. bool strict,
  14. out EnvironmentRecord? record,
  15. out JsValue? value)
  16. {
  17. record = default;
  18. value = default;
  19. if (ReferenceEquals(lex, engine.Realm.GlobalEnv)
  20. && lex.TryGetBinding(name, strict, out _, out value))
  21. {
  22. record = lex;
  23. return true;
  24. }
  25. while (!ReferenceEquals(lex, null))
  26. {
  27. if (lex.TryGetBinding(
  28. name,
  29. strict,
  30. out _,
  31. out value))
  32. {
  33. record = lex;
  34. return true;
  35. }
  36. lex = lex._outerEnv;
  37. }
  38. return false;
  39. }
  40. /// <summary>
  41. /// https://tc39.es/ecma262/#sec-newdeclarativeenvironment
  42. /// </summary>
  43. internal static DeclarativeEnvironmentRecord NewDeclarativeEnvironment(Engine engine, EnvironmentRecord outer, bool catchEnvironment = false)
  44. {
  45. return new DeclarativeEnvironmentRecord(engine, catchEnvironment)
  46. {
  47. _outerEnv = outer
  48. };
  49. }
  50. /// <summary>
  51. /// https://tc39.es/ecma262/#sec-newfunctionenvironment
  52. /// </summary>
  53. internal static FunctionEnvironmentRecord NewFunctionEnvironment(Engine engine, FunctionInstance f, JsValue newTarget)
  54. {
  55. return new FunctionEnvironmentRecord(engine, f, newTarget)
  56. {
  57. _outerEnv = f._environment
  58. };
  59. }
  60. /// <summary>
  61. /// https://tc39.es/ecma262/#sec-newglobalenvironment
  62. /// </summary>
  63. internal static GlobalEnvironmentRecord NewGlobalEnvironment(Engine engine, ObjectInstance objectInstance, JsValue thisValue)
  64. {
  65. return new GlobalEnvironmentRecord(engine, objectInstance)
  66. {
  67. _outerEnv = null
  68. };
  69. }
  70. /// <summary>
  71. /// https://tc39.es/ecma262/#sec-newobjectenvironment
  72. /// </summary>
  73. internal static ObjectEnvironmentRecord NewObjectEnvironment(Engine engine, ObjectInstance objectInstance, EnvironmentRecord outer, bool provideThis, bool withEnvironment = false)
  74. {
  75. return new ObjectEnvironmentRecord(engine, objectInstance, provideThis, withEnvironment)
  76. {
  77. _outerEnv = outer
  78. };
  79. }
  80. /// <summary>
  81. /// https://tc39.es/ecma262/#sec-newprivateenvironment
  82. /// </summary>
  83. internal static PrivateEnvironmentRecord NewPrivateEnvironment(Engine engine, PrivateEnvironmentRecord outerPriv)
  84. {
  85. return new PrivateEnvironmentRecord(outerPriv);
  86. }
  87. }
  88. }