Line data Source code
1 : // Copyright 2018 the V8 project authors. All rights reserved.
2 : // Use of this source code is governed by a BSD-style license that can be
3 : // found in the LICENSE file.
4 :
5 : #ifndef V8_STRING_CONSTANTS_H_
6 : #define V8_STRING_CONSTANTS_H_
7 :
8 : #include "src/handles.h"
9 : #include "src/objects/string.h"
10 : #include "src/zone/zone.h"
11 :
12 : namespace v8 {
13 : namespace internal {
14 :
15 : enum class StringConstantKind {
16 : kStringLiteral,
17 : kNumberToStringConstant,
18 : kStringCons
19 : };
20 :
21 : class StringConstantBase : public ZoneObject {
22 : public:
23 12056 : explicit StringConstantBase(StringConstantKind kind) : kind_(kind) {}
24 :
25 : StringConstantKind kind() const { return kind_; }
26 : Handle<String> AllocateStringConstant(Isolate* isolate) const;
27 :
28 : size_t GetMaxStringConstantLength() const;
29 :
30 : bool operator==(const StringConstantBase& other) const;
31 :
32 : private:
33 9851 : void Memoize(Handle<String> flattened) const { flattened_ = flattened; }
34 :
35 : StringConstantKind kind_;
36 : mutable Handle<String> flattened_ = Handle<String>::null();
37 : };
38 :
39 : size_t hash_value(StringConstantBase const& base);
40 :
41 : class StringLiteral final : public StringConstantBase {
42 : public:
43 : explicit StringLiteral(Handle<String> str, size_t length)
44 : : StringConstantBase(StringConstantKind::kStringLiteral),
45 : str_(str),
46 6730 : length_(length) {}
47 :
48 : Handle<String> str() const { return str_; }
49 :
50 : size_t GetMaxStringConstantLength() const;
51 :
52 : private:
53 : Handle<String> str_;
54 : size_t length_; // We store this separately to avoid accessing the heap.
55 : };
56 :
57 : bool operator==(StringLiteral const& lhs, StringLiteral const& rhs);
58 : bool operator!=(StringLiteral const& lhs, StringLiteral const& rhs);
59 :
60 : size_t hash_value(StringLiteral const& parameters);
61 :
62 : std::ostream& operator<<(std::ostream& os, StringLiteral const& parameters);
63 :
64 : class NumberToStringConstant final : public StringConstantBase {
65 : public:
66 : explicit NumberToStringConstant(double num)
67 : : StringConstantBase(StringConstantKind::kNumberToStringConstant),
68 269 : num_(num) {}
69 :
70 : double num() const { return num_; }
71 :
72 : size_t GetMaxStringConstantLength() const;
73 :
74 : private:
75 : double num_;
76 : };
77 :
78 : bool operator==(NumberToStringConstant const& lhs,
79 : NumberToStringConstant const& rhs);
80 : bool operator!=(NumberToStringConstant const& lhs,
81 : NumberToStringConstant const& rhs);
82 :
83 : size_t hash_value(NumberToStringConstant const& parameters);
84 :
85 : std::ostream& operator<<(std::ostream& os,
86 : NumberToStringConstant const& parameters);
87 :
88 : class StringCons final : public StringConstantBase {
89 : public:
90 : explicit StringCons(const StringConstantBase* lhs,
91 : const StringConstantBase* rhs)
92 : : StringConstantBase(StringConstantKind::kStringCons),
93 : lhs_(lhs),
94 5057 : rhs_(rhs) {}
95 :
96 : const StringConstantBase* lhs() const { return lhs_; }
97 : const StringConstantBase* rhs() const { return rhs_; }
98 :
99 : size_t GetMaxStringConstantLength() const;
100 :
101 : private:
102 : const StringConstantBase* lhs_;
103 : const StringConstantBase* rhs_;
104 : };
105 :
106 : bool operator==(StringCons const& lhs, StringCons const& rhs);
107 : bool operator!=(StringCons const& lhs, StringCons const& rhs);
108 :
109 : size_t hash_value(StringCons const& parameters);
110 :
111 : std::ostream& operator<<(std::ostream& os, StringCons const& parameters);
112 :
113 : } // namespace internal
114 : } // namespace v8
115 :
116 : #endif // V8_STRING_CONSTANTS_H_
|