[vmkit-commits] [PATCH] Impl JVM_NewArray
Nicolas Geoffray
nicolas.geoffray at gmail.com
Tue Nov 8 12:56:02 PST 2011
Looks good, with two comments.
On Mon, Nov 7, 2011 at 9:28 PM, Will Dietz <wdietz2 at illinois.edu> wrote:
> 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;
>
Add eltClassObj as gc_root at the top of the method.
> + 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);
>
'res' should be typed JavaObject. A primitive array is not a ArrayObject.
> + } 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
> _______________________________________________
> vmkit-commits mailing list
> vmkit-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/vmkit-commits/attachments/20111108/a92e56b1/attachment.html>
More information about the vmkit-commits
mailing list