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 #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 = std::make_unique<ScalarValue>( 85 ScalarValue::Create<Value::Type::METHOD>(scVal.GetValue<std::string>(), scVal.IsStatic())); 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::ENUM: 131 case Value::Type::ANNOTATION: 132 case Value::Type::LITERALARRAY: { 133 copyVal = InitScalarValue(*static_cast<ScalarValue *>(annElem.GetValue())); 134 break; 135 } 136 case Value::Type::METHOD: { 137 copyVal = InitScalarValue(*static_cast<ScalarValue *>(annElem.GetValue())); 138 break; 139 } 140 case Value::Type::ARRAY: { 141 Value::Type cType; 142 auto *elemArr = static_cast<ArrayValue *>(annElem.GetValue()); 143 if (elemArr->GetValues().empty()) { 144 cType = Value::Type::VOID; 145 } else { 146 cType = elemArr->GetValues().front().GetType(); 147 } 148 std::vector<ScalarValue> scVals; 149 for (const auto &scVal : elemArr->GetValues()) { 150 scVals.push_back(*InitScalarValue(scVal)); 151 } 152 copyVal = std::make_unique<ArrayValue>(cType, std::move(scVals)); 153 break; 154 } 155 default: { 156 UNREACHABLE(); 157 copyVal = nullptr; 158 break; 159 } 160 } 161 return copyVal; 162 } 163 AnnotationElement(const AnnotationElement & annElem)164AnnotationElement::AnnotationElement(const AnnotationElement &annElem) 165 { 166 this->value_ = MakingValue(annElem); 167 this->name_ = annElem.GetName(); 168 } 169 operator =(const AnnotationElement & annElem)170AnnotationElement &AnnotationElement::operator=(const AnnotationElement &annElem) 171 { 172 if (this == &annElem) { 173 return *this; 174 } 175 176 this->value_ = MakingValue(annElem); 177 this->name_ = annElem.GetName(); 178 return *this; 179 } 180 GetAsScalar()181ScalarValue *Value::GetAsScalar() 182 { 183 ASSERT(!IsArray()); 184 return static_cast<ScalarValue *>(this); 185 } 186 GetAsScalar() const187const ScalarValue *Value::GetAsScalar() const 188 { 189 ASSERT(!IsArray()); 190 return static_cast<const ScalarValue *>(this); 191 } 192 GetAsArray()193ArrayValue *Value::GetAsArray() 194 { 195 ASSERT(IsArray()); 196 return static_cast<ArrayValue *>(this); 197 } 198 GetAsArray() const199const ArrayValue *Value::GetAsArray() const 200 { 201 ASSERT(IsArray()); 202 return static_cast<const ArrayValue *>(this); 203 } 204 205 /* static */ TypeToString(Value::Type type)206std::string AnnotationElement::TypeToString(Value::Type type) 207 { 208 switch (type) { 209 case Value::Type::U1: 210 return "u1"; 211 case Value::Type::I8: 212 return "i8"; 213 case Value::Type::U8: 214 return "u8"; 215 case Value::Type::I16: 216 return "i16"; 217 case Value::Type::U16: 218 return "u16"; 219 case Value::Type::I32: 220 return "i32"; 221 case Value::Type::U32: 222 return "u32"; 223 case Value::Type::I64: 224 return "i64"; 225 case Value::Type::U64: 226 return "u64"; 227 case Value::Type::F32: 228 return "f32"; 229 case Value::Type::F64: 230 return "f64"; 231 case Value::Type::STRING: 232 return "string"; 233 case Value::Type::RECORD: 234 return "record"; 235 case Value::Type::METHOD: 236 return "method"; 237 case Value::Type::ENUM: 238 return "enum"; 239 case Value::Type::ANNOTATION: 240 return "annotation"; 241 case Value::Type::ARRAY: 242 return "array"; 243 case Value::Type::VOID: 244 return "void"; 245 default: { 246 UNREACHABLE(); 247 return "unknown"; 248 } 249 } 250 } 251 252 } // namespace ark::pandasm 253