1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 *
4 * HDF is dual licensed: you can use it either under the terms of
5 * the GPL, or the BSD license, at your option.
6 * See the LICENSE file in the root of this repository for complete details.
7 */
8
9 #include "ast/ast_parameter.h"
10 #include "ast/ast_array_type.h"
11 #include "util/string_builder.h"
12
13 namespace OHOS {
14 namespace HDI {
Dump(const std::string & prefix)15 std::string ASTParameter::Dump(const std::string &prefix)
16 {
17 StringBuilder sb;
18
19 sb.Append(prefix);
20 sb.Append('[');
21
22 if (attr_->value_ == ParamAttr::PARAM_IN) {
23 sb.Append("in");
24 } else {
25 sb.Append("out");
26 }
27
28 sb.Append("] ");
29 sb.Append(type_->ToString()).Append(' ');
30 sb.Append(name_);
31
32 return sb.ToString();
33 }
34
EmitCParameter()35 std::string ASTParameter::EmitCParameter()
36 {
37 StringBuilder sb;
38 switch (type_->GetTypeKind()) {
39 case TypeKind::TYPE_BOOLEAN:
40 case TypeKind::TYPE_BYTE:
41 case TypeKind::TYPE_SHORT:
42 case TypeKind::TYPE_INT:
43 case TypeKind::TYPE_LONG:
44 case TypeKind::TYPE_UCHAR:
45 case TypeKind::TYPE_USHORT:
46 case TypeKind::TYPE_UINT:
47 case TypeKind::TYPE_ULONG:
48 case TypeKind::TYPE_FLOAT:
49 case TypeKind::TYPE_DOUBLE:
50 case TypeKind::TYPE_ENUM:
51 case TypeKind::TYPE_FILEDESCRIPTOR:
52 case TypeKind::TYPE_INTERFACE:
53 case TypeKind::TYPE_STRING:
54 case TypeKind::TYPE_STRUCT:
55 case TypeKind::TYPE_UNION:
56 case TypeKind::TYPE_NATIVE_BUFFER:
57 case TypeKind::TYPE_POINTER: {
58 StringBuilder paramStr;
59 if (attr_->value_ == ParamAttr::PARAM_IN) {
60 paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_IN).c_str(), name_.c_str());
61 } else {
62 paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_OUT).c_str(), name_.c_str());
63 }
64 if (type_->GetTypeKind() == TypeKind::TYPE_STRING && attr_->value_ == ParamAttr::PARAM_OUT) {
65 paramStr.AppendFormat(", uint32_t %sLen", name_.c_str());
66 }
67 return paramStr.ToString();
68 }
69 case TypeKind::TYPE_ARRAY:
70 case TypeKind::TYPE_LIST: {
71 StringBuilder paramStr;
72 if (attr_->value_ == ParamAttr::PARAM_IN) {
73 paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_IN).c_str(), name_.c_str());
74 } else {
75 paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_OUT).c_str(), name_.c_str());
76 }
77 paramStr.AppendFormat(
78 ", uint32_t%s %sLen", (attr_->value_ == ParamAttr::PARAM_IN) ? "" : "*", name_.c_str());
79 return paramStr.ToString();
80 }
81 default:
82 return StringHelper::Format("unknow type %s", name_.c_str());
83 }
84 return sb.ToString();
85 }
86
EmitCppParameter()87 std::string ASTParameter::EmitCppParameter()
88 {
89 if (attr_->value_ == ParamAttr::PARAM_IN) {
90 return StringHelper::Format("%s %s", type_->EmitCppType(TypeMode::PARAM_IN).c_str(), name_.c_str());
91 } else {
92 return StringHelper::Format("%s %s", type_->EmitCppType(TypeMode::PARAM_OUT).c_str(), name_.c_str());
93 }
94 }
95
EmitJavaParameter()96 std::string ASTParameter::EmitJavaParameter()
97 {
98 StringBuilder sb;
99 switch (type_->GetTypeKind()) {
100 case TypeKind::TYPE_BOOLEAN:
101 case TypeKind::TYPE_BYTE:
102 case TypeKind::TYPE_SHORT:
103 case TypeKind::TYPE_INT:
104 case TypeKind::TYPE_LONG:
105 case TypeKind::TYPE_UCHAR:
106 case TypeKind::TYPE_USHORT:
107 case TypeKind::TYPE_UINT:
108 case TypeKind::TYPE_ULONG:
109 case TypeKind::TYPE_FLOAT:
110 case TypeKind::TYPE_DOUBLE:
111 case TypeKind::TYPE_ENUM:
112 case TypeKind::TYPE_FILEDESCRIPTOR:
113 case TypeKind::TYPE_STRING:
114 case TypeKind::TYPE_SEQUENCEABLE:
115 case TypeKind::TYPE_INTERFACE:
116 case TypeKind::TYPE_STRUCT:
117 case TypeKind::TYPE_UNION:
118 case TypeKind::TYPE_POINTER:
119 case TypeKind::TYPE_ARRAY:
120 case TypeKind::TYPE_LIST:
121 case TypeKind::TYPE_MAP: {
122 return StringHelper::Format("%s %s", type_->EmitJavaType(TypeMode::NO_MODE, false).c_str(), name_.c_str());
123 }
124 default:
125 return StringHelper::Format("unknow type %s", name_.c_str());
126 }
127
128 return sb.ToString();
129 }
130
EmitCLocalVar()131 std::string ASTParameter::EmitCLocalVar()
132 {
133 StringBuilder sb;
134 sb.AppendFormat("%s %s", type_->EmitCType(TypeMode::LOCAL_VAR).c_str(), name_.c_str());
135 switch (type_->GetTypeKind()) {
136 case TypeKind::TYPE_BOOLEAN:
137 sb.Append(" = false");
138 break;
139 case TypeKind::TYPE_BYTE:
140 case TypeKind::TYPE_SHORT:
141 case TypeKind::TYPE_INT:
142 case TypeKind::TYPE_LONG:
143 case TypeKind::TYPE_UCHAR:
144 case TypeKind::TYPE_USHORT:
145 case TypeKind::TYPE_UINT:
146 case TypeKind::TYPE_ULONG:
147 case TypeKind::TYPE_FLOAT:
148 case TypeKind::TYPE_DOUBLE:
149 sb.Append(" = 0");
150 break;
151 case TypeKind::TYPE_STRING:
152 case TypeKind::TYPE_ARRAY:
153 case TypeKind::TYPE_LIST:
154 case TypeKind::TYPE_STRUCT:
155 case TypeKind::TYPE_UNION:
156 case TypeKind::TYPE_INTERFACE:
157 case TypeKind::TYPE_NATIVE_BUFFER:
158 sb.Append(" = NULL");
159 break;
160 case TypeKind::TYPE_FILEDESCRIPTOR:
161 sb.Append(" = -1");
162 break;
163 default:
164 break;
165 }
166 sb.Append(";");
167 return sb.ToString();
168 }
169
EmitCppLocalVar()170 std::string ASTParameter::EmitCppLocalVar()
171 {
172 StringBuilder sb;
173 sb.AppendFormat("%s %s", type_->EmitCppType(TypeMode::LOCAL_VAR).c_str(), name_.c_str());
174 switch (type_->GetTypeKind()) {
175 case TypeKind::TYPE_BOOLEAN:
176 sb.Append(" = false");
177 break;
178 case TypeKind::TYPE_BYTE:
179 case TypeKind::TYPE_SHORT:
180 case TypeKind::TYPE_INT:
181 case TypeKind::TYPE_LONG:
182 case TypeKind::TYPE_UCHAR:
183 case TypeKind::TYPE_USHORT:
184 case TypeKind::TYPE_UINT:
185 case TypeKind::TYPE_ULONG:
186 case TypeKind::TYPE_FLOAT:
187 case TypeKind::TYPE_DOUBLE:
188 sb.Append(" = 0");
189 break;
190 case TypeKind::TYPE_FILEDESCRIPTOR:
191 sb.Append(" = -1");
192 break;
193 case TypeKind::TYPE_SEQUENCEABLE:
194 sb.Append(" = nullptr");
195 break;
196 default:
197 break;
198 }
199 sb.Append(";");
200 return sb.ToString();
201 }
202
EmitJavaLocalVar() const203 std::string ASTParameter::EmitJavaLocalVar() const
204 {
205 return "";
206 }
207
EmitCWriteVar(const std::string & parcelName,const std::string & ecName,const std::string & gotoLabel,StringBuilder & sb,const std::string & prefix) const208 void ASTParameter::EmitCWriteVar(const std::string &parcelName, const std::string &ecName, const std::string &gotoLabel,
209 StringBuilder &sb, const std::string &prefix) const
210 {
211 if (type_ == nullptr) {
212 return;
213 }
214
215 type_->EmitCWriteVar(parcelName, name_, ecName, gotoLabel, sb, prefix);
216 }
217
EmitCProxyWriteOutVar(const std::string & parcelName,const std::string & ecName,const std::string & gotoLabel,StringBuilder & sb,const std::string & prefix) const218 bool ASTParameter::EmitCProxyWriteOutVar(const std::string &parcelName, const std::string &ecName,
219 const std::string &gotoLabel, StringBuilder &sb, const std::string &prefix) const
220 {
221 if (type_ == nullptr) {
222 return false;
223 }
224
225 if (type_->IsStringType() || type_->IsArrayType() || type_->IsListType()) {
226 type_->EmitCProxyWriteOutVar(parcelName, name_, ecName, gotoLabel, sb, prefix);
227 return true;
228 }
229
230 return false;
231 }
232
EmitCStubReadOutVar(const std::string & buffSizeName,const std::string & memFlagName,const std::string & parcelName,const std::string & ecName,const std::string & gotoLabel,StringBuilder & sb,const std::string & prefix) const233 void ASTParameter::EmitCStubReadOutVar(const std::string &buffSizeName, const std::string &memFlagName,
234 const std::string &parcelName, const std::string &ecName, const std::string &gotoLabel, StringBuilder &sb,
235 const std::string &prefix) const
236 {
237 if (type_ == nullptr) {
238 return;
239 }
240
241 if (type_->IsStringType() || type_->IsArrayType() || type_->IsListType()) {
242 type_->EmitCStubReadOutVar(buffSizeName, memFlagName, parcelName, name_, ecName, gotoLabel, sb, prefix);
243 }
244 }
245
EmitJavaWriteVar(const std::string & parcelName,StringBuilder & sb,const std::string & prefix) const246 void ASTParameter::EmitJavaWriteVar(const std::string &parcelName, StringBuilder &sb, const std::string &prefix) const
247 {
248 if (attr_->value_ == ParamAttr::PARAM_IN) {
249 type_->EmitJavaWriteVar(parcelName, name_, sb, prefix);
250 } else {
251 if (type_->GetTypeKind() == TypeKind::TYPE_ARRAY) {
252 sb.Append(prefix).AppendFormat("if (%s == null) {\n", name_.c_str());
253 sb.Append(prefix + TAB).AppendFormat("%s.writeInt(-1);\n", parcelName.c_str());
254 sb.Append(prefix).Append("} else {\n");
255 sb.Append(prefix + TAB).AppendFormat("%s.writeInt(%s.length);\n", parcelName.c_str(), name_.c_str());
256 sb.Append(prefix).Append("}\n");
257 }
258 }
259 }
260
EmitJavaReadVar(const std::string & parcelName,StringBuilder & sb,const std::string & prefix) const261 void ASTParameter::EmitJavaReadVar(const std::string &parcelName, StringBuilder &sb, const std::string &prefix) const
262 {
263 if (attr_->value_ == ParamAttr::PARAM_OUT) {
264 type_->EmitJavaReadVar(parcelName, name_, sb, prefix);
265 }
266 }
267 } // namespace HDI
268 } // namespace OHOS