[vmkit-commits] [vmkit] r145391 - /vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
Will Dietz
wdietz2 at illinois.edu
Mon Nov 28 23:52:08 PST 2011
Author: wdietz2
Date: Tue Nov 29 01:52:07 2011
New Revision: 145391
URL: http://llvm.org/viewvc/llvm-project?rev=145391&view=rev
Log:
Robustify JVM_SetArrayElement and JVM_NewMultiArray (OpenJDK)
Passes mauve's reflect/Array tests.
Modified:
vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc?rev=145391&r1=145390&r2=145391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Tue Nov 29 01:52:07 2011
@@ -958,8 +958,25 @@
llvm_gcroot(element, 0);
BEGIN_JNI_EXCEPTION
+ verifyNull(arr);
array = *(ArrayObject**)arr;
- element = *(JavaObject**)val;
+ element = val ? *(JavaObject**)val : NULL;
+
+ Jnjvm* vm = th->getJVM();
+
+ // Verify this is, in fact, an array
+ UserCommonClass * cl = JavaObject::getClass(array);
+ if (!cl || !cl->isArray())
+ vm->illegalArgumentException("Invalid object, expected array");
+
+ // Bounds check
+ if (index < 0 || index >= ArrayObject::getSize(array))
+ vm->indexOutOfBounds(array, index);
+
+ // Check the object is of the correct type
+ UserCommonClass * base = cl->asArrayClass()->baseClass();
+ if (element && !JavaObject::instanceOf(element, base))
+ vm->illegalArgumentException("Wrong object for array type");
ArrayObject::setElement(array, element, index);
@@ -1043,12 +1060,12 @@
Jnjvm* vm = th->getJVM();
+ verifyNull(eltClass);
+ verifyNull(_dim);
+
eltClassObj = *(JavaObjectClass**)eltClass;
dim = *(ArraySInt32**)_dim;
- verifyNull(eltClassObj);
- verifyNull(dim);
-
int dim_len = ArraySInt32::getSize(dim);
if(dim_len <= 0 || dim_len > 255) {
vm->illegalArgumentException("Too many dimensions for array");
More information about the vmkit-commits
mailing list