Home | History | Annotate | Download | only in oo
      1 /*
      2  * Copyright (C) 2008 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 /*
     17  * Array handling.
     18  */
     19 #ifndef DALVIK_OO_ARRAY_H_
     20 #define DALVIK_OO_ARRAY_H_
     21 
     22 /*
     23  * Find a matching array class.  If it doesn't exist, create it.
     24  *
     25  * "descriptor" looks like "[I".
     26  *
     27  * "loader" should be the defining class loader for the elements held
     28  * in the array.
     29  */
     30 ClassObject* dvmFindArrayClass(const char* descriptor, Object* loader);
     31 
     32 /*
     33  * Find the array class for the specified class.  If "elemClassObj" is the
     34  * class "Foo", this returns the class object for "[Foo".
     35  */
     36 ClassObject* dvmFindArrayClassForElement(ClassObject* elemClassObj);
     37 
     38 /*
     39  * Create a new array, given an array class.  The class may represent an
     40  * array of references or primitives.
     41  *
     42  * Returns NULL with an exception raised if allocation fails.
     43  */
     44 extern "C" ArrayObject* dvmAllocArrayByClass(ClassObject* arrayClass,
     45     size_t length, int allocFlags);
     46 
     47 /*
     48  * Allocate an array whose members are primitives (bools, ints, etc.).
     49  *
     50  * "type" should be 'I', 'J', 'Z', etc.
     51  *
     52  * The new object will be added to the "tracked alloc" table.
     53  *
     54  * Returns NULL with an exception raised if allocation fails.
     55  */
     56 ArrayObject* dvmAllocPrimitiveArray(char type, size_t length, int allocFlags);
     57 
     58 /*
     59  * Allocate an array with multiple dimensions.  Elements may be Objects or
     60  * primitive types.
     61  *
     62  * The base object will be added to the "tracked alloc" table.
     63  *
     64  * Returns NULL with an exception raised if allocation fails.
     65  */
     66 ArrayObject* dvmAllocMultiArray(ClassObject* arrayClass, int curDim,
     67     const int* dimensions);
     68 
     69 /*
     70  * Verify that the object is actually an array.
     71  *
     72  * Does not verify that the object is actually a non-NULL object.
     73  */
     74 INLINE bool dvmIsArray(const ArrayObject* arrayObj)
     75 {
     76     return ( ((Object*)arrayObj)->clazz->descriptor[0] == '[' );
     77 }
     78 
     79 /*
     80  * Verify that the array is an object array and not a primitive array.
     81  *
     82  * Does not verify that the object is actually a non-NULL object.
     83  */
     84 INLINE bool dvmIsObjectArrayClass(const ClassObject* clazz)
     85 {
     86     const char* descriptor = clazz->descriptor;
     87     return descriptor[0] == '[' && (descriptor[1] == 'L' ||
     88                                     descriptor[1] == '[');
     89 }
     90 
     91 /*
     92  * Verify that the array is an object array and not a primitive array.
     93  *
     94  * Does not verify that the object is actually a non-NULL object.
     95  */
     96 INLINE bool dvmIsObjectArray(const ArrayObject* arrayObj)
     97 {
     98     return dvmIsObjectArrayClass(arrayObj->clazz);
     99 }
    100 
    101 /*
    102  * Verify that the class is an array class.
    103  *
    104  * TODO: there may be some performance advantage to setting a flag in
    105  * the accessFlags field instead of chasing into the name string.
    106  */
    107 INLINE bool dvmIsArrayClass(const ClassObject* clazz)
    108 {
    109     return (clazz->descriptor[0] == '[');
    110 }
    111 
    112 /*
    113  * Copy the entire contents of one array of objects to another.  If the copy
    114  * is impossible because of a type clash, we fail and return "false".
    115  *
    116  * "dstElemClass" is the type of element that "dstArray" holds.
    117  */
    118 bool dvmCopyObjectArray(ArrayObject* dstArray, const ArrayObject* srcArray,
    119     ClassObject* dstElemClass);
    120 
    121 /*
    122  * Copy the entire contents of an array of boxed primitives into an
    123  * array of primitives.  The boxed value must fit in the primitive (i.e.
    124  * narrowing conversions are not allowed).
    125  */
    126 bool dvmUnboxObjectArray(ArrayObject* dstArray, const ArrayObject* srcArray,
    127     ClassObject* dstElemClass);
    128 
    129 /*
    130  * Returns the size of the given array object in bytes.
    131  */
    132 size_t dvmArrayObjectSize(const ArrayObject *array);
    133 
    134 /*
    135  * Returns the width, in bytes, required by elements in instances of
    136  * the array class.
    137  */
    138 size_t dvmArrayClassElementWidth(const ClassObject* clazz);
    139 
    140 #endif  // DALVIK_OO_ARRAY_H_
    141