PrimitiveString.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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(Vector<u16> 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 = utf16_string_view().to_utf8(Utf16View::AllowInvalidCodeUnits::Yes);
  28. m_has_utf8_string = true;
  29. }
  30. return m_utf8_string;
  31. }
  32. Vector<u16> const& PrimitiveString::utf16_string() const
  33. {
  34. if (!m_has_utf16_string) {
  35. m_utf16_string = AK::utf8_to_utf16(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 Utf16View { utf16_string() };
  43. }
  44. PrimitiveString* js_string(Heap& heap, Utf16View const& view)
  45. {
  46. if (view.is_empty())
  47. return &heap.vm().empty_string();
  48. if (view.length_in_code_units() == 1) {
  49. u16 code_unit = view.code_unit_at(0);
  50. if (is_ascii(code_unit))
  51. return &heap.vm().single_ascii_character_string(static_cast<u8>(code_unit));
  52. }
  53. Vector<u16> string;
  54. string.ensure_capacity(view.length_in_code_units());
  55. string.append(view.data(), view.length_in_code_units());
  56. return js_string(heap, move(string));
  57. }
  58. PrimitiveString* js_string(VM& vm, Utf16View const& view)
  59. {
  60. return js_string(vm.heap(), view);
  61. }
  62. PrimitiveString* js_string(Heap& heap, Vector<u16> string)
  63. {
  64. if (string.is_empty())
  65. return &heap.vm().empty_string();
  66. if (string.size() == 1) {
  67. u16 code_unit = string.at(0);
  68. if (is_ascii(code_unit))
  69. return &heap.vm().single_ascii_character_string(static_cast<u8>(code_unit));
  70. }
  71. return heap.allocate_without_global_object<PrimitiveString>(move(string));
  72. }
  73. PrimitiveString* js_string(VM& vm, Vector<u16> string)
  74. {
  75. return js_string(vm.heap(), move(string));
  76. }
  77. PrimitiveString* js_string(Heap& heap, String string)
  78. {
  79. if (string.is_empty())
  80. return &heap.vm().empty_string();
  81. if (string.length() == 1) {
  82. auto ch = static_cast<u8>(string.characters()[0]);
  83. if (is_ascii(ch))
  84. return &heap.vm().single_ascii_character_string(ch);
  85. }
  86. return heap.allocate_without_global_object<PrimitiveString>(move(string));
  87. }
  88. PrimitiveString* js_string(VM& vm, String string)
  89. {
  90. return js_string(vm.heap(), move(string));
  91. }
  92. }