PrimitiveString.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/CharacterTypes.h>
  7. #include <AK/Utf16View.h>
  8. #include <LibJS/Runtime/PrimitiveString.h>
  9. #include <LibJS/Runtime/VM.h>
  10. namespace JS {
  11. PrimitiveString::PrimitiveString(String string)
  12. : m_utf8_string(move(string))
  13. , m_has_utf8_string(true)
  14. {
  15. }
  16. PrimitiveString::PrimitiveString(Utf16String string)
  17. : m_utf16_string(move(string))
  18. , m_has_utf16_string(true)
  19. {
  20. }
  21. PrimitiveString::~PrimitiveString()
  22. {
  23. }
  24. String const& PrimitiveString::string() const
  25. {
  26. if (!m_has_utf8_string) {
  27. m_utf8_string = m_utf16_string.to_utf8();
  28. m_has_utf8_string = true;
  29. }
  30. return m_utf8_string;
  31. }
  32. Utf16String const& PrimitiveString::utf16_string() const
  33. {
  34. if (!m_has_utf16_string) {
  35. m_utf16_string = Utf16String(m_utf8_string);
  36. m_has_utf16_string = true;
  37. }
  38. return m_utf16_string;
  39. }
  40. Utf16View PrimitiveString::utf16_string_view() const
  41. {
  42. return utf16_string().view();
  43. }
  44. PrimitiveString* js_string(Heap& heap, Utf16View const& view)
  45. {
  46. return js_string(heap, Utf16String(view));
  47. }
  48. PrimitiveString* js_string(VM& vm, Utf16View const& view)
  49. {
  50. return js_string(vm.heap(), view);
  51. }
  52. PrimitiveString* js_string(Heap& heap, Utf16String string)
  53. {
  54. if (string.is_empty())
  55. return &heap.vm().empty_string();
  56. if (string.length_in_code_units() == 1) {
  57. u16 code_unit = string.code_unit_at(0);
  58. if (is_ascii(code_unit))
  59. return &heap.vm().single_ascii_character_string(static_cast<u8>(code_unit));
  60. }
  61. return heap.allocate_without_global_object<PrimitiveString>(move(string));
  62. }
  63. PrimitiveString* js_string(VM& vm, Utf16String string)
  64. {
  65. return js_string(vm.heap(), move(string));
  66. }
  67. PrimitiveString* js_string(Heap& heap, String string)
  68. {
  69. if (string.is_empty())
  70. return &heap.vm().empty_string();
  71. if (string.length() == 1) {
  72. auto ch = static_cast<u8>(string.characters()[0]);
  73. if (is_ascii(ch))
  74. return &heap.vm().single_ascii_character_string(ch);
  75. }
  76. return heap.allocate_without_global_object<PrimitiveString>(move(string));
  77. }
  78. PrimitiveString* js_string(VM& vm, String string)
  79. {
  80. return js_string(vm.heap(), move(string));
  81. }
  82. }