LexicalEnvironment.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using Jint.Native;
  2. using Jint.Native.Object;
  3. using Jint.Runtime.References;
  4. namespace Jint.Runtime.Environments
  5. {
  6. /// <summary>
  7. /// Represents a Liexical Environment (a.k.a Scope)
  8. /// http://www.ecma-international.org/ecma-262/5.1/#sec-10.2
  9. /// http://www.ecma-international.org/ecma-262/5.1/#sec-10.2.2
  10. /// </summary>
  11. public sealed class LexicalEnvironment
  12. {
  13. private readonly EnvironmentRecord _record;
  14. private readonly LexicalEnvironment _outer;
  15. public LexicalEnvironment(EnvironmentRecord record, LexicalEnvironment outer)
  16. {
  17. _record = record;
  18. _outer = outer;
  19. }
  20. public EnvironmentRecord Record
  21. {
  22. get { return _record; }
  23. }
  24. public LexicalEnvironment Outer
  25. {
  26. get { return _outer; }
  27. }
  28. public static Reference GetIdentifierReference(LexicalEnvironment lex, string name, bool strict)
  29. {
  30. if (lex == null)
  31. {
  32. return new Reference(Undefined.Instance, name, strict);
  33. }
  34. if (lex.Record.HasBinding(name))
  35. {
  36. return new Reference(lex.Record, name, strict);
  37. }
  38. if (lex.Outer == null)
  39. {
  40. return new Reference(Undefined.Instance, name, strict);
  41. }
  42. return GetIdentifierReference(lex.Outer, name, strict);
  43. }
  44. public static LexicalEnvironment NewDeclarativeEnvironment(Engine engine, LexicalEnvironment outer = null)
  45. {
  46. return new LexicalEnvironment(new DeclarativeEnvironmentRecord(engine), outer);
  47. }
  48. public static LexicalEnvironment NewObjectEnvironment(Engine engine, ObjectInstance objectInstance, LexicalEnvironment outer, bool provideThis)
  49. {
  50. return new LexicalEnvironment(new ObjectEnvironmentRecord(engine, objectInstance, provideThis), outer);
  51. }
  52. }
  53. }