• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef PANDA_ASSEMBLER_ASSEMBLY_LITERALS_H
17 #define PANDA_ASSEMBLER_ASSEMBLY_LITERALS_H
18 
19 #include <string>
20 #include <vector>
21 
22 #include "libpandafile/literal_data_accessor-inl.h"
23 
24 namespace ark::pandasm {
25 
26 struct LiteralArray {
27     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init)
28     struct Literal {
29         // NOLINTNEXTLINE(misc-non-private-member-variables-in-classes)
30         panda_file::LiteralTag tag;
31         // NOLINTNEXTLINE(misc-non-private-member-variables-in-classes)
32         std::variant<bool, uint8_t, uint16_t, uint32_t, uint64_t, float, double, std::string> value;
33 
IsSignedLiteralArray::Literal34         bool IsSigned() const
35         {
36             switch (tag) {
37                 case panda_file::LiteralTag::ARRAY_I8:
38                 case panda_file::LiteralTag::ARRAY_I16:
39                 case panda_file::LiteralTag::ARRAY_I32:
40                 case panda_file::LiteralTag::ARRAY_I64:
41                 case panda_file::LiteralTag::INTEGER:
42                 case panda_file::LiteralTag::BIGINT:
43                     return true;
44                 default:
45                     return false;
46             }
47         }
48 
IsArrayLiteralArray::Literal49         bool IsArray() const
50         {
51             switch (tag) {
52                 case panda_file::LiteralTag::ARRAY_U1:
53                 case panda_file::LiteralTag::ARRAY_U8:
54                 case panda_file::LiteralTag::ARRAY_I8:
55                 case panda_file::LiteralTag::ARRAY_U16:
56                 case panda_file::LiteralTag::ARRAY_I16:
57                 case panda_file::LiteralTag::ARRAY_U32:
58                 case panda_file::LiteralTag::ARRAY_I32:
59                 case panda_file::LiteralTag::ARRAY_U64:
60                 case panda_file::LiteralTag::ARRAY_I64:
61                 case panda_file::LiteralTag::ARRAY_F32:
62                 case panda_file::LiteralTag::ARRAY_F64:
63                 case panda_file::LiteralTag::ARRAY_STRING:
64                     return true;
65                 default:
66                     return false;
67             }
68         }
69 
IsBoolValueLiteralArray::Literal70         bool IsBoolValue() const
71         {
72             switch (tag) {
73                 case panda_file::LiteralTag::ARRAY_U1:
74                 case panda_file::LiteralTag::BOOL:
75                     return true;
76                 default:
77                     return false;
78             }
79         }
80 
IsByteValueLiteralArray::Literal81         bool IsByteValue() const
82         {
83             switch (tag) {
84                 case panda_file::LiteralTag::ARRAY_U8:
85                 case panda_file::LiteralTag::ARRAY_I8:
86                 case panda_file::LiteralTag::TAGVALUE:
87                 case panda_file::LiteralTag::ACCESSOR:
88                 case panda_file::LiteralTag::NULLVALUE:
89                     return true;
90                 default:
91                     return false;
92             }
93         }
94 
IsShortValueLiteralArray::Literal95         bool IsShortValue() const
96         {
97             switch (tag) {
98                 case panda_file::LiteralTag::ARRAY_U16:
99                 case panda_file::LiteralTag::ARRAY_I16:
100                     return true;
101                 default:
102                     return false;
103             }
104         }
105 
IsIntegerValueLiteralArray::Literal106         bool IsIntegerValue() const
107         {
108             switch (tag) {
109                 case panda_file::LiteralTag::ARRAY_U32:
110                 case panda_file::LiteralTag::ARRAY_I32:
111                 case panda_file::LiteralTag::INTEGER:
112                     return true;
113                 default:
114                     return false;
115             }
116         }
117 
IsLongValueLiteralArray::Literal118         bool IsLongValue() const
119         {
120             switch (tag) {
121                 case panda_file::LiteralTag::ARRAY_U64:
122                 case panda_file::LiteralTag::ARRAY_I64:
123                 case panda_file::LiteralTag::BIGINT:
124                     return true;
125                 default:
126                     return false;
127             }
128         }
129 
IsFloatValueLiteralArray::Literal130         bool IsFloatValue() const
131         {
132             switch (tag) {
133                 case panda_file::LiteralTag::ARRAY_F32:
134                 case panda_file::LiteralTag::FLOAT:
135                     return true;
136                 default:
137                     return false;
138             }
139         }
140 
IsDoubleValueLiteralArray::Literal141         bool IsDoubleValue() const
142         {
143             switch (tag) {
144                 case panda_file::LiteralTag::ARRAY_F64:
145                 case panda_file::LiteralTag::DOUBLE:
146                     return true;
147                 default:
148                     return false;
149             }
150         }
151 
IsStringValueLiteralArray::Literal152         bool IsStringValue() const
153         {
154             switch (tag) {
155                 case panda_file::LiteralTag::ARRAY_STRING:
156                 case panda_file::LiteralTag::STRING:
157                 case panda_file::LiteralTag::METHOD:
158                 case panda_file::LiteralTag::GENERATORMETHOD:
159                 case panda_file::LiteralTag::ASYNCGENERATORMETHOD:
160                 case panda_file::LiteralTag::ASYNCMETHOD:
161                     return true;
162                 default:
163                     return false;
164             }
165         }
166 
IsLiteralArrayValueLiteralArray::Literal167         bool IsLiteralArrayValue() const
168         {
169             return tag == panda_file::LiteralTag::LITERALARRAY;
170         }
171 
172         bool operator==(const LiteralArray::Literal &literal)
173         {
174             return tag == literal.tag && value == literal.value;
175         }
176 
177         bool operator!=(const LiteralArray::Literal &literal)
178         {
179             return !(*this == literal);
180         }
181     };
182 
183     std::vector<ark::pandasm::LiteralArray::Literal> literals;  // NOLINT(misc-non-private-member-variables-in-classes)
184 
LiteralArrayLiteralArray185     explicit LiteralArray(std::vector<ark::pandasm::LiteralArray::Literal> literalsVec)
186         : literals(std::move(literalsVec))
187     {
188     }
189     explicit LiteralArray() = default;
190 
GetArrayTagFromComponentTypeLiteralArray191     static constexpr panda_file::LiteralTag GetArrayTagFromComponentType(panda_file::Type::TypeId type)
192     {
193         switch (type) {
194             case panda_file::Type::TypeId::U1:
195                 return panda_file::LiteralTag::ARRAY_U1;
196             case panda_file::Type::TypeId::U8:
197                 return panda_file::LiteralTag::ARRAY_U8;
198             case panda_file::Type::TypeId::I8:
199                 return panda_file::LiteralTag::ARRAY_I8;
200             case panda_file::Type::TypeId::U16:
201                 return panda_file::LiteralTag::ARRAY_U16;
202             case panda_file::Type::TypeId::I16:
203                 return panda_file::LiteralTag::ARRAY_I16;
204             case panda_file::Type::TypeId::U32:
205                 return panda_file::LiteralTag::ARRAY_U32;
206             case panda_file::Type::TypeId::I32:
207                 return panda_file::LiteralTag::ARRAY_I32;
208             case panda_file::Type::TypeId::U64:
209                 return panda_file::LiteralTag::ARRAY_U64;
210             case panda_file::Type::TypeId::I64:
211                 return panda_file::LiteralTag::ARRAY_I64;
212             case panda_file::Type::TypeId::F32:
213                 return panda_file::LiteralTag::ARRAY_F32;
214             case panda_file::Type::TypeId::F64:
215                 return panda_file::LiteralTag::ARRAY_F64;
216             default:
217                 UNREACHABLE();
218         }
219     }
220 
GetLiteralTagFromComponentTypeLiteralArray221     static constexpr panda_file::LiteralTag GetLiteralTagFromComponentType(panda_file::Type::TypeId type)
222     {
223         switch (type) {
224             case panda_file::Type::TypeId::U1:
225                 return panda_file::LiteralTag::BOOL;
226             case panda_file::Type::TypeId::U8:
227             case panda_file::Type::TypeId::I8:
228             case panda_file::Type::TypeId::U16:
229             case panda_file::Type::TypeId::I16:
230             case panda_file::Type::TypeId::U32:
231             case panda_file::Type::TypeId::I32:
232                 return panda_file::LiteralTag::INTEGER;
233             case panda_file::Type::TypeId::U64:
234             case panda_file::Type::TypeId::I64:
235                 return panda_file::LiteralTag::BIGINT;
236             case panda_file::Type::TypeId::F32:
237                 return panda_file::LiteralTag::FLOAT;
238             case panda_file::Type::TypeId::F64:
239                 return panda_file::LiteralTag::DOUBLE;
240             default:
241                 UNREACHABLE();
242         }
243     }
244 };
245 
246 }  // namespace ark::pandasm
247 
248 #endif  // PANDA_ASSEMBLER_ASSEMBLY_LITERALS_H
249