[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