[vmkit-commits] [vmkit] r144193 - /vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc

Will Dietz wdietz2 at illinois.edu
Wed Nov 9 10:16:11 PST 2011


Author: wdietz2
Date: Wed Nov  9 12:16:11 2011
New Revision: 144193

URL: http://llvm.org/viewvc/llvm-project?rev=144193&view=rev
Log:
Impl JVM_NewArray.

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=144193&r1=144192&r2=144193&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc Wed Nov  9 12:16:11 2011
@@ -828,7 +828,56 @@
 
 JNIEXPORT jobject JNICALL
 JVM_NewArray(JNIEnv *env, jclass eltClass, jint length) {
-  NYI();
+  JavaObject* res = 0;
+  JavaObject* eltClassObj = 0;
+  llvm_gcroot(res, 0);
+  llvm_gcroot(eltClassObj, 0);
+
+  BEGIN_JNI_EXCEPTION
+
+  Jnjvm* vm = th->getJVM();
+  if (length < 0) vm->negativeArraySizeException(length);
+
+  eltClassObj = *(JavaObject**)eltClass;
+  UserCommonClass* base =
+    UserCommonClass::resolvedImplClass(vm, eltClassObj, true);
+  JnjvmClassLoader* loader = base->classLoader;
+  const UTF8* name = base->getName();
+  const UTF8* arrayName = loader->constructArrayName(1, name);
+  if (base->isPrimitive()) {
+    UserClassArray *array = 0;
+    if (base == vm->upcalls->OfBool) {
+      array = vm->upcalls->ArrayOfBool;
+    } else if (base == vm->upcalls->OfByte) {
+      array = vm->upcalls->ArrayOfByte;
+    } else if (base == vm->upcalls->OfShort) {
+      array = vm->upcalls->ArrayOfShort;
+    } else if (base == vm->upcalls->OfChar) {
+      array = vm->upcalls->ArrayOfChar;
+    } else if (base == vm->upcalls->OfInt) {
+      array = vm->upcalls->ArrayOfInt;
+    } else if (base == vm->upcalls->OfFloat) {
+      array = vm->upcalls->ArrayOfFloat;
+    } else if (base == vm->upcalls->OfLong) {
+      array = vm->upcalls->ArrayOfLong;
+    } else if (base == vm->upcalls->OfDouble) {
+      array = vm->upcalls->ArrayOfDouble;
+    } else {
+      vm->illegalArgumentException("Invalid array primitive type!");
+      abort();
+    }
+    res = (JavaObject*)array->doNew(length, vm);
+  } else {
+    UserClassArray* array = loader->constructArray(arrayName, base);
+    res = (JavaObject*)array->doNew(length, vm);
+  }
+
+  jobject ret = (jobject)th->pushJNIRef(res);
+  RETURN_FROM_JNI(ret);
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }
 
 JNIEXPORT jobject JNICALL





More information about the vmkit-commits mailing list