Originally, non-moving arrays were allocated with dvmAllocObjectArray.
However, dvmAllocObjectArray does not respect the width of the user
supplied element class and substitutes a hard coded value of 4 bytes.
This change replaces dvmAllocObjectArray with dvmAllocArrayByClass.
dvmAllocArrayByClass consults the element class for its width when
computing the storage size for the array being allocated.
Bug:
4309030
{
ClassObject* elementClass = (ClassObject*) args[1];
int length = args[2];
- ArrayObject* newArray;
if (elementClass == NULL) {
dvmThrowException("Ljava/lang/NullPointerException;", NULL);
// TODO: right now, we don't have a copying collector, so there's no need
// to do anything special here, but we ought to pass the non-movability
// through to the allocator.
- newArray = dvmAllocObjectArray(elementClass, length, ALLOC_DEFAULT);
+ ClassObject* arrayClass = dvmFindArrayClassForElement(elementClass);
+ ArrayObject* newArray = dvmAllocArrayByClass(arrayClass,
+ length,
+ ALLOC_DEFAULT);
if (newArray == NULL) {
assert(dvmCheckException(dvmThreadSelf()));
RETURN_VOID();