• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)20 std::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)106 std::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)154 AnnotationElement::AnnotationElement(const AnnotationElement &annElem)
155 {
156     this->value_ = MakingValue(annElem);
157     this->name_ = annElem.GetName();
158 }
159 
operator =(const AnnotationElement & annElem)160 AnnotationElement &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()171 ScalarValue *Value::GetAsScalar()
172 {
173     ASSERT(!IsArray());
174     return static_cast<ScalarValue *>(this);
175 }
176 
GetAsScalar() const177 const ScalarValue *Value::GetAsScalar() const
178 {
179     ASSERT(!IsArray());
180     return static_cast<const ScalarValue *>(this);
181 }
182 
GetAsArray()183 ArrayValue *Value::GetAsArray()
184 {
185     ASSERT(IsArray());
186     return static_cast<ArrayValue *>(this);
187 }
188 
GetAsArray() const189 const ArrayValue *Value::GetAsArray() const
190 {
191     ASSERT(IsArray());
192     return static_cast<const ArrayValue *>(this);
193 }
194 
195 /* static */
TypeToString(Value::Type type)196 std::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