PrivateEnvironment.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * Copyright (c) 2021, David Tuin <davidot@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibJS/Runtime/PrivateEnvironment.h>
  7. namespace JS {
  8. PrivateEnvironment::PrivateEnvironment(PrivateEnvironment* parent)
  9. : m_outer_environment(parent)
  10. , m_unique_id(s_next_id++)
  11. {
  12. // FIXME: We might want to delay getting the next unique id until required.
  13. VERIFY(s_next_id != 0);
  14. }
  15. // Note: we start at one such that 0 can be invalid / default initialized.
  16. u64 PrivateEnvironment::s_next_id = 1u;
  17. PrivateName PrivateEnvironment::resolve_private_identifier(FlyString const& identifier) const
  18. {
  19. auto name_or_end = find_private_name(identifier);
  20. if (!name_or_end.is_end())
  21. return *name_or_end;
  22. // Note: This verify ensures that we must either have a private name with a matching description
  23. // or have an outer environment. Combined this means that we assert that we always return a PrivateName.
  24. VERIFY(m_outer_environment);
  25. return m_outer_environment->resolve_private_identifier(identifier);
  26. }
  27. void PrivateEnvironment::add_private_name(Badge<ClassExpression>, FlyString description)
  28. {
  29. if (!find_private_name(description).is_end())
  30. return;
  31. m_private_names.empend(m_unique_id, move(description));
  32. }
  33. bool PrivateName::operator==(PrivateName const& rhs) const
  34. {
  35. return unique_id == rhs.unique_id && description == rhs.description;
  36. }
  37. }