Serenity Operating System
at master 73 lines 2.5 kB view raw
1/* 2 * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> 3 * Copyright (c) 2022, Linus Groh <linusg@serenityos.org> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#pragma once 9 10#include <AK/DeprecatedString.h> 11#include <AK/Optional.h> 12#include <AK/String.h> 13#include <AK/StringView.h> 14#include <LibJS/Forward.h> 15#include <LibJS/Heap/Cell.h> 16#include <LibJS/Runtime/Completion.h> 17#include <LibJS/Runtime/Utf16String.h> 18#include <LibJS/Runtime/Value.h> 19 20namespace JS { 21 22class PrimitiveString final : public Cell { 23 JS_CELL(PrimitiveString, Cell); 24 25public: 26 [[nodiscard]] static NonnullGCPtr<PrimitiveString> create(VM&, Utf16String); 27 [[nodiscard]] static NonnullGCPtr<PrimitiveString> create(VM&, String); 28 [[nodiscard]] static NonnullGCPtr<PrimitiveString> create(VM&, DeprecatedString); 29 [[nodiscard]] static NonnullGCPtr<PrimitiveString> create(VM&, DeprecatedFlyString const&); 30 [[nodiscard]] static NonnullGCPtr<PrimitiveString> create(VM&, PrimitiveString&, PrimitiveString&); 31 static ThrowCompletionOr<NonnullGCPtr<PrimitiveString>> create(VM&, StringView); 32 33 virtual ~PrimitiveString(); 34 35 PrimitiveString(PrimitiveString const&) = delete; 36 PrimitiveString& operator=(PrimitiveString const&) = delete; 37 38 bool is_empty() const; 39 40 ThrowCompletionOr<String> utf8_string() const; 41 ThrowCompletionOr<StringView> utf8_string_view() const; 42 bool has_utf8_string() const { return m_utf8_string.has_value(); } 43 44 ThrowCompletionOr<DeprecatedString> deprecated_string() const; 45 bool has_deprecated_string() const { return m_deprecated_string.has_value(); } 46 47 ThrowCompletionOr<Utf16String> utf16_string() const; 48 ThrowCompletionOr<Utf16View> utf16_string_view() const; 49 bool has_utf16_string() const { return m_utf16_string.has_value(); } 50 51 ThrowCompletionOr<Optional<Value>> get(VM&, PropertyKey const&) const; 52 53private: 54 explicit PrimitiveString(PrimitiveString&, PrimitiveString&); 55 explicit PrimitiveString(String); 56 explicit PrimitiveString(DeprecatedString); 57 explicit PrimitiveString(Utf16String); 58 59 virtual void visit_edges(Cell::Visitor&) override; 60 61 ThrowCompletionOr<void> resolve_rope_if_needed() const; 62 63 mutable bool m_is_rope { false }; 64 65 mutable PrimitiveString* m_lhs { nullptr }; 66 mutable PrimitiveString* m_rhs { nullptr }; 67 68 mutable Optional<String> m_utf8_string; 69 mutable Optional<DeprecatedString> m_deprecated_string; 70 mutable Optional<Utf16String> m_utf16_string; 71}; 72 73}