[vmkit-commits] [vmkit] r145527 - /vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc
Will Dietz
wdietz2 at illinois.edu
Wed Nov 30 14:12:56 PST 2011
Author: wdietz2
Date: Wed Nov 30 16:12:56 2011
New Revision: 145527
URL: http://llvm.org/viewvc/llvm-project?rev=145527&view=rev
Log:
ArrayCopy: handle overlapping arrays of Objects
Modified:
vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc
Modified: vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc?rev=145527&r1=145526&r2=145527&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc Wed Nov 30 16:12:56 2011
@@ -62,17 +62,30 @@
}
if (!(dstType->isPrimitive())) {
+ // Scan to ensure element compatibility, recording the first item
+ // that requires an exception be thrown.
+ int badEl = -1;
for (int i = 0; i < len; i++) {
cur = ArrayObject::getElement((ArrayObject*)src, i + sstart);
if (cur) {
if (!(JavaObject::getClass(cur)->isAssignableFrom(dstType))) {
- th->throwException(vm->CreateArrayStoreException(
- (JavaVirtualTable*)dst->getVirtualTable()));
- UNREACHABLE();
+ badEl = i;
+ break;
}
}
- ArrayObject::setElement((ArrayObject*)dst, cur, i + dstart);
}
+
+ // Copy over the non-conflicting elements, handling overlaps
+ void* ptrDst = (void*)((int64_t)ArrayObject::getElements((ArrayObject*)dst) + dstart*sizeof(void*));
+ void* ptrSrc = (void*)((int64_t)ArrayObject::getElements((ArrayObject*)src) + sstart*sizeof(void*));
+ int copyLen = badEl == -1 ? len : badEl - 1;
+ if (copyLen > 0)
+ memmove(ptrDst, ptrSrc, copyLen * sizeof(void*));
+
+ // TODO: Record the conflicting types in the exception message?
+ if (badEl != -1)
+ vm->arrayStoreException();
+
} else {
uint32 logSize = dstType->asPrimitiveClass()->logSize;
void* ptrDst = (void*)((int64_t)JavaArray::getElements(dst) + (dstart << logSize));
More information about the vmkit-commits
mailing list