[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