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