[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