blob: 14e375a1b5566534dc598a528c1d79ddf6a9429c [file] [log] [blame]
Andreas Huber1aec3972016-08-26 09:26:32 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Andreas Huberc9410c72016-07-28 12:18:40 -070017#include "ArrayType.h"
18
Iliyan Malcheva72e0d22016-09-09 11:03:08 -070019#include <hidl-util/Formatter.h>
Andreas Huber881227d2016-08-02 14:20:21 -070020#include <android-base/logging.h>
21
Yifan Hongf24fa852016-09-23 11:03:15 -070022#include "ConstantExpression.h"
23
Andreas Huberc9410c72016-07-28 12:18:40 -070024namespace android {
25
Yifan Hongf24fa852016-09-23 11:03:15 -070026ArrayType::ArrayType(ArrayType *srcArray, ConstantExpression *size)
Andreas Huber709b62d2016-09-19 11:21:18 -070027 : mElementType(srcArray->mElementType),
Yifan Hong5706a432016-11-02 09:44:18 -070028 mSizes(srcArray->mSizes) {
Yifan Hongbd33e382016-11-02 13:30:17 -070029 prependDimension(size);
Andreas Huber709b62d2016-09-19 11:21:18 -070030}
31
Yifan Hongf24fa852016-09-23 11:03:15 -070032ArrayType::ArrayType(Type *elementType, ConstantExpression *size)
Andreas Huber709b62d2016-09-19 11:21:18 -070033 : mElementType(elementType) {
Yifan Hongbd33e382016-11-02 13:30:17 -070034 prependDimension(size);
Andreas Huber709b62d2016-09-19 11:21:18 -070035}
36
Yifan Hongbd33e382016-11-02 13:30:17 -070037void ArrayType::prependDimension(ConstantExpression *size) {
Yifan Hong5706a432016-11-02 09:44:18 -070038 mSizes.insert(mSizes.begin(), size);
Andreas Huberc9410c72016-07-28 12:18:40 -070039}
40
Yifan Hongbd33e382016-11-02 13:30:17 -070041void ArrayType::appendDimension(ConstantExpression *size) {
Yifan Hong5706a432016-11-02 09:44:18 -070042 mSizes.push_back(size);
Yifan Hongbd33e382016-11-02 13:30:17 -070043}
44
Andreas Huberf03332a2016-09-22 15:35:43 -070045size_t ArrayType::countDimensions() const {
46 return mSizes.size();
47}
48
Steven Moreland979e0992016-09-07 09:18:08 -070049void ArrayType::addNamedTypesToSet(std::set<const FQName> &set) const {
50 mElementType->addNamedTypesToSet(set);
51}
52
Andreas Huber709b62d2016-09-19 11:21:18 -070053bool ArrayType::isArray() const {
54 return true;
55}
56
Andreas Huberf03332a2016-09-22 15:35:43 -070057Type *ArrayType::getElementType() const {
58 return mElementType;
59}
60
Steven Moreland979e0992016-09-07 09:18:08 -070061std::string ArrayType::getCppType(StorageMode mode,
Steven Moreland979e0992016-09-07 09:18:08 -070062 bool specifyNamespaces) const {
Yifan Hong3b320f82016-11-01 15:15:54 -070063 const std::string base = mElementType->getCppStackType(specifyNamespaces);
Andreas Huber881227d2016-08-02 14:20:21 -070064
Steven Morelandc46e9842016-11-02 13:21:26 -070065 std::string space = specifyNamespaces ? "::android::hardware::" : "";
66 std::string arrayType = space + "hidl_array<" + base;
Andreas Huberf03332a2016-09-22 15:35:43 -070067
68 for (size_t i = 0; i < mSizes.size(); ++i) {
69 arrayType += ", ";
Yifan Hong5706a432016-11-02 09:44:18 -070070 arrayType += mSizes[i]->cppValue();
Andreas Huberf03332a2016-09-22 15:35:43 -070071
Yifan Hong5706a432016-11-02 09:44:18 -070072 if (!mSizes[i]->descriptionIsTrivial()) {
73 arrayType += " /* ";
74 arrayType += mSizes[i]->description();
75 arrayType += " */";
76 }
Andreas Huber709b62d2016-09-19 11:21:18 -070077 }
78
Andreas Huberf03332a2016-09-22 15:35:43 -070079 arrayType += ">";
Andreas Huber881227d2016-08-02 14:20:21 -070080
81 switch (mode) {
82 case StorageMode_Stack:
Andreas Huberf03332a2016-09-22 15:35:43 -070083 return arrayType;
Andreas Huber881227d2016-08-02 14:20:21 -070084
85 case StorageMode_Argument:
Andreas Huberf03332a2016-09-22 15:35:43 -070086 return "const " + arrayType + "&";
87
Andreas Huber881227d2016-08-02 14:20:21 -070088 case StorageMode_Result:
Andreas Huberf03332a2016-09-22 15:35:43 -070089 return "const " + arrayType + "*";
Andreas Huber881227d2016-08-02 14:20:21 -070090 }
Andreas Huberf03332a2016-09-22 15:35:43 -070091
92 CHECK(!"Should not be here");
Andreas Huber881227d2016-08-02 14:20:21 -070093}
94
Yifan Hong4ed13472016-11-02 10:44:11 -070095std::string ArrayType::getJavaType(bool forInitializer) const {
96 std::string base =
97 mElementType->getJavaType(forInitializer);
Andreas Huber709b62d2016-09-19 11:21:18 -070098
Yifan Hongf24fa852016-09-23 11:03:15 -070099 for (size_t i = 0; i < mSizes.size(); ++i) {
Yifan Hong4ed13472016-11-02 10:44:11 -0700100 base += "[";
Andreas Huber709b62d2016-09-19 11:21:18 -0700101
102 if (forInitializer) {
Yifan Hong4ed13472016-11-02 10:44:11 -0700103 base += mSizes[i]->javaValue();
Andreas Huber709b62d2016-09-19 11:21:18 -0700104 }
105
Yifan Hong5706a432016-11-02 09:44:18 -0700106 if (!forInitializer || !mSizes[i]->descriptionIsTrivial()) {
107 if (forInitializer)
Yifan Hong4ed13472016-11-02 10:44:11 -0700108 base += " ";
109 base += "/* " + mSizes[i]->description() + " */";
Yifan Hong5706a432016-11-02 09:44:18 -0700110 }
Yifan Hongf24fa852016-09-23 11:03:15 -0700111
Yifan Hong4ed13472016-11-02 10:44:11 -0700112 base += "]";
Andreas Huber4c865b72016-09-14 15:26:27 -0700113 }
Andreas Huber4c865b72016-09-14 15:26:27 -0700114
115 return base;
Andreas Huber2831d512016-08-15 09:33:47 -0700116}
117
Andreas Huberf03332a2016-09-22 15:35:43 -0700118std::string ArrayType::getJavaWrapperType() const {
119 return mElementType->getJavaWrapperType();
120}
121
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -0700122std::string ArrayType::getVtsType() const {
123 return "TYPE_ARRAY";
124}
125
Andreas Huber881227d2016-08-02 14:20:21 -0700126void ArrayType::emitReaderWriter(
127 Formatter &out,
128 const std::string &name,
129 const std::string &parcelObj,
130 bool parcelObjIsPointer,
131 bool isReader,
132 ErrorMode mode) const {
Yifan Hong3b320f82016-11-01 15:15:54 -0700133 std::string baseType = mElementType->getCppStackType();
Andreas Huber881227d2016-08-02 14:20:21 -0700134
Iliyan Malchev549e2592016-08-10 08:59:12 -0700135 const std::string parentName = "_hidl_" + name + "_parent";
Andreas Huber881227d2016-08-02 14:20:21 -0700136
137 out << "size_t " << parentName << ";\n\n";
138
139 const std::string parcelObjDeref =
140 parcelObj + (parcelObjIsPointer ? "->" : ".");
141
142 if (isReader) {
Andreas Huberf03332a2016-09-22 15:35:43 -0700143
Andreas Huber881227d2016-08-02 14:20:21 -0700144 out << name
Andreas Huberf03332a2016-09-22 15:35:43 -0700145 << " = ("
Yifan Hong3b320f82016-11-01 15:15:54 -0700146 << getCppResultType()
Andreas Huberf03332a2016-09-22 15:35:43 -0700147 << ")"
Andreas Huber881227d2016-08-02 14:20:21 -0700148 << parcelObjDeref
149 << "readBuffer(&"
150 << parentName
151 << ");\n\n";
152
153 out << "if (" << name << " == nullptr) {\n";
154
155 out.indent();
156
Iliyan Malchev549e2592016-08-10 08:59:12 -0700157 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700158 handleError2(out, mode);
159
160 out.unindent();
161 out << "}\n\n";
162 } else {
Andreas Huberf03332a2016-09-22 15:35:43 -0700163 size_t numArrayElements = 1;
164 for (auto size : mSizes) {
Yifan Hong5706a432016-11-02 09:44:18 -0700165 numArrayElements *= size->castSizeT();
Andreas Huberf03332a2016-09-22 15:35:43 -0700166 }
167
Iliyan Malchev549e2592016-08-10 08:59:12 -0700168 out << "_hidl_err = "
Andreas Huber881227d2016-08-02 14:20:21 -0700169 << parcelObjDeref
170 << "writeBuffer("
171 << name
Andreas Huberf03332a2016-09-22 15:35:43 -0700172 << ".data(), "
173 << numArrayElements
174 << " * sizeof("
Andreas Huber881227d2016-08-02 14:20:21 -0700175 << baseType
176 << "), &"
177 << parentName
178 << ");\n";
179
180 handleError(out, mode);
181 }
182
183 emitReaderWriterEmbedded(
184 out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700185 0 /* depth */,
Andreas Huber881227d2016-08-02 14:20:21 -0700186 name,
Yifan Hongbe2a3732016-10-05 13:33:41 -0700187 name /* sanitizedName */,
Andreas Huber881227d2016-08-02 14:20:21 -0700188 isReader /* nameIsPointer */,
189 parcelObj,
190 parcelObjIsPointer,
191 isReader,
192 mode,
193 parentName,
194 "0 /* parentOffset */");
195}
196
197void ArrayType::emitReaderWriterEmbedded(
198 Formatter &out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700199 size_t depth,
Andreas Huber881227d2016-08-02 14:20:21 -0700200 const std::string &name,
Yifan Hongbe2a3732016-10-05 13:33:41 -0700201 const std::string &sanitizedName,
Andreas Huber881227d2016-08-02 14:20:21 -0700202 bool nameIsPointer,
203 const std::string &parcelObj,
204 bool parcelObjIsPointer,
205 bool isReader,
206 ErrorMode mode,
207 const std::string &parentName,
208 const std::string &offsetText) const {
209 if (!mElementType->needsEmbeddedReadWrite()) {
210 return;
211 }
212
213 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
214
Yifan Hong3b320f82016-11-01 15:15:54 -0700215 std::string baseType = mElementType->getCppStackType();
Andreas Huber881227d2016-08-02 14:20:21 -0700216
Andreas Huberf9d49f12016-09-12 14:58:36 -0700217 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
218
219 out << "for (size_t "
220 << iteratorName
221 << " = 0; "
222 << iteratorName
223 << " < "
Yifan Hongbf459bc2016-08-23 16:50:37 -0700224 << dimension()
Andreas Huberf9d49f12016-09-12 14:58:36 -0700225 << "; ++"
226 << iteratorName
227 << ") {\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700228
229 out.indent();
230
231 mElementType->emitReaderWriterEmbedded(
232 out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700233 depth + 1,
Andreas Huberf03332a2016-09-22 15:35:43 -0700234 nameDeref + "data()[" + iteratorName + "]",
Yifan Hongbe2a3732016-10-05 13:33:41 -0700235 sanitizedName + "_indexed",
Andreas Huber881227d2016-08-02 14:20:21 -0700236 false /* nameIsPointer */,
237 parcelObj,
238 parcelObjIsPointer,
239 isReader,
240 mode,
241 parentName,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700242 offsetText
243 + " + " + iteratorName + " * sizeof("
244 + baseType
Andreas Huberf9d49f12016-09-12 14:58:36 -0700245 + ")");
Andreas Huber881227d2016-08-02 14:20:21 -0700246
247 out.unindent();
248
249 out << "}\n\n";
250}
251
Yifan Hongbf459bc2016-08-23 16:50:37 -0700252void ArrayType::emitResolveReferences(
253 Formatter &out,
254 const std::string &name,
255 bool nameIsPointer,
256 const std::string &parcelObj,
257 bool parcelObjIsPointer,
258 bool isReader,
259 ErrorMode mode) const {
260 emitResolveReferencesEmbedded(
261 out,
262 0 /* depth */,
263 name,
264 name /* sanitizedName */,
265 nameIsPointer,
266 parcelObj,
267 parcelObjIsPointer,
268 isReader,
269 mode,
270 "_hidl_" + name + "_parent",
271 "0 /* parentOffset */");
272}
273
274void ArrayType::emitResolveReferencesEmbedded(
275 Formatter &out,
276 size_t depth,
277 const std::string &name,
278 const std::string &sanitizedName,
279 bool nameIsPointer,
280 const std::string &parcelObj,
281 bool parcelObjIsPointer,
282 bool isReader,
283 ErrorMode mode,
284 const std::string &parentName,
285 const std::string &offsetText) const {
286 CHECK(needsResolveReferences() && mElementType->needsResolveReferences());
287
288 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
289
Yifan Hong3b320f82016-11-01 15:15:54 -0700290 std::string baseType = mElementType->getCppStackType();
Yifan Hongbf459bc2016-08-23 16:50:37 -0700291
292 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
293
294 out << "for (size_t "
295 << iteratorName
296 << " = 0; "
297 << iteratorName
298 << " < "
299 << dimension()
300 << "; ++"
301 << iteratorName
302 << ") {\n";
303
304 out.indent();
305
306 mElementType->emitResolveReferencesEmbedded(
307 out,
308 depth + 1,
309 nameDeref + "data()[" + iteratorName + "]",
310 sanitizedName + "_indexed",
311 false /* nameIsPointer */,
312 parcelObj,
313 parcelObjIsPointer,
314 isReader,
315 mode,
316 parentName,
317 offsetText + " + " + iteratorName + " * sizeof("
318 + baseType
319 + ")");
320
321 out.unindent();
322
323 out << "}\n\n";
324}
325
326
Andreas Huber881227d2016-08-02 14:20:21 -0700327bool ArrayType::needsEmbeddedReadWrite() const {
328 return mElementType->needsEmbeddedReadWrite();
329}
330
Yifan Hongbf459bc2016-08-23 16:50:37 -0700331bool ArrayType::needsResolveReferences() const {
332 return mElementType->needsResolveReferences();
333}
334
Andreas Huberf03332a2016-09-22 15:35:43 -0700335bool ArrayType::resultNeedsDeref() const {
336 return true;
337}
338
Andreas Huber2831d512016-08-15 09:33:47 -0700339void ArrayType::emitJavaReaderWriter(
340 Formatter &out,
341 const std::string &parcelObj,
342 const std::string &argName,
343 bool isReader) const {
Andreas Huber709b62d2016-09-19 11:21:18 -0700344 if (isReader) {
Andreas Huber709b62d2016-09-19 11:21:18 -0700345 out << "new "
Yifan Hong4ed13472016-11-02 10:44:11 -0700346 << getJavaType(true /* forInitializer */)
Andreas Huber709b62d2016-09-19 11:21:18 -0700347 << ";\n";
Andreas Huberf630bc82016-09-09 14:52:25 -0700348 }
349
Andreas Huber709b62d2016-09-19 11:21:18 -0700350 out << "{\n";
351 out.indent();
352
Yifan Hong1af73532016-11-09 14:32:58 -0800353 out << "android.os.HwBlob _hidl_blob = ";
Andreas Huber709b62d2016-09-19 11:21:18 -0700354
355 if (isReader) {
356 out << parcelObj
357 << ".readBuffer();\n";
358 } else {
359 size_t align, size;
360 getAlignmentAndSize(&align, &size);
361
Yifan Hong1af73532016-11-09 14:32:58 -0800362 out << "new android.os.HwBlob("
Andreas Huber709b62d2016-09-19 11:21:18 -0700363 << size
364 << " /* size */);\n";
365 }
366
367 emitJavaFieldReaderWriter(
Andreas Huber2831d512016-08-15 09:33:47 -0700368 out,
Andreas Huber709b62d2016-09-19 11:21:18 -0700369 0 /* depth */,
Andreas Huber2831d512016-08-15 09:33:47 -0700370 parcelObj,
Andreas Huber709b62d2016-09-19 11:21:18 -0700371 "_hidl_blob",
Andreas Huber2831d512016-08-15 09:33:47 -0700372 argName,
Andreas Huber709b62d2016-09-19 11:21:18 -0700373 "0 /* offset */",
374 isReader);
375
376 if (!isReader) {
377 out << parcelObj << ".writeBuffer(_hidl_blob);\n";
378 }
379
380 out.unindent();
381 out << "}\n";
Andreas Huber2831d512016-08-15 09:33:47 -0700382}
383
Andreas Huber85eabdb2016-08-25 11:24:49 -0700384void ArrayType::emitJavaFieldInitializer(
385 Formatter &out, const std::string &fieldName) const {
Yifan Hong4ed13472016-11-02 10:44:11 -0700386 std::string typeName = getJavaType(false /* forInitializer */);
387 std::string initName = getJavaType(true /* forInitializer */);
Andreas Huber4c865b72016-09-14 15:26:27 -0700388
Andreas Hubercd5e6662016-08-30 15:02:59 -0700389 out << "final "
Andreas Huber4c865b72016-09-14 15:26:27 -0700390 << typeName
Andreas Huber4c865b72016-09-14 15:26:27 -0700391 << " "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700392 << fieldName
393 << " = new "
Yifan Hong4ed13472016-11-02 10:44:11 -0700394 << initName
Andreas Huber4c865b72016-09-14 15:26:27 -0700395 << ";\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700396}
397
398void ArrayType::emitJavaFieldReaderWriter(
399 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700400 size_t depth,
Andreas Huber709b62d2016-09-19 11:21:18 -0700401 const std::string &parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700402 const std::string &blobName,
403 const std::string &fieldName,
404 const std::string &offset,
405 bool isReader) const {
Andreas Huber90e8fc22016-09-21 16:36:15 -0700406 out << "{\n";
407 out.indent();
408
Andreas Huber709b62d2016-09-19 11:21:18 -0700409 std::string offsetName = "_hidl_array_offset_" + std::to_string(depth);
410 out << "long " << offsetName << " = " << offset << ";\n";
Andreas Huber4c865b72016-09-14 15:26:27 -0700411
Andreas Huber709b62d2016-09-19 11:21:18 -0700412 std::string indexString;
413 for (size_t dim = 0; dim < mSizes.size(); ++dim) {
414 std::string iteratorName =
415 "_hidl_index_" + std::to_string(depth) + "_" + std::to_string(dim);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700416
Andreas Huber709b62d2016-09-19 11:21:18 -0700417 out << "for (int "
418 << iteratorName
419 << " = 0; "
420 << iteratorName
421 << " < "
Yifan Hong5706a432016-11-02 09:44:18 -0700422 << mSizes[dim]->javaValue()
Andreas Huber709b62d2016-09-19 11:21:18 -0700423 << "; ++"
424 << iteratorName
425 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700426
Andreas Huber709b62d2016-09-19 11:21:18 -0700427 out.indent();
428
429 indexString += "[" + iteratorName + "]";
430 }
431
432 if (isReader && mElementType->isCompoundType()) {
Andreas Huber709b62d2016-09-19 11:21:18 -0700433 std::string typeName =
Yifan Hong4ed13472016-11-02 10:44:11 -0700434 mElementType->getJavaType(false /* forInitializer */);
Andreas Huber709b62d2016-09-19 11:21:18 -0700435
436 out << fieldName
437 << indexString
438 << " = new "
439 << typeName
440 << "();\n";
441 }
Andreas Huber85eabdb2016-08-25 11:24:49 -0700442
443 mElementType->emitJavaFieldReaderWriter(
444 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700445 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700446 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700447 blobName,
Andreas Huber709b62d2016-09-19 11:21:18 -0700448 fieldName + indexString,
449 offsetName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700450 isReader);
451
Andreas Huber709b62d2016-09-19 11:21:18 -0700452 size_t elementAlign, elementSize;
453 mElementType->getAlignmentAndSize(&elementAlign, &elementSize);
454
455 out << offsetName << " += " << std::to_string(elementSize) << ";\n";
456
457 for (size_t dim = 0; dim < mSizes.size(); ++dim) {
458 out.unindent();
459 out << "}\n";
460 }
Andreas Huber90e8fc22016-09-21 16:36:15 -0700461
462 out.unindent();
463 out << "}\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700464}
465
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700466status_t ArrayType::emitVtsTypeDeclarations(Formatter &out) const {
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -0700467 out << "type: " << getVtsType() << "\n";
468 out << "vector_value: {\n";
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700469 out.indent();
Yifan Hong5706a432016-11-02 09:44:18 -0700470 out << "vector_size: " << mSizes[0]->value() << "\n";
Zhuoyao Zhangeb355ee2016-10-20 16:00:40 -0700471 // Simple array case.
472 if (mSizes.size() == 1) {
473 status_t err = mElementType->emitVtsTypeDeclarations(out);
474 if (err != OK) {
475 return err;
476 }
477 } else { // Multi-dimension array case.
478 for (size_t index = 1; index < mSizes.size(); index++) {
479 out << "type: " << getVtsType() << "\n";
480 out << "vector_value: {\n";
481 out.indent();
Yifan Hong5706a432016-11-02 09:44:18 -0700482 out << "vector_size: " << mSizes[index]->value() << "\n";
Zhuoyao Zhangeb355ee2016-10-20 16:00:40 -0700483 if (index == mSizes.size() - 1) {
484 status_t err = mElementType->emitVtsTypeDeclarations(out);
485 if (err != OK) {
486 return err;
487 }
488 }
489 }
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700490 }
Zhuoyao Zhangeb355ee2016-10-20 16:00:40 -0700491 for (size_t index = 0; index < mSizes.size(); index++) {
492 out.unindent();
493 out << "}\n";
494 }
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700495 return OK;
496}
497
Andreas Huber70a59e12016-08-16 12:57:01 -0700498bool ArrayType::isJavaCompatible() const {
499 return mElementType->isJavaCompatible();
500}
501
Andreas Huber85eabdb2016-08-25 11:24:49 -0700502void ArrayType::getAlignmentAndSize(size_t *align, size_t *size) const {
503 mElementType->getAlignmentAndSize(align, size);
504
Andreas Huber709b62d2016-09-19 11:21:18 -0700505 for (auto sizeInDimension : mSizes) {
Yifan Hong5706a432016-11-02 09:44:18 -0700506 (*size) *= sizeInDimension->castSizeT();
Andreas Huber709b62d2016-09-19 11:21:18 -0700507 }
Andreas Huber85eabdb2016-08-25 11:24:49 -0700508}
509
Yifan Hongbf459bc2016-08-23 16:50:37 -0700510size_t ArrayType::dimension() const {
511 size_t numArrayElements = 1;
512 for (auto size : mSizes) {
Yifan Hong5706a432016-11-02 09:44:18 -0700513 numArrayElements *= size->castSizeT();
Yifan Hongbf459bc2016-08-23 16:50:37 -0700514 }
515 return numArrayElements;
516}
517
Andreas Huberc9410c72016-07-28 12:18:40 -0700518} // namespace android
519