[vmkit-commits] [vmkit] r145279 - /vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
Will Dietz
wdietz2 at illinois.edu
Mon Nov 28 13:16:06 PST 2011
Author: wdietz2
Date: Mon Nov 28 15:16:05 2011
New Revision: 145279
URL: http://llvm.org/viewvc/llvm-project?rev=145279&view=rev
Log:
Implement JVM_NewMultiArray
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=145279&r1=145278&r2=145279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Mon Nov 28 15:16:05 2011
@@ -935,9 +935,89 @@
return 0;
}
+extern JavaObject* multiCallNewIntern(UserClassArray* cl, uint32 len,
+ sint32* dims, Jnjvm* vm);
JNIEXPORT jobject JNICALL
-JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim) {
- NYI();
+JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray _dim) {
+ ArraySInt32* dim = 0;
+ JavaObjectClass * eltClassObj = 0;
+ JavaObject* array = 0;
+
+ llvm_gcroot(dim, 0);
+ llvm_gcroot(eltClassObj, 0);
+ llvm_gcroot(array, 0);
+
+ BEGIN_JNI_EXCEPTION
+
+ Jnjvm* vm = th->getJVM();
+
+ 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");
+ UNREACHABLE();
+ }
+
+ UserCommonClass* base = JavaObjectClass::getClass(eltClassObj);
+ JnjvmClassLoader* loader = base->classLoader;
+
+ // Build array name
+ vmkit::ThreadAllocator allocator;
+ const UTF8* arrayName;
+ if (base->isPrimitive()) {
+ char baseChar;
+ if (base == vm->upcalls->OfBool) {
+ baseChar = I_BOOL;
+ } else if (base == vm->upcalls->OfByte) {
+ baseChar = I_BYTE;
+ } else if (base == vm->upcalls->OfShort) {
+ baseChar = I_SHORT;
+ } else if (base == vm->upcalls->OfChar) {
+ baseChar = I_CHAR;
+ } else if (base == vm->upcalls->OfInt) {
+ baseChar = I_INT;
+ } else if (base == vm->upcalls->OfFloat) {
+ baseChar = I_FLOAT;
+ } else if (base == vm->upcalls->OfLong) {
+ baseChar = I_LONG;
+ } else if (base == vm->upcalls->OfDouble) {
+ baseChar = I_DOUBLE;
+ } else {
+ vm->illegalArgumentException("Invalid array primitive type!");
+ UNREACHABLE();
+ }
+ char* buf = (char*)allocator.Allocate(dim_len+2);
+ for(unsigned i = 0; i < dim_len; ++i) buf[i] = I_TAB;
+ buf[dim_len] = baseChar;
+ buf[dim_len+1] = '\0';
+ arrayName = loader->asciizConstructUTF8(buf);
+ }
+ else {
+ const UTF8* baseName = base->getName();
+ arrayName = loader->constructArrayName(dim_len, baseName);
+ }
+
+ // Get class corresponding to array name
+ UserClassArray* arrayCl =
+ (UserClassArray*)loader->loadClassFromUserUTF8(arrayName, true, false, NULL);
+
+ // Convert dimensions array to internal representation
+ sint32* dims = (sint32*)allocator.Allocate(sizeof(sint32) * dim_len);
+ for (sint32 i = 0; i < dim_len; ++i){
+ dims[i] = ArraySInt32::getElement(dim, i);
+ }
+
+ // Invoke recursive helper to create this array
+ array = multiCallNewIntern(arrayCl, dim_len, dims, vm);
+
+ RETURN_FROM_JNI((jobject)th->pushJNIRef(array));
+
+ END_JNI_EXCEPTION
}
/*
More information about the vmkit-commits
mailing list