Hi Will,<br><br><div class="gmail_quote">On Wed, Nov 30, 2011 at 11:12 PM, Will Dietz <span dir="ltr"><<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Author: wdietz2<br>
Date: Wed Nov 30 16:12:56 2011<br>
New Revision: 145527<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=145527&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=145527&view=rev</a><br>
Log:<br>
ArrayCopy: handle overlapping arrays of Objects<br>
<br>
Modified:<br>
vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc<br>
<br>
Modified: vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc?rev=145527&r1=145526&r2=145527&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc?rev=145527&r1=145526&r2=145527&view=diff</a><br>
==============================================================================<br>
--- vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc (original)<br>
+++ vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc Wed Nov 30 16:12:56 2011<br>
@@ -62,17 +62,30 @@<br>
}<br>
<br>
if (!(dstType->isPrimitive())) {<br>
+ // Scan to ensure element compatibility, recording the first item<br>
+ // that requires an exception be thrown.<br>
+ int badEl = -1;<br>
for (int i = 0; i < len; i++) {<br>
cur = ArrayObject::getElement((ArrayObject*)src, i + sstart);<br>
if (cur) {<br>
if (!(JavaObject::getClass(cur)->isAssignableFrom(dstType))) {<br>
- th->throwException(vm->CreateArrayStoreException(<br>
- (JavaVirtualTable*)dst->getVirtualTable()));<br>
- UNREACHABLE();<br>
+ badEl = i;<br>
+ break;<br>
}<br>
}<br>
- ArrayObject::setElement((ArrayObject*)dst, cur, i + dstart);<br>
}<br>
+<br>
+ // Copy over the non-conflicting elements, handling overlaps<br>
+ void* ptrDst = (void*)((int64_t)ArrayObject::getElements((ArrayObject*)dst) + dstart*sizeof(void*));<br>
+ void* ptrSrc = (void*)((int64_t)ArrayObject::getElements((ArrayObject*)src) + sstart*sizeof(void*));<br>
+ int copyLen = badEl == -1 ? len : badEl - 1;<br>
+ if (copyLen > 0)<br>
+ memmove(ptrDst, ptrSrc, copyLen * sizeof(void*));<br></blockquote><div><br></div><div>Please do not do a memmove on ArrayObject. It is fine to do a memmove on primitive arrays, but definitely not on arrays of objects. You need to execute a write barrier for each copied element.</div>
<div><br></div><div>To fix overlaps, I guess you need to check the start indices for both arrays, and see which one starts first to know in which side you need to iterate (from end to start or from start to end).</div><div>
<br></div><div>Nicolas</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
+<br>
+ // TODO: Record the conflicting types in the exception message?<br>
+ if (badEl != -1)<br>
+ vm->arrayStoreException();<br>
+<br>
} else {<br>
uint32 logSize = dstType->asPrimitiveClass()->logSize;<br>
void* ptrDst = (void*)((int64_t)JavaArray::getElements(dst) + (dstart << logSize));<br>
<br>
<br>
_______________________________________________<br>
vmkit-commits mailing list<br>
<a href="mailto:vmkit-commits@cs.uiuc.edu">vmkit-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits</a><br>
</blockquote></div><br>