LexicalEnvironment.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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 Reference GetIdentifierReference(string name, bool strict)
  29. {
  30. if (Record.HasBinding(name))
  31. {
  32. return new Reference(Record, name, strict);
  33. }
  34. if (Outer == null)
  35. {
  36. return new Reference(Undefined.Instance, name, strict);
  37. }
  38. return Outer.GetIdentifierReference(name, strict);
  39. }
  40. public static LexicalEnvironment NewDeclarativeEnvironment(LexicalEnvironment outer = null)
  41. {
  42. return new LexicalEnvironment(new DeclarativeEnvironmentRecord(), outer);
  43. }
  44. public static LexicalEnvironment NewObjectEnvironment(ObjectInstance objectInstance, LexicalEnvironment outer)
  45. {
  46. return new LexicalEnvironment(new ObjectEnvironmentRecord(objectInstance), outer);
  47. }
  48. }
  49. }