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