[vmkit-commits] [PATCH] Impl JVM_NewArray

Will Dietz wdietz2 at illinois.edu
Mon Nov 7 12:28:43 PST 2011


Inlined below.

~Will

>From 32f5d8efb6c9908c9bb36cdee3facfc3c91a7bf4 Mon Sep 17 00:00:00 2001
From: Will Dietz <w at wdtz.org>
Date: Sat, 5 Nov 2011 14:55:48 -0500
Subject: [PATCH 3/3] Impl JVM_NewArray.

---
 lib/J3/ClassLib/OpenJDK/OpenJDK.inc |   49 ++++++++++++++++++++++++++++++++++-
 1 files changed, 48 insertions(+), 1 deletions(-)

diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
index b86b56f..6342cfe 100644
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
@@ -830,7 +830,54 @@ JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject
arr, jint index, jvalue v,

 JNIEXPORT jobject JNICALL
 JVM_NewArray(JNIEnv *env, jclass eltClass, jint length) {
-  NYI();
+  ArrayObject * res = 0;
+  llvm_gcroot(res, 0);
+
+  BEGIN_JNI_EXCEPTION
+
+  Jnjvm* vm = th->getJVM();
+  if (length < 0) vm->negativeArraySizeException(length);
+
+  JavaObject * 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 = (ArrayObject*)array->doNew(length, vm);
+  } else {
+    UserClassArray* array = loader->constructArray(arrayName, base);
+    res = (ArrayObject*)array->doNew(length, vm);
+  }
+
+  jobject ret = (jobject)th->pushJNIRef(res);
+  RETURN_FROM_JNI(ret);
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }

 JNIEXPORT jobject JNICALL
-- 
1.7.5.1



More information about the vmkit-commits mailing list