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