1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array handling. 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 19375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_OO_ARRAY_H_ 20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_OO_ARRAY_H_ 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Find a matching array class. If it doesn't exist, create it. 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "descriptor" looks like "[I". 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "loader" should be the defining class loader for the elements held 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in the array. 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectClassObject* dvmFindArrayClass(const char* descriptor, Object* loader); 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Find the array class for the specified class. If "elemClassObj" is the 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * class "Foo", this returns the class object for "[Foo". 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectClassObject* dvmFindArrayClassForElement(ClassObject* elemClassObj); 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a new array, given an array class. The class may represent an 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * array of references or primitives. 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns NULL with an exception raised if allocation fails. 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 44d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" ArrayObject* dvmAllocArrayByClass(ClassObject* arrayClass, 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project size_t length, int allocFlags); 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Allocate an array whose members are primitives (bools, ints, etc.). 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "type" should be 'I', 'J', 'Z', etc. 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The new object will be added to the "tracked alloc" table. 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns NULL with an exception raised if allocation fails. 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmAllocPrimitiveArray(char type, size_t length, int allocFlags); 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Allocate an array with multiple dimensions. Elements may be Objects or 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * primitive types. 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The base object will be added to the "tracked alloc" table. 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns NULL with an exception raised if allocation fails. 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmAllocMultiArray(ClassObject* arrayClass, int curDim, 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const int* dimensions); 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the object is actually an array. 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Does not verify that the object is actually a non-NULL object. 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE bool dvmIsArray(const ArrayObject* arrayObj) 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return ( ((Object*)arrayObj)->clazz->descriptor[0] == '[' ); 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 8030aa99778069baf0dab767f0fc1f5b1d51d110ffCarl Shapiro * Verify that the array is an object array and not a primitive array. 8130aa99778069baf0dab767f0fc1f5b1d51d110ffCarl Shapiro * 8230aa99778069baf0dab767f0fc1f5b1d51d110ffCarl Shapiro * Does not verify that the object is actually a non-NULL object. 8330aa99778069baf0dab767f0fc1f5b1d51d110ffCarl Shapiro */ 8495a884f7844a6e7bdd820489742254f3fd002f6dAndy McFaddenINLINE bool dvmIsObjectArrayClass(const ClassObject* clazz) 8530aa99778069baf0dab767f0fc1f5b1d51d110ffCarl Shapiro{ 8695a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden const char* descriptor = clazz->descriptor; 8730aa99778069baf0dab767f0fc1f5b1d51d110ffCarl Shapiro return descriptor[0] == '[' && (descriptor[1] == 'L' || 8830aa99778069baf0dab767f0fc1f5b1d51d110ffCarl Shapiro descriptor[1] == '['); 8930aa99778069baf0dab767f0fc1f5b1d51d110ffCarl Shapiro} 9030aa99778069baf0dab767f0fc1f5b1d51d110ffCarl Shapiro 9130aa99778069baf0dab767f0fc1f5b1d51d110ffCarl Shapiro/* 9295a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden * Verify that the array is an object array and not a primitive array. 9395a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden * 9495a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden * Does not verify that the object is actually a non-NULL object. 9595a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden */ 9695a884f7844a6e7bdd820489742254f3fd002f6dAndy McFaddenINLINE bool dvmIsObjectArray(const ArrayObject* arrayObj) 9795a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden{ 98a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88Carl Shapiro return dvmIsObjectArrayClass(arrayObj->clazz); 9995a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden} 10095a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden 10195a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden/* 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that the class is an array class. 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: there may be some performance advantage to setting a flag in 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the accessFlags field instead of chasing into the name string. 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE bool dvmIsArrayClass(const ClassObject* clazz) 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (clazz->descriptor[0] == '['); 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copy the entire contents of one array of objects to another. If the copy 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is impossible because of a type clash, we fail and return "false". 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "dstElemClass" is the type of element that "dstArray" holds. 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmCopyObjectArray(ArrayObject* dstArray, const ArrayObject* srcArray, 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* dstElemClass); 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1214bc10cc26f856f2447bb23316e6729bcd20c2bf4Andy McFadden/* 1224bc10cc26f856f2447bb23316e6729bcd20c2bf4Andy McFadden * Copy the entire contents of an array of boxed primitives into an 1234bc10cc26f856f2447bb23316e6729bcd20c2bf4Andy McFadden * array of primitives. The boxed value must fit in the primitive (i.e. 1244bc10cc26f856f2447bb23316e6729bcd20c2bf4Andy McFadden * narrowing conversions are not allowed). 1254bc10cc26f856f2447bb23316e6729bcd20c2bf4Andy McFadden */ 1264bc10cc26f856f2447bb23316e6729bcd20c2bf4Andy McFaddenbool dvmUnboxObjectArray(ArrayObject* dstArray, const ArrayObject* srcArray, 1274bc10cc26f856f2447bb23316e6729bcd20c2bf4Andy McFadden ClassObject* dstElemClass); 1284bc10cc26f856f2447bb23316e6729bcd20c2bf4Andy McFadden 129bfe4dcc3bd3d4d85a07fd3d63da537b51342b6ebCarl Shapiro/* 130bfe4dcc3bd3d4d85a07fd3d63da537b51342b6ebCarl Shapiro * Returns the size of the given array object in bytes. 131bfe4dcc3bd3d4d85a07fd3d63da537b51342b6ebCarl Shapiro */ 132bfe4dcc3bd3d4d85a07fd3d63da537b51342b6ebCarl Shapirosize_t dvmArrayObjectSize(const ArrayObject *array); 1331e714bbd8230ac6fb9e3a8e9e25bca687132c82aCarl Shapiro 13495a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden/* 13595a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden * Returns the width, in bytes, required by elements in instances of 13695a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden * the array class. 13795a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden */ 13895a884f7844a6e7bdd820489742254f3fd002f6dAndy McFaddensize_t dvmArrayClassElementWidth(const ClassObject* clazz); 13995a884f7844a6e7bdd820489742254f3fd002f6dAndy McFadden 140375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif // DALVIK_OO_ARRAY_H_ 141