VM.assert(!type.asArray().getElementType().isAddressType());
VM._assert(!type.asArray().getElementType().isAddressType());
    allocateArray (int numElements, int size, Object[] tib) throws OutOfMemoryError {	Object result;	long startTime;	int allocType = 0;	VM_Address    objaddr;	boolean mustGC = gc_collect_now;	if (TIME_ALLOCATES) startTime = VM_Time.cycles();	if (mustGC)	    gc1();	if (GC_COUNT_ALLOC) { allocCount++; allocBytes += size; }	// note: array blocks need not be a word multiple,	// so we need to round up size to preserve alignment for future allocations	size = (size + 3) & ~3; // round up request to word multiple	if (size <= GC_MAX_SMALL_SIZE) {	    VM_Processor st = VM_Processor.getCurrentProcessor();	    VM_SizeControl  the_size   = st.GC_INDEX_ARRAY[size];	    if (!the_size.next_slot.isZero()) {  // fastest path		if (GC_COUNT_ALLOC) fastAllocCount++;		objaddr = the_size.next_slot;		if (DebugLink) checkAllocation(objaddr, the_size);		the_size.next_slot = VM_Magic.getMemoryAddress(objaddr);		if (DEBUG_NEXT_SLOT) checkNextAllocation(objaddr, the_size);		VM_Magic.setMemoryWord(objaddr, 0);		result = createArray(objaddr, tib, numElements, size, the_size);	    }	    else {		result = allocateArray1(the_size, tib, numElements, size, the_size.ndx);		allocType = 1;	    }	}	else {	    result = allocateArray1L(numElements, size, tib);	    allocType = 2;	}	if (TIME_ALLOCATES) {	    long pauseTime = VM_Time.cycles() - startTime;	    allocTimeTotal += pauseTime;	    VM_Thread t = VM_Thread.getCurrentThread();	    final boolean isUser = ! (t.isGCThread || t.isIdleThread);	    if (isUser) {		if (pauseTime > allocTimeMax && allocType != 2) allocTimeMax = pauseTime;		if (allocType == 2 && pauseTime > allocLargeTimeMax) allocLargeTimeMax = pauseTime;		if (pauseTime > TIME_ALLOCATE_QUICK) {		    if (allocType != 2) allocSlowCount++; else allocLargeSlowCount++; 		}	    }	    if (PRINT_SLOW_ALLOCATES && pauseTime > TIME_ALLOCATE_QUICK) {		print(")))) Slow allocateArray");		if (allocType == 1) 		    print("1");		else if (allocType == 2)		    print("1L");		if (mustGC)		    print("[gc1]");		print(" of ", size);		print(" bytes: ", (int) (pauseTime/TicksPerMicrosecond));		println(" usec");		if (! isUser) print("  [GC ALLOC]");		println();	    }	}	if (VM.VerifyAssertions) {	    VM_Type type = VM_Magic.getObjectType(result);	    VM.assert(!type.asArray().getElementType().isAddressType());	}	return result;    }    static Object    allocateArray1 (VM_SizeControl the_size, Object[] tib, int numElements,			int size, int ndx)    {	for (int i = 0; i < 3; i++) {	    VM_Address objaddr = allocatey(the_size, tib, numElements, size, ndx);	    if (!objaddr.isZero()) 		return VM_Magic.addressAsObject(objaddr);	    VM.sysWrite("GCing for array of size "); VM.sysWrite(GC_SIZEVALUES[ndx], false);  VM.sysWrite("\n");	    collectGarbageOrAwaitCompletion("allocateArray1");	    // try fast path again	    // if (the_size.next_slot != 0) {	    //   return VM_Magic.addressAsObject(makeArray(tib, numElements, size, the_size));	    // }	}	// failure	VM_Scheduler.trace("VM_Allocator::allocateArray1",			   "couldn't collect enough to fill a request (bytes) for ", size);	VM_Scheduler.traceback("VM_Allocator::allocateArray1");	return null;    }