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 #include "annotation.h" 17 18 namespace ark::pandasm { 19 20 // CC-OFFNXT(huge_method[C++], G.FUN.01-CPP) big switch case InitScalarValue(const ScalarValue & scVal)21std::unique_ptr<ScalarValue> InitScalarValue(const ScalarValue &scVal) 22 { 23 std::unique_ptr<ScalarValue> copyVal; 24 switch (scVal.GetType()) { 25 case Value::Type::U1: { 26 copyVal = std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::U1>(scVal.GetValue<uint8_t>())); 27 break; 28 } 29 case Value::Type::U8: { 30 copyVal = std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::U8>(scVal.GetValue<uint8_t>())); 31 break; 32 } 33 case Value::Type::U16: { 34 copyVal = std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::U16>(scVal.GetValue<uint16_t>())); 35 break; 36 } 37 case Value::Type::U32: { 38 copyVal = std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::U32>(scVal.GetValue<uint32_t>())); 39 break; 40 } 41 case Value::Type::U64: { 42 copyVal = std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::U64>(scVal.GetValue<uint64_t>())); 43 break; 44 } 45 case Value::Type::I8: { 46 copyVal = std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::I8>(scVal.GetValue<int8_t>())); 47 break; 48 } 49 case Value::Type::I16: { 50 copyVal = std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::I16>(scVal.GetValue<int16_t>())); 51 break; 52 } 53 case Value::Type::I32: { 54 copyVal = std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::I32>(scVal.GetValue<int32_t>())); 55 break; 56 } 57 case Value::Type::I64: { 58 copyVal = std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::I64>(scVal.GetValue<int64_t>())); 59 break; 60 } 61 case Value::Type::F32: { 62 copyVal = std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::F32>(scVal.GetValue<float>())); 63 break; 64 } 65 case Value::Type::F64: { 66 copyVal = std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::F64>(scVal.GetValue<double>())); 67 break; 68 } 69 case Value::Type::STRING: { 70 copyVal = 71 std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::STRING>(scVal.GetValue<std::string>())); 72 break; 73 } 74 case Value::Type::STRING_NULLPTR: { 75 copyVal = std::make_unique<ScalarValue>( 76 ScalarValue::Create<Value::Type::STRING_NULLPTR>(scVal.GetValue<int32_t>())); 77 break; 78 } 79 case Value::Type::RECORD: { 80 copyVal = std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::RECORD>(scVal.GetValue<Type>())); 81 break; 82 } 83 case Value::Type::METHOD: { 84 copyVal = 85 std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::METHOD>(scVal.GetValue<std::string>())); 86 break; 87 } 88 case Value::Type::ENUM: { 89 copyVal = 90 std::make_unique<ScalarValue>(ScalarValue::Create<Value::Type::ENUM>(scVal.GetValue<std::string>())); 91 break; 92 } 93 case Value::Type::ANNOTATION: { 94 copyVal = std::make_unique<ScalarValue>( 95 ScalarValue::Create<Value::Type::ANNOTATION>(scVal.GetValue<AnnotationData>())); 96 break; 97 } 98 case Value::Type::LITERALARRAY: { 99 copyVal = std::make_unique<ScalarValue>( 100 ScalarValue::Create<Value::Type::LITERALARRAY>(scVal.GetValue<std::string>())); 101 break; 102 } 103 default: { 104 UNREACHABLE(); 105 copyVal = nullptr; 106 break; 107 } 108 } 109 return copyVal; 110 } 111 MakingValue(const AnnotationElement & annElem)112std::unique_ptr<Value> MakingValue(const AnnotationElement &annElem) 113 { 114 std::unique_ptr<Value> copyVal; 115 switch (annElem.GetValue()->GetType()) { 116 case Value::Type::U1: 117 case Value::Type::U8: 118 case Value::Type::U16: 119 case Value::Type::U32: 120 case Value::Type::U64: 121 case Value::Type::I8: 122 case Value::Type::I16: 123 case Value::Type::I32: 124 case Value::Type::I64: 125 case Value::Type::F32: 126 case Value::Type::F64: 127 case Value::Type::STRING: 128 case Value::Type::STRING_NULLPTR: 129 case Value::Type::RECORD: 130 case Value::Type::METHOD: 131 case Value::Type::ENUM: 132 case Value::Type::ANNOTATION: 133 case Value::Type::LITERALARRAY: { 134 copyVal = InitScalarValue(*static_cast<ScalarValue *>(annElem.GetValue())); 135 break; 136 } 137 case Value::Type::ARRAY: { 138 Value::Type cType; 139 auto *elemArr = static_cast<ArrayValue *>(annElem.GetValue()); 140 if (elemArr->GetValues().empty()) { 141 cType = Value::Type::VOID; 142 } else { 143 cType = elemArr->GetValues().front().GetType(); 144 } 145 std::vector<ScalarValue> scVals; 146 for (const auto &scVal : elemArr->GetValues()) { 147 scVals.push_back(*InitScalarValue(scVal)); 148 } 149 copyVal = std::make_unique<ArrayValue>(cType, std::move(scVals)); 150 break; 151 } 152 default: { 153 UNREACHABLE(); 154 copyVal = nullptr; 155 break; 156 } 157 } 158 return copyVal; 159 } 160 AnnotationElement(const AnnotationElement & annElem)161AnnotationElement::AnnotationElement(const AnnotationElement &annElem) 162 { 163 this->value_ = MakingValue(annElem); 164 this->name_ = annElem.GetName(); 165 } 166 operator =(const AnnotationElement & annElem)167AnnotationElement &AnnotationElement::operator=(const AnnotationElement &annElem) 168 { 169 if (this == &annElem) { 170 return *this; 171 } 172 173 this->value_ = MakingValue(annElem); 174 this->name_ = annElem.GetName(); 175 return *this; 176 } 177 GetAsScalar()178ScalarValue *Value::GetAsScalar() 179 { 180 ASSERT(!IsArray()); 181 return static_cast<ScalarValue *>(this); 182 } 183 GetAsScalar() const184const ScalarValue *Value::GetAsScalar() const 185 { 186 ASSERT(!IsArray()); 187 return static_cast<const ScalarValue *>(this); 188 } 189 GetAsArray()190ArrayValue *Value::GetAsArray() 191 { 192 ASSERT(IsArray()); 193 return static_cast<ArrayValue *>(this); 194 } 195 GetAsArray() const196const ArrayValue *Value::GetAsArray() const 197 { 198 ASSERT(IsArray()); 199 return static_cast<const ArrayValue *>(this); 200 } 201 202 /* static */ TypeToString(Value::Type type)203std::string AnnotationElement::TypeToString(Value::Type type) 204 { 205 switch (type) { 206 case Value::Type::U1: 207 return "u1"; 208 case Value::Type::I8: 209 return "i8"; 210 case Value::Type::U8: 211 return "u8"; 212 case Value::Type::I16: 213 return "i16"; 214 case Value::Type::U16: 215 return "u16"; 216 case Value::Type::I32: 217 return "i32"; 218 case Value::Type::U32: 219 return "u32"; 220 case Value::Type::I64: 221 return "i64"; 222 case Value::Type::U64: 223 return "u64"; 224 case Value::Type::F32: 225 return "f32"; 226 case Value::Type::F64: 227 return "f64"; 228 case Value::Type::STRING: 229 return "string"; 230 case Value::Type::RECORD: 231 return "record"; 232 case Value::Type::METHOD: 233 return "method"; 234 case Value::Type::ENUM: 235 return "enum"; 236 case Value::Type::ANNOTATION: 237 return "annotation"; 238 case Value::Type::ARRAY: 239 return "array"; 240 case Value::Type::VOID: 241 return "void"; 242 default: { 243 UNREACHABLE(); 244 return "unknown"; 245 } 246 } 247 } 248 249 } // namespace ark::pandasm 250