• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2021-2025 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 ASSEMBLER_ASSEMBLY_LITERALS_H
17 #define ASSEMBLER_ASSEMBLY_LITERALS_H
18 
19 #include <string>
20 #include <vector>
21 
22 #include "libpandafile/literal_data_accessor-inl.h"
23 
24 namespace panda::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 
IsBoolValueLiteralArray::Literal34         bool IsBoolValue() const
35         {
36             switch (tag_) {
37                 case panda_file::LiteralTag::ARRAY_U1:
38                 case panda_file::LiteralTag::BOOL:
39                     return true;
40                 default:
41                     return false;
42             }
43         }
44 
IsByteValueLiteralArray::Literal45         bool IsByteValue() const
46         {
47             switch (tag_) {
48                 case panda_file::LiteralTag::ARRAY_U8:
49                 case panda_file::LiteralTag::ARRAY_I8:
50                 case panda_file::LiteralTag::TAGVALUE:
51                 case panda_file::LiteralTag::ACCESSOR:
52                 case panda_file::LiteralTag::NULLVALUE:
53                     return true;
54                 default:
55                     return false;
56             }
57         }
58 
IsShortValueLiteralArray::Literal59         bool IsShortValue() const
60         {
61             switch (tag_) {
62                 case panda_file::LiteralTag::ARRAY_U16:
63                 case panda_file::LiteralTag::ARRAY_I16:
64                     return true;
65                 default:
66                     return false;
67             }
68         }
69 
IsIntegerValueLiteralArray::Literal70         bool IsIntegerValue() const
71         {
72             switch (tag_) {
73                 case panda_file::LiteralTag::ARRAY_U32:
74                 case panda_file::LiteralTag::ARRAY_I32:
75                 case panda_file::LiteralTag::INTEGER:
76                     return true;
77                 default:
78                     return false;
79             }
80         }
81 
IsLongValueLiteralArray::Literal82         bool IsLongValue() const
83         {
84             switch (tag_) {
85                 case panda_file::LiteralTag::ARRAY_U64:
86                 case panda_file::LiteralTag::ARRAY_I64:
87                     return true;
88                 default:
89                     return false;
90             }
91         }
92 
IsFloatValueLiteralArray::Literal93         bool IsFloatValue() const
94         {
95             switch (tag_) {
96                 case panda_file::LiteralTag::ARRAY_F32:
97                 case panda_file::LiteralTag::FLOAT:
98                     return true;
99                 default:
100                     return false;
101             }
102         }
103 
IsDoubleValueLiteralArray::Literal104         bool IsDoubleValue() const
105         {
106             switch (tag_) {
107                 case panda_file::LiteralTag::ARRAY_F64:
108                 case panda_file::LiteralTag::DOUBLE:
109                     return true;
110                 default:
111                     return false;
112             }
113         }
114 
IsStringValueLiteralArray::Literal115         bool IsStringValue() const
116         {
117             switch (tag_) {
118                 case panda_file::LiteralTag::ARRAY_STRING:
119                 case panda_file::LiteralTag::STRING:
120                 case panda_file::LiteralTag::METHOD:
121                 case panda_file::LiteralTag::GETTER:
122                 case panda_file::LiteralTag::SETTER:
123                 case panda_file::LiteralTag::GENERATORMETHOD:
124                 case panda_file::LiteralTag::ASYNCGENERATORMETHOD:
125                 case panda_file::LiteralTag::ETS_IMPLEMENTS:
126                     return true;
127                 default:
128                     return false;
129             }
130         }
131     };
132 
133     std::vector<panda::pandasm::LiteralArray::Literal>
134         literals_;  // NOLINT(misc-non-private-member-variables-in-classes)
135 
LiteralArrayLiteralArray136     explicit LiteralArray(std::vector<panda::pandasm::LiteralArray::Literal> literals) : literals_(std::move(literals))
137     {
138     }
139     explicit LiteralArray() = default;
140 
GetArrayTagFromComponentTypeLiteralArray141     static constexpr panda_file::LiteralTag GetArrayTagFromComponentType(panda_file::Type::TypeId type)
142     {
143         switch (type) {
144             case panda_file::Type::TypeId::U1:
145                 return panda_file::LiteralTag::ARRAY_U1;
146             case panda_file::Type::TypeId::U8:
147                 return panda_file::LiteralTag::ARRAY_U8;
148             case panda_file::Type::TypeId::I8:
149                 return panda_file::LiteralTag::ARRAY_I8;
150             case panda_file::Type::TypeId::U16:
151                 return panda_file::LiteralTag::ARRAY_U16;
152             case panda_file::Type::TypeId::I16:
153                 return panda_file::LiteralTag::ARRAY_I16;
154             case panda_file::Type::TypeId::U32:
155                 return panda_file::LiteralTag::ARRAY_U32;
156             case panda_file::Type::TypeId::I32:
157                 return panda_file::LiteralTag::ARRAY_I32;
158             case panda_file::Type::TypeId::U64:
159                 return panda_file::LiteralTag::ARRAY_U64;
160             case panda_file::Type::TypeId::I64:
161                 return panda_file::LiteralTag::ARRAY_I64;
162             case panda_file::Type::TypeId::F32:
163                 return panda_file::LiteralTag::ARRAY_F32;
164             case panda_file::Type::TypeId::F64:
165                 return panda_file::LiteralTag::ARRAY_F64;
166             default:
167                 UNREACHABLE();
168         }
169     }
170 };
171 
172 }  // namespace panda::pandasm
173 
174 #endif  // ASSEMBLER_ASSEMBLY_LITERALS_H
175