• 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 
167         bool operator==(const LiteralArray::Literal &literal)
168         {
169             return tag == literal.tag && value == literal.value;
170         }
171 
172         bool operator!=(const LiteralArray::Literal &literal)
173         {
174             return !(*this == literal);
175         }
176     };
177 
178     std::vector<ark::pandasm::LiteralArray::Literal> literals;  // NOLINT(misc-non-private-member-variables-in-classes)
179 
LiteralArrayLiteralArray180     explicit LiteralArray(std::vector<ark::pandasm::LiteralArray::Literal> literalsVec)
181         : literals(std::move(literalsVec))
182     {
183     }
184     explicit LiteralArray() = default;
185 
GetArrayTagFromComponentTypeLiteralArray186     static constexpr panda_file::LiteralTag GetArrayTagFromComponentType(panda_file::Type::TypeId type)
187     {
188         switch (type) {
189             case panda_file::Type::TypeId::U1:
190                 return panda_file::LiteralTag::ARRAY_U1;
191             case panda_file::Type::TypeId::U8:
192                 return panda_file::LiteralTag::ARRAY_U8;
193             case panda_file::Type::TypeId::I8:
194                 return panda_file::LiteralTag::ARRAY_I8;
195             case panda_file::Type::TypeId::U16:
196                 return panda_file::LiteralTag::ARRAY_U16;
197             case panda_file::Type::TypeId::I16:
198                 return panda_file::LiteralTag::ARRAY_I16;
199             case panda_file::Type::TypeId::U32:
200                 return panda_file::LiteralTag::ARRAY_U32;
201             case panda_file::Type::TypeId::I32:
202                 return panda_file::LiteralTag::ARRAY_I32;
203             case panda_file::Type::TypeId::U64:
204                 return panda_file::LiteralTag::ARRAY_U64;
205             case panda_file::Type::TypeId::I64:
206                 return panda_file::LiteralTag::ARRAY_I64;
207             case panda_file::Type::TypeId::F32:
208                 return panda_file::LiteralTag::ARRAY_F32;
209             case panda_file::Type::TypeId::F64:
210                 return panda_file::LiteralTag::ARRAY_F64;
211             default:
212                 UNREACHABLE();
213         }
214     }
215 
GetLiteralTagFromComponentTypeLiteralArray216     static constexpr panda_file::LiteralTag GetLiteralTagFromComponentType(panda_file::Type::TypeId type)
217     {
218         switch (type) {
219             case panda_file::Type::TypeId::U1:
220                 return panda_file::LiteralTag::BOOL;
221             case panda_file::Type::TypeId::U8:
222             case panda_file::Type::TypeId::I8:
223             case panda_file::Type::TypeId::U16:
224             case panda_file::Type::TypeId::I16:
225             case panda_file::Type::TypeId::U32:
226             case panda_file::Type::TypeId::I32:
227                 return panda_file::LiteralTag::INTEGER;
228             case panda_file::Type::TypeId::U64:
229             case panda_file::Type::TypeId::I64:
230                 return panda_file::LiteralTag::BIGINT;
231             case panda_file::Type::TypeId::F32:
232                 return panda_file::LiteralTag::FLOAT;
233             case panda_file::Type::TypeId::F64:
234                 return panda_file::LiteralTag::DOUBLE;
235             default:
236                 UNREACHABLE();
237         }
238     }
239 };
240 
241 }  // namespace ark::pandasm
242 
243 #endif  // PANDA_ASSEMBLER_ASSEMBLY_LITERALS_H
244