PrivateEnvironment.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. JS_DEFINE_ALLOCATOR(PrivateEnvironment);
  9. PrivateEnvironment::PrivateEnvironment(PrivateEnvironment* parent)
  10. : m_outer_environment(parent)
  11. , m_unique_id(s_next_id++)
  12. {
  13. // FIXME: We might want to delay getting the next unique id until required.
  14. VERIFY(s_next_id != 0);
  15. }
  16. // Note: we start at one such that 0 can be invalid / default initialized.
  17. u64 PrivateEnvironment::s_next_id = 1u;
  18. PrivateName PrivateEnvironment::resolve_private_identifier(DeprecatedFlyString const& identifier) const
  19. {
  20. auto name_or_end = find_private_name(identifier);
  21. if (!name_or_end.is_end())
  22. return *name_or_end;
  23. // Note: This verify ensures that we must either have a private name with a matching description
  24. // or have an outer environment. Combined this means that we assert that we always return a PrivateName.
  25. VERIFY(m_outer_environment);
  26. return m_outer_environment->resolve_private_identifier(identifier);
  27. }
  28. void PrivateEnvironment::add_private_name(DeprecatedFlyString description)
  29. {
  30. if (!find_private_name(description).is_end())
  31. return;
  32. m_private_names.empend(m_unique_id, move(description));
  33. }
  34. bool PrivateName::operator==(PrivateName const& rhs) const
  35. {
  36. return unique_id == rhs.unique_id && description == rhs.description;
  37. }
  38. void PrivateEnvironment::visit_edges(Visitor& visitor)
  39. {
  40. Base::visit_edges(visitor);
  41. visitor.visit(m_outer_environment);
  42. }
  43. }