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